【问题标题】:Confusion with Java Calendar and time zones与 Java 日历和时区混淆
【发布时间】:2015-10-02 06:55:17
【问题描述】:

考虑以下代码片段...

import java.util.Calendar;
import java.util.TimeZone;


public class Main {
    public static void main(String[] args) {

        Calendar c = Calendar.getInstance();
        System.out.println(c.getTimeZone().getDisplayName());
        System.out.println(c.getTime());
        System.out.println(c.get(Calendar.HOUR_OF_DAY));

        Calendar gmtCal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
        System.out.println(gmtCal.getTimeZone().getDisplayName());
        System.out.println(gmtCal.getTime());
        System.out.println(gmtCal.get(Calendar.HOUR_OF_DAY));

        Calendar c2 = Calendar.getInstance(TimeZone.getTimeZone("US/Alaska"));
        System.out.println(c2.getTimeZone().getDisplayName());
        System.out.println(c2.getTime());
        System.out.println(c2.get(Calendar.HOUR_OF_DAY));
    }
}

这个程序的输出是

Eastern Standard Time
Mon Jul 13 16:10:14 EDT 2015 
16
Greenwich Mean Time
Mon Jul 13 16:10:14 EDT 2015  //<--- also not sure why this isn't 4 hours ahead as Eastern time is UTC/GMT - 4 right now due to DST
20
Alaska Standard Time
Mon Jul 13 16:10:14 EDT 2015 //<--- date is not reflecting correct time and is showing EDT versus AST
12

为什么get(Calendar.HOUR_OF_DAY) 方法调用与getTime() 方法调用中的小时不匹配?换一种说法,为什么这不是输出?

Eastern Standard Time
Mon Jul 13 16:10:14 EDT 2015
16
Greenwich Mean Time
Mon Jul 13 20:10:14 GMT 2015
20
Alaska Standard Time
Mon Jul 13 12:10:14 AST 2015
12

编辑... 那么我怎样才能得到以下内容

long t = 1436842840327L;
Calendar c = Calendar.getInstance();
c.setTimeInMillis(t);
c.setTimeZone(TimeZone.getTimeZone("US/Alaska"));
System.out.println(c.getTime());
System.out.println(c.get(Calendar.HOUR_OF_DAY) + ":" + c.get(Calendar.MINUTE) + ":" + c.get(Calendar.MILLISECOND));

打印与getTime() 相同的小时?当前的输出是

Mon Jul 13 23:00:40 EDT 2015
19:0:327

【问题讨论】:

标签: java


【解决方案1】:

函数getTime() 返回一个Date object,当转换为字符串时,Date 对象使用您的默认时区表示。

因此,通过使用 getTime(),您将获得一个不再包含时区数据的 Date 对象(Date 只是一个特定的时间点)。然后该 Date 对象在打印时被隐式转换为字符串。

【讨论】:

【解决方案2】:

Java 文档明确说明了方法getInstance()

公共静态日历 getInstance()
获取使用默认时区和语言环境的日历。返回的日历基于默认时区中的当前时间和默认语言环境。

(强调我的)

【讨论】:

    猜你喜欢
    • 2015-06-26
    • 2016-03-15
    • 2015-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多