打印GMT和PST时间戳只显示7小时的差异

时间:2014-12-23 08:48:40

标签: java timezone simpledateformat

我的理解是PST与GMT / UTC相差8小时。但是,当我打印出来时,我发现只有7小时的差异。你能解释一下我在这里做错了什么吗?

    SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S");
    Date date = sdf1.parse("2014-05-01 13:31:03.7");

    SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd_HHmmssS");
    df.setTimeZone(TimeZone.getTimeZone("PST"));
    System.out.println(df.format(date));
    df.setTimeZone(TimeZone.getTimeZone("GMT"));
    System.out.println(df.format(date));
    df.setTimeZone(TimeZone.getTimeZone("UTC"));
    System.out.println(df.format(date));

打印:

20140501_1331037
20140501_2031037
20140501_2031037

3 个答案:

答案 0 :(得分:7)

我假设你在夏天/白天节省PST时节省GMT + 7的时间。试试冬天。

来自http://wwp.greenwichmeantime.co.uk/time-zone/usa/pacific-time/

  

太平洋时间何时更改为夏令时?

     

在大多数州   在美国和加拿大的大多数省份,夏令时(DST)   观察到了。在DST期间PT或PDT比格林威治标准时间晚7个小时   时间(格林威治标准时间-7)。

     

夏季过后,太平洋时间又向美国转移了1小时   太平洋标准时间(PST)或(GMT-8)。

     

采用日光的美国各州的时间表   节省时间是:

     

3月的第二个星期天凌晨2点

     凌晨2点,凌晨2点   十一月。

答案 1 :(得分:6)

你这里没有做错什么。如果将时区添加到输出格式:

    SimpleDateFormat df = new SimpleDateFormat("HH mm ssS Z z");

你可以看到输出实际上是PDT(夏令时)而不是PST(常规)

10 31 037 -0700 PDT
17 31 037 +0000 GMT
17 31 037 +0000 UTC
12 31 037 -0500 EST
17 31 037 +0000 GMT

五月是夏令时。

答案 2 :(得分:2)

以下是使用Joda-Time 2.6的解决方案。

String inputRaw = "2014-05-01 13:31:03.7";
String input = inputRaw.replace( " ", "T" ); // Adjust input to comply with the ISO 8601 standard.
DateTimeZone zone = DateTimeZone.UTC;
DateTime dateTime = new DateTime( input, zone );  // The input lacks an offset. So specify the time zone by which to interpret the parsed input string. The resulting DateTime is then adjusted to the JVM’s current default time zone. So, *two* time zones were used in this line of code, one explicit, the other implicit.
DateTime dateTimeUtc = dateTime.withZone( DateTimeZone.UTC );  // Adjust to UTC.
DateTime dateTimeLosAngeles = dateTime.withZone( DateTimeZone.forID( "America/Los_Angeles" ) );  // Adjust to US west coast time zone. DST is automatically applied as needed.
DateTime dateTimeKolkata = dateTime.withZone( DateTimeZone.forID( "Asia/Kolkata" ) );  // Adjust to India time, five and a half hours ahead of UTC.

所有这些DateTime对象代表宇宙历史时间轴中的相同时刻。每个人都有不同的时间(可能是不同的日期),以适应"墙壁时间"在特定地区的人们可能看到的时钟上。