日历实例无效

时间:2014-10-18 10:13:03

标签: java gregorian-calendar

尝试使用以下代码使用GregorianCalendar在不同时区打印时间但不起作用。有什么想法吗?

GregorianCalendar.getInstance(TimeZone.getTimeZone("PST")).getTime()。它按照我的时区打印时间,而不是PST。

3 个答案:

答案 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)

避免使用j.u.Calendar

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