關於java Date和時區的問題
refs:
http://blog.163.com/haizai219@126/blog/static/444125552009101924912981/
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
- 1. Date date = new Date();
- 2. Date date = Calendar.getInstance().getTime();
Date物件本身所儲存的毫秒數可以通過date.getTime()方法得到;該函式返回自1970年1月1日 00:00:00 GMT以來此物件表示的毫秒數。
Calendar的getInstance()方法有引數為TimeZone和Locale的過載,可以使用指定時區和語言環境獲得一個日曆。無參則使用預設時區和語言環境獲得日曆。