- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我一直在谷歌搜索这个问题,但找不到清晰明确的文档。
假设我有一个 UTC 时间和一个时区 ID,我如何在 Java 中计算挂钟时间(= UTC 时间 + 时区偏移量 + 夏令时),知道一年中夏令时的变化?
我正在寻找经过测试的代码示例。谢谢。
最佳答案
当你说你在 UTC 中有时间时,我假设你在 Calendar
中保存它(Date
没有时区的概念,尽管有误导性的 toString( )
)。如果你有时间在 String
中,您可以轻松地解析它或像这里这样的日历实例:
Calendar summer = new GregorianCalendar(DateUtils.UTC_TIME_ZONE);
summer.set(2011, Calendar.JUNE, 27, 9, 0, 0);
summer
表示 2011 年 6 月 27 日上午 9:00 UTC。现在您需要做的就是将时区从 UTC 更改为澳大利亚墨尔本:
summer.setTimeZone(TimeZone.getTimeZone("Australia/Melbourne"));
我将使用 FastDateFormat
正确打印日期:
final FastDateFormat formatter = FastDateFormat.getDateTimeInstance(FastDateFormat.SHORT, FastDateFormat.SHORT);
System.out.println(formatter.format(summer));
墨尔本时间是19:00(+10 小时)。但是将日期更改为冬天:
Calendar winter = new GregorianCalendar(DateUtils.UTC_TIME_ZONE);
winter.set(2011, Calendar.DECEMBER, 27, 9, 0, 0);
System.out.println(formatter.format(winter));
墨尔本的时间突然变成了 20:00(+11 小时)。
差异证明更改 Calendar
上的时区会考虑 DST。在 UTC 时区的 6 月,澳大利亚处于冬季,因此他们不遵守 DST。
但是在 UTC 的冬天,澳大利亚是夏天 - 他们通过将时钟移动一小时来切换到 DST。这就是为什么冬季时差为 +11 小时,而夏季 UTC 时为 +10 小时的原因。
但是等等!当考虑多个时区观察 DST 时,它会变得更加有趣。首先,我在欧洲/奥斯陆时区创建相同的日期:
Calendar winter = new GregorianCalendar(TimeZone.getTimeZone("Europe/Oslo"));
winter.set(2011, Calendar.DECEMBER, 27, 9, 0, 0);
冬天奥斯陆的 9:00 是世界标准时间 8:00,而墨尔本是 19:00(+10 小时)。
但是在夏天的同一时间:
Calendar summer = new GregorianCalendar(TimeZone.getTimeZone("Europe/Oslo"));
summer.set(2011, Calendar.JUNE, 27, 9, 0, 0);
墨尔本实际上是世界标准时间 7:00 和 17:00! +8 小时!
不知何故,人们假设两个时区之间的差异总是恒定的(“奥斯陆和墨尔本之间的差异总是 10 小时)——这不是 是的,尤其是当考虑到不同的半球时。
现实中的冬季 Oslo (无 DST,UTC+1)在 Melbourne 中观察到 DST (UTC+11)。另一方面,虽然奥斯陆有夏季并且观察到夏令时 (UTC+2),但在墨尔本 (UTC+10) 却没有观察到。现在很明显为什么差异在 8 到 10 小时之间变化取决于一年中的哪一天。
另请记住,DST 的第一天和最后一天不是全局性的,而是为每个时区任意选择的。这意味着 9 小时的差异也是可能的(!)查看今年 4 月 1 日。
关于java - 如何从 UTC 时间 + TimeZone ID 计算挂钟时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8286163/
我需要以 [+/-]hh:mm 格式保存手机的时区 我正在使用 TimeZone 类来处理这个问题,但我能得到的唯一格式如下: PST -05:00 GMT +02:00 我宁愿不对结果进行子串化,是
我正在尝试在 Node js 中使用 moment-timezone 来获取所有可用时区的列表,如下所示 - var moment = require('moment-timezone'); var
我正在使用以下代码将时区 (GMT-3) 转换为设备本地时区。 int hour=17,minute=0,day=12,month=6,year=2014; Calendar cal = new Gr
System.setProperty("user.timezone", "America/Chicago"); TimeZone.setDefault(TimeZone.getTimeZone("美国
我想从字符串初始化DateFormatter().timeZone,但是当我做类似的事情时 let dateFormatter = DateFormatter() dateFormatter.time
我通过存储日期组件字典在我的后端存储用户出生日期。它看起来像这样: { "day": 1, "month": 1, "year": 1970, "timeZone":
我一直在开发一个应用程序,它以下面给出的特定格式从服务器获取日期。 "2015-02-03 00:00:00" 我想使用 NSDateFormatter 以不同的 UI 格式显示它们但是当我更改时区时
我有什么 我有一个来自服务器的日期字符串,它的格式是 w3c 日期格式 2016-02-13T09:53:49.871Z 我的问题 当我将消息发布到服务器时,它显示的是 5 小时前而不是现在 我想要什
我正在将我的项目从 Django 1.8.2 升级到 1.9.7,我收到了这个警告: WARNINGS: my_app.my_model.date_available: (fields.W161) F
在下面的代码中: from datetime import datetime import pytz EDT = pytz.timezone('US/Eastern') d1 = datetime.n
我通过以下方式将服务器(Ubuntu 12.04)的时区更改为UTC: echo 'UTC' > /etc/timezone dpkg-reconfigure --frontend nonintera
我想获取洛杉矶的时区信息,现在10/10/2017是夏令时,但是我通过两种方式获取洛杉矶的时区得到了不同的结果。 public class TimeZoneDemo2 { public stati
我把它放在应用程序 Controller 中: before_filter :set_timezone def set_timezone Time.zone = current_user.time_
是否可以转换java.util.TimeZone字符串 sun.util.calendar.ZoneInfo[id=\"America/Los_Angeles\",offset=-28800000,d
当我写这段代码时: Calendar cal = Calendar.getInstance(); cal.setTimeZone(TimeZone.getTimeZone("EST"));
我正在使用 Java 8, 在我们的代码的前面,我们使用 sdf.setTimeZone(TimeZone.getTimeZone("PDT")); 转换为失败的美国太平洋地区(没有抛出任何错误,但转
我不断收到此警告:timezone of object (UTC) is different than current timezone ().我当前的时区是“EET”,如 Sys.timezone(
我正在我的网站上使用时刻时区转换器进行时区日期转换。默认情况下,我在 IST 中显示日期和时间。我有一个按钮可以转换用户时区中的给定时间。此按钮操作调用 moment js 并进行转换。到这里我没有问
我从服务响应中获得时区偏移量为“-5.00”,我需要在 UI 中将其格式化为 CST。我如何在 JavaScript 中转换它?我搜索了一下,不确定JavaScript中有没有直接的方法。 最佳答案
这个问题在这里已经有了答案: Converting string to datetime object (2 个答案) 关闭 6 年前。 我的主机有 UTC 时区,我正在尝试将 PDT 时间字符串转
我是一名优秀的程序员,十分优秀!