關於java Date和時區的問題

java2平臺爲我們提供了豐富的日期時間API。如java.util.Date;java.util.calendar;java.text.DateFormat等。那麼它們之間有什麼關係呢?

首先,java.util.Date代表一個時間點,其值爲距公元1970年1月1日 00:00:00的毫秒數。所以它是沒有時區和Locale概念的。java通過如下形式取得當前時間點:

Date now = new Date(); //這個時間點與本地系統的時區無關

而正因爲其與時區的無關性,才使得我們的存儲數據(時間)是一致的(時區一致性)。一般的我們將now存儲於數據庫中,當我們需要展現數據時,將now格式化成想要的格式,如:2009-11-19 14:12:23。而這個功能一般交由java.text.DateFormat來實現。例如:

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String snow = sdf.format(now); // 2009-11-19 14:12:23

我們發現snow是帶時間(14:12:23)的字符串,我們不禁要問,該時間(14:12:23)是哪個時區的時間?默認情況下,SimpleDateFormat 取得本地系統的時區(我的時區爲GMT+8北京),然後按照pattern("yyyy-MM-dd HH:mm:ss")格式化now,此時輸出的就是GMT+8區的時間了。如果想支持國際化時間,則先指定時區,然後再格式化date數據。例如:

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

sdf.setTimeZone(TimeZone.getTimeZone("GMT+8"));
String snow = sdf.format(now); // 2009-11-19 14:12:23

另外,你可以通過如下代碼修改本地時區信息:

TimeZone.setDefault(TimeZone.getTimeZone("GMT+8"));



java.util.Calendar類也代表時間點,但它爲Date的facade工具類,提供了很多對時間點到年、月、日、時、分、秒、星期等的轉換(計算)的方便方法。

Calendar calendar = Calendar.getInstance(timezone);

Date d = calendar.getTime();

Calendar 的計算也是基於時區的,例如:同一個date在不同時區下的小時數是不一樣的。但是calendar.getTime();返回的date是沒有時區的,因爲它是Date類型的。例如:

public static void main(String[] args) throws InterruptedException {
Calendar calendar1 = Calendar
.getInstance(TimeZone.getTimeZone("GMT+8"));
Calendar calendar2 = Calendar
.getInstance(TimeZone.getTimeZone("GMT+1"));

System.out.println("Millis = " + calendar1.getTimeInMillis());
System.out.println("Millis = " + calendar2.getTimeInMillis());

System.out.println("hour = " + calendar1.get(Calendar.HOUR));
System.out.println("hour = " + calendar2.get(Calendar.HOUR));

System.out.println("date = " + calendar1.getTime());
System.out.println("date = " + calendar2.getTime());
}
輸出:

Millis = 1258614681203
Millis = 1258614681203
hour = 3
hour = 8
date = Thu Nov 19 15:11:21 CST 2009
date = Thu Nov 19 15:11:21 CST 2009
發佈了104 篇原創文章 · 獲贊 1 · 訪問量 5765
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章