SimpleDateFormat奇怪的行为

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

标签: java android date simpledateformat

任何人都可以向我解释以下代码如何输出01:00:00

System.out.println(new SimpleDateFormat("HH:mm:ss").format(0));

如果我将毫秒数从0更改为更高的值,它将持续输出超过1小时的时间。

编辑: 这根本没有任何意义,但它有效! 即使是“官方”GMT网站,http://wwp.greenwichmeantime.co.uk/也确认我在本地机器上看到和使用的时区是GMT + 0,但为了获得所需的结果,我首先必须将SimpleDateFormat的时区设置为GMT 0

编辑2: 好的,所以从逻辑的角度来看,当英国是GMT + 1时,SimpleDateFormat默认为历史时间。对于那些试图使用SimpleDateFormat简单解析相对较少时间的人来说,这是非常意外和令人困惑的。

2 个答案:

答案 0 :(得分:2)

关于英国夏令时实验,请查看Wikipedia。举例:

“在1966年至1967年期间进一步调查导致哈罗德威尔逊政府引入英国标准时间实验,英国全年保持格林尼治标准时间+1。这发生在1968年10月27日至1971年10月31日之间。是对以前安排的回归。“

请记住,奇怪的表达式format(0)与1970-01-01日期有效。

更新:关于OPs编辑和(已删除)注释的备注:如果隐式赋予SimpleDateFormat的时区参数(隐式地因为默认系统配置而被指定为“Europe / London”),则会有很大差异(然后根据时区历史记录GMT + 1970年(或根据时区历史记录)或固定偏移量,如“GMT”(当然没有额外的小时班次)。顺便说一句,引用英国网站关于格林威治标准时间遗憾的是没有让用户了解不同的历史tz数据。

答案 1 :(得分:0)

当您使用数字调用格式(数字)时,实际调用Format.format(Object)并使用以下引用调用SimpleDataFormat.format()实习:

    if (obj instanceof Date) {  // deal with Date object pass in
        format((Date)obj, sb, delegate);
    }
    else if (obj instanceof Number) {  // deal with number pass in, 
        format(new Date(((Number)obj).longValue()), sb, delegate);
    }

如果您注意到它实际上将该号码作为longValue发送到新的Date()......

所以,这相当于你称之为

System.out.println(new SimpleDateFormat("HH:mm:ss").format(new Date(0)));