2014-10-18 64 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个字母代码,因为它们既不标准也不唯一,并且会进一步混淆夏令时问题。