Cha*_*lie 4 java timezone datetime
请看看你是否可以告诉我如何处理我的DST问题.
首先,我的应用程序是一个物流系统,它适用于全球用户,所以它涉及时区问题,我将在设置用户本地预订日期时处理如下:
1.当用户登录应用程序,我们可以得到根据登录IP用户的时区,但仅仅是一个偏移量(我不记得这东西的术语),例如,"GMT + 08"(北京)或"GMT-06" (芝加哥) .
2.在用户保存预订之前,我们需要设置预订当地日期,因为我无法直接获得用户本地日期.所以我将首先获得服务器日期(在我的情况下,它是北京时间),然后根据当地日期计算到服务器日期和用户时区,例如,如果用户时区是"GMT-08",则服务器日期是2013-08-29 17:45:00.服务器时区是"GMT + 08",然后我将使用服务器日期-8-8,结果将是2013-08-29 01:45:00.但由于我不考虑夏令时,计算的本地日期将与实际日期不同.现在在旧金山,实际的本地日期将比我用这种方式计算的结果早一个小时,
我发现java TimeZone已经考虑了DST问题,但我需要在构造TimeZone时提供"位置"名称(例如US/Alaska,Pacific/Apia).虽然在我的情况下,我能得到的只是偏移量.你能告诉我如何在我的情况下解决DST问题吗?
是的,您应该使用Java 8中的Joda-Time或新的java.time包(受Joda-Time启发).
偏移量是UTC(GMT)的小时数和分钟数,由特定日期时间值表示.西海岸是-08:00(忽略夏令时废话),意味着比UTC晚8小时.
请注意,java.time在其初始版本中有一个小错误,它无法处理+08几分钟(例如)没有分钟(例如+08:00)的偏移量.
一个时区是偏移加上有关夏令时(DST),历史DST的变化,以及对他人的异常信息的规则.
使用适当的时区名称(主要是大陆斜线城市).避免使用3或4个字母代码,例如EST,它们既不是标准的也不是唯一的.
java.util.Date没有时区,而Joda-Time DateTime则没有时区.
要获取Web浏览器的时区,请参阅此问题.但通常,这不会很好.正如您可能已经看到的,许多网站要求用户选择时区.
您确切的用例令人困惑.通常,最好的方法是使用UTC的日期时间值,然后根据需要调整用户的本地时间.通常最适合您的软件工作和存储日期时间为UTC.然后显示调整为适合用户的本地日期时间.换句话说,全局思考(UTC),在本地呈现(调整本地时区).
通常,系统管理员将其服务器计算机设置为UTC(无时区偏移).如果您的操作系统(如Mac OS X)不提供UTC,则使用Reykjavik冰岛全年使用UTC而没有任何夏令时.同样,数据库引擎几乎总是将日期时间值转换为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 );
Run Code Online (Sandbox Code Playgroud)
转储到控制台......
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 );
Run Code Online (Sandbox Code Playgroud)
跑的时候......
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-29
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3472 次 |
| 最近记录: |