是的,您应该在
Java 8中使用
Joda-Time或新的java.time包(受Joda-Time启发).
偏移量是从特定日期时间值表示的UTC(GMT)的小时数和分钟数.西海岸是-08:00(忽略夏令时废话),意味着比UTC晚8小时.
请注意,java.time在其初始版本中有一个小错误,它无法处理几分钟(例如08)的偏移而没有分钟(例如08:00).
A time zone是关于夏令时(DST)的偏移加规则,DST更改历史以及有关其他异常的信息.
使用适当的time zone names(主要是大陆斜线城市).避免使用3或4个字母代码,例如EST,它们既不是标准的也不是唯一的.
java.util.Date没有时区,而Joda-Time DateTime则没有.
要获取Web浏览器的时区,请参阅this question.但通常,这不起作用.正如您可能已经看到的,许多网站要求用户选择时区.
您确切的用例令人困惑.通常,最好的方法是使用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 );
转储到控制台……
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-29