某些时区的Java util dateformat毫秒似乎不正确

use*_*241 4 java date

据我所知,java.util.Date将日期存储为1970年1月1日00:00的毫秒数...

所以,我已经尝试过以下代码:

public void testDateFormatBehavior()
{
    DateFormat dfNoDay = new SimpleDateFormat(
            "MMM d H:m:s zzz yyyy"
            );
    // This one should be correct as IST = GMT+5.30
    String expStrDateBegIST1 = "Jan 01 05:30:01 IST 1970";
    // Instead, this one seems to do the conversion to
    // Jan 01 00:00:00 GMT 1970
    String expStrDateBegIST2 = "Jan 01 02:00:01 IST 1970";
    String expStrDateBegUTC = "Jan 01 00:00:01 GMT 1970";
    String expStrDateBegCET = "Jan 01 01:00:00 CET 1970";
    // Should convert to Jan 01 06:00:00 GMT 1970 as CST = GMT-6
    String expStrDateBegCST = "Jan 01 00:00:00 CST 1970"; 
    // This is EST, which is GMT+6... 
    String expStrDateBegEST = "Jan 01 10:00:00 EST 1970"; 
    try {
        Date dBegIST1 = dfNoDay.parse(expStrDateBegIST1);
        Date dBegIST2 = dfNoDay.parse(expStrDateBegIST2);
        Date dBegUTC = dfNoDay.parse(expStrDateBegUTC);
        Date dBegCET = dfNoDay.parse(expStrDateBegCET);
        Date dBegCST = dfNoDay.parse(expStrDateBegCST);
        Date dBegEST = dfNoDay.parse(expStrDateBegEST);
        System.out.println("IST1 milliseconds: " + dBegIST1.getTime());
        System.out.println("IST2 milliseconds: " + dBegIST2.getTime());
        System.out.println("UTC milliseconds: " + dBegUTC.getTime());
        System.out.println("CET milliseconds: " + dBegCET.getTime());
        System.out.println("CST milliseconds: " + dBegCST.getTime());
        System.out.println("EST milliseconds: " + dBegEST.getTime());
    } catch (ParseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

IST1 milliseconds: 12601000
IST2 milliseconds: 1000
UTC milliseconds: 1000
CET milliseconds: 0
CST milliseconds: 21600000
EST milliseconds: 0
Run Code Online (Sandbox Code Playgroud)

UTC毫秒线是正确的,因为我们从1970年1月1日开始指定00:00:01秒.CET是正确的.CST是正确的,因为毫秒是在1970年1月1日之后的6小时.

然而,IST转换很奇怪.

http://wwp.greenwichmeantime.com/to/ist/to-gmt/index.htm

IST似乎是GMT + 5:30.在我的Java代码中,它认为它是GMT + 2:00而不是.

此外,EST不正确.它认为EST是GMT + 10:00,而不是GMT + 6:00.GMT + 10:00是AEST,而不是EST. http://wwp.greenwichmeantime.com/time-zone/australia/time-zones/eastern-standard-time/

有什么我做错了吗?

Mik*_*uel 5

Timezonejavadoc的解释:

三个字母的时区ID

为了与JDK 1.1.x兼容,还支持其他一些三字母时区ID(例如"PST","CTT","AST").但是,它们的使用已被弃用,因为相同的缩写通常用于多个时区(例如,"CST"可能是美国"中央标准时间"和"中国标准时间"),然后Java平台只能识别其中一个他们.


问题是你假设时区缩写一致地指定一个特定的时区.

"IST"含糊不清:印度标准时间/爱尔兰标准时间/以色列标准时间.同样,"EST"可以表示美国东部标准时间或东澳大利亚标准时间.


Joda-time的时区列表显示了明确的Olson名称和当前时区偏移量.你最好使用Joda-time而不是java.util类,并使用Olson名称来识别时区.

我应该使用Java日期和时间类,还是使用像Joda Time这样的第三方库?讨论了许多人选择使用Joda-time的原因.