尝试使用以下代码使用GregorianCalendar
在不同时区打印时间但不起作用。有什么想法吗?
GregorianCalendar.getInstance(TimeZone.getTimeZone("PST")).getTime()
。它按照我的时区打印时间,而不是PST。
答案 0 :(得分: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并在转换为日期对象之前获取差异:
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);
答案 1 :(得分:1)
Calendar#getTime() - 返回一个Date对象,表示这个Calendar的时间值(距离Epoch的毫秒偏移量。准确地说,java.util.Date中的值是自1970年1月1日午夜发生的Unix纪元以来的毫秒数, 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()));
答案 2 :(得分:1)
java.util.Date和.Calendar类非常麻烦且过时。避免他们。而是在Java 8中使用Joda-Time或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个字母代码,因为它们既不是标准化也不是唯一的,并且它们进一步混淆了夏令时问题。