尝试使用以下代码在不同时区打印时间,但不起作用。任何想法为什么?日历实例不工作
GregorianCalendar.getInstance(TimeZone.getTimeZone("PST")).getTime()
。它按照我的时区打印时间,而不是在PST。
尝试使用以下代码在不同时区打印时间,但不起作用。任何想法为什么?日历实例不工作
GregorianCalendar.getInstance(TimeZone.getTimeZone("PST")).getTime()
。它按照我的时区打印时间,而不是在PST。
由设计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);
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()));
的java.util.Date和.Calendar类是出了名的麻烦和过时。避免它们。而是使用Joda-Time或Java 8中的java.time包(受Joda-Time启发)。
与j.u.Date不同,这些其他两个库中的日期 - 时间对象知道它们自己分配的时区。
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个字母代码,因为它们既不标准也不唯一,并且会进一步混淆夏令时问题。
要将java.util.Date.getTime()的含义更改为* local * millis,实际上是一个非常糟糕的设计思路。你正在编写与规范含义相反的规则,忽略了该类的规范。这只是一个肮脏的黑客。 – 2014-10-22 15:46:11