请看看您是否可以告诉我如何处理我的情况下的DST问题。
首先,我的应用是一个物流系统,它是针对全局用户的,所以它涉及时区问题,在设置用户本地预订日期时,我将按如下方式处理:
1.当用户登录应用程序时,我们可以根据登录IP得到用户的时区,但这只是一个偏移量(我不记得这个东西的术语了),例如"GMT+08"(BeiJing)或“GMT-06”(芝加哥)。
2.在用户保存预订之前,我们需要设置预订本地日期,因为我无法获得用户本地日期直接.so我将首先获得服务器日期(在我的情况下,它是BeiJing时间),然后根据服务器日期和用户时区计算本地日期,例如,如果用户时区是“格林尼治标准时间08”,服务器日期是2013-08-29 17:45:00。服务器时区是"GMT+08",那么我将使用服务器日期-8-8,结果将是2013-08-29 01:45:00。但由于我没有考虑DST,所以计算的本地日期将与实际日期不同。例如,现在在旧金山,实际的本地日期将比我用这种方法计算的结果早一个小时。
我发现java TimeZone已经考虑了DST问题,但在构造TimeZone时,我需要提供“位置”名称(例如美国/阿拉斯加,太平洋/阿皮亚)。而在我的例子中,我能得到的只是offset.so,你能告诉我如何修复我的例子中的DST问题吗?
发布于 2014-04-18 13:11:49
是的,您应该在Java8中使用Joda-Time或新的java.time包(灵感来自Joda-Time)。
偏移量是由某个日期-时间值表示的与UTC (GMT)相差的小时-分钟-秒数字。西海岸是-08:00 (忽略Daylight Saving Time的胡言乱语),这意味着比协调世界时晚8小时。
请注意,java.time在其初始版本中有一个小错误,它无法处理没有分钟(如+08:00)的仅小时的偏移量(如+08)。
time zone是对特定区域的人们所使用的偏移量的过去、现在和未来变化的历史记录。
使用适当的time zone names (主要是大陆斜杠城市)。避免使用3或4个字母的代码,例如EST,它们既不标准化也不唯一。
java.util.Date没有时区,而Joda-Time DateTime有。
要获取web浏览器的时区,请参阅this question。但通常情况下,这并不能很好地工作。正如你可能已经看到的,许多网站要求用户选择一个时区。
你的确切用例是令人困惑的。通常,最好的方法是对UTC使用日期-时间值,然后根据需要调整为用户的本地时间。通常最适合您的软件工作,并将日期时间存储为UTC。然后显示一个经过调整以适合用户的本地日期-时间。换句话说,考虑全局(UTC),本地呈现(本地时区调整)。
通常,系统管理员会将其服务器计算机设置为UTC (无时区偏移)。如果您的操作系统(如Mac )不提供协调时,那么使用Reykjavik,因为冰岛全年都使用协调时,没有任何夏令时。同样,数据库引擎几乎总是将日期-时间值转换为UTC进行存储。
当您真正不关心时区或时间时,Joda-Time确实提供了一个LocalDate类。但通常更好的做法是使用日期-时间( DateTime实例),并根据需要设置仅日期字符串的格式。
Joda-Time 2.3中的示例代码。
DateTimeZone timeZoneChina = DateTimeZone.forID( "Asia/Shanghai" );
DateTime dateTimeChina = new DateTime( 2013, 8, 29, 17, 45, 00, timeZoneChina );
DateTime dateTimeUtc = dateTimeChina.withZone( DateTimeZone.UTC );
DateTime dateTimeParis = dateTimeChina.withZone( DateTimeZone.forID( "Europe/Paris" ) );
DateTimeZone timeZoneUsWestCoast = DateTimeZone.forID( "America/Los_Angeles" );
DateTime dateTimeUnitedStatesWestCoast = dateTimeChina.withZone( timeZoneUsWestCoast );
DateTimeFormatter formatter = ISODateTimeFormat.date();
String outputDateOnlyForUnitedStatesWestCoast = formatter.withZone( timeZoneUsWestCoast ).print( dateTimeUtc );转储到控制台…
System.out.println( "dateTimeChina: " + dateTimeChina );
System.out.println( "dateTimeUtc: " + dateTimeUtc );
System.out.println( "dateTimeParis: " + dateTimeParis );
System.out.println( "dateTimeUnitedStatesWestCoast: " + dateTimeUnitedStatesWestCoast );
System.out.println( "outputDateOnlyForUnitedStatesWestCoast: " + outputDateOnlyForUnitedStatesWestCoast );运行…时
dateTimeChina: 2013-08-29T17:45:00.000+08:00
dateTimeUtc: 2013-08-29T09:45:00.000Z
dateTimeParis: 2013-08-29T11:45:00.000+02:00
dateTimeUnitedStatesWestCoast: 2013-08-29T02:45:00.000-07:00
outputDateOnlyForUnitedStatesWestCoast: 2013-08-29java.time
java.time中类似的代码。
以UTC表示的当前时刻。
Instant instant = Instant.now() ; // Capture the current moment as seen in UTC.调整为芝加哥地区的时区,生成一个ZonedDateTime对象。
ZoneId zChicago = ZoneId.of( "America/Chicago" ) ;
ZonedDateTime zdtChicago = instant.atZone( z ) ;调整到中国时区。
ZoneId zShanghai = ZoneId.of( "Asia/Shanghai" ) ;
ZonedDateTime zdtShanghai = zdtChicago.withZoneSameInstant( zChicago ) ;所有三个对象(instant、zdtChicago和zdtShanghai)表示时间轴上的相同时刻和相同时间点。同时,但可以透过不同的挂钟时间看到。
显然,出于某种目的,您只想要日期部分,没有时间,也没有时区。为此,提取一个LocalDate对象。
LocalDate ld = zdtChicago.toLocalDate() ; 当然,这可能是与zdtShanghai.toLocalDate()返回的日期不同的日期。
你可能需要构造一个特定的时刻。
ZonedDateTime zdtShanghai = ZonedDateTime.of( 2013, 8, 29, 17, 45, 0, 0 , zShanghai ) ;位置和时区
你说过:
我需要提供“位置”名称
位置与时区无关。来自魁北克的商人在日本东京实际旅行时,可能希望看到America/Montreal专区的特定时刻表。
您可以向用户的web浏览器或本地JVM询问其当前的默认时区。但最终,如果关键,您必须与用户确认所需/预期的时区。

关于java.time
框架内置于Java8和更高版本中。这些类取代了麻烦的旧legacy日期时间类,如java.util.Date、Calendar和SimpleDateFormat。
要了解更多信息,请参阅。和搜索堆栈溢出,以获得许多示例和解释。规范为JSR 310。
现在在maintenance mode中的项目建议迁移到java.time类。
您可以直接与数据库交换java.time对象。使用与JDBC 4.2或更高版本兼容的JDBC driver。不需要字符串,也不需要java.sql.*类。Hibernate 5和JPA2.2支持java.time。
从哪里获取java.time类?
中的
发布于 2013-08-29 15:45:09
这是头疼的常见原因。
我用以下方法解决了类似的问题:在服务器端数据库中为每个用户关联一个精确的时区。当用户填写预订表单时,您会显示一个TZ选择器,预先填充了他的默认TZ。所以他可以仔细检查它(我比通过IP猜测要安全得多),在服务器端,日期可以安全地从本地时间转换到服务器时间,然后再转换回来。
发布于 2013-08-29 15:31:57
Joda time或许能解决你的问题:
http://joda-time.sourceforge.net/apidocs/org/joda/time/DateTimeZone.html
https://stackoverflow.com/questions/18504174
复制相似问题