1. 程式人生 > >關於java Date和時區的問題

關於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

Java程式碼  
  1. 1. Date date = new Date();  
  2. 2. Date date = Calendar.getInstance().getTime();  

Date物件本身所儲存的毫秒數可以通過date.getTime()方法得到;該函式返回自1970年1月1日 00:00:00 GMT以來此物件表示的毫秒數。

Calendar的getInstance()方法有引數為TimeZone和Locale的過載,可以使用指定時區和語言環境獲得一個日曆。無參則使用預設時區和語言環境獲得日曆。