是的,您应该使用Joda-Time或Java 8中新的java.time包(受Joda-Time的启发)。
偏移量是由某个日期时间值表示的从UTC(GMT)开始的小时和分钟数。西海岸是-08:00(忽略夏令时的废话),意思是8小时UTC以后。
请注意,它的初始版本中的java.time有一个小错误,它无法处理只有几小时的偏移量(例如+08
)而没有分钟(如+08:00
)。
A time zone是偏移量加有关夏令时(DST),DST更改历史和其他异常信息的规则。
正确使用time zone names(主要是大陆斜线城市)。避免使用3或4个字母代码,如EST,它既不标准也不唯一。
java.util.Date没有时区,而Joda-Time DateTime。
要获得网络浏览器的时区,请参阅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
是的,我听到乔达是一个非常强大的工具,但你能告诉我更多的具体的东西?例如,如何使用乔达过程我的情况? – Chailie