2014-10-18 63 views
0

嘗試使用以下代碼在不同時區打印時間,但不起作用。任何想法爲什麼?日曆實例不工作

GregorianCalendar.getInstance(TimeZone.getTimeZone("PST")).getTime()。它按照我的時區打印時間,而不是在PST。

回答

1

由設計java.util.Date將被初始化自紀元以來的UTC毫秒,因此不考慮時區。下面的代碼將生成:

Calendar pstCalendar = GregorianCalendar.getInstance(TimeZone.getTimeZone("PST")); 
    Calendar defCalendar = GregorianCalendar.getInstance(TimeZone.getDefault()); 

    // Same values here : 
    System.out.println(pstCalendar.getTime()); 
    System.out.println(defCalendar.getTime()); 

    // Different values here : 
    System.out.println(pstCalendar.get(Calendar.HOUR_OF_DAY)); 
    System.out.println(defCalendar.get(Calendar.HOUR_OF_DAY)); 

的溶液。將不會直接轉換成日期對象之前使用getTime方法而是採取Calendar.ZONE_OFFSET考慮並採取DIFF:

Date d = new Date(); 

    // Default time : 
    System.out.println(d); 

    d.setTime(d.getTime() + pstCalendar.get(Calendar.ZONE_OFFSET)); 

    // Time after applying offset 
    System.out.println(d); 
+0

要將java.util.Date.getTime()的含義更改爲* local * millis,實際上是一個非常糟糕的設計思路。你正在編寫與規範含義相反的規則,忽略了該類的規範。這只是一個骯髒的黑客。 – 2014-10-22 15:46:11

1

Calendar#getTime() - 返回表示此日曆的時間值的Date對象(與Epoch的毫秒偏移量。準確地說,java.util.Date中的值是自Unix時代開始的毫秒數,發生在UTC時間1970年1月1日午夜的UTC和java.util.Date沒有特定的時區。

在另一方面,你可以實現你試圖用這種方式做也

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MMM-dd HH:mm:ss z"); 
sdf.setTimeZone(TimeZone.getTimeZone("PST")); 
System.out.println(sdf.format(new Date())); 
1

避免j.u.Calendar

的java.util.Date和.Calendar類是出了名的麻煩和過時。避免它們。而是使用Joda-Time或Java 8中的java.time包(受Joda-Time啓發)。

與j.u.Date不同,這些其他兩個庫中的日期 - 時間對象知道它們自己分配的時區。

Joda-Time

Joda-Time 2.5中的一些示例代碼。在使用Joda-Time時,使用時區變得基本。

DateTime dateTimeDefaultZone = DateTime.now(); // The JVM’s current default time zone assigned. I recommend always specifying a zone instead of implicitly relying on default. 
DateTime dateTimeLosAngeles = dateTimeDefaultZone.withZone(DateTimeZone.forID("America/Los_Angeles")); 
DateTime dateatimeUtc = dateTimeDefaultZone.withZone(DateTimeZone.UTC); 
DateTime dateTimeKolkata = dateTimeDefaultZone.withZone(DateTimeZone.forID("Asia/Kolkata")); 

時區名稱

使用proper time zone names。避免使用3或4個字母代碼,因爲它們既不標準也不唯一,並且會進一步混淆夏令時問題。