是的,您應該使用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