SimpleDateFormat只有几毫秒

时间:2014-04-28 21:16:30

标签: java datetime simpledateformat milliseconds

必须使用SimpleDateFormat来解析Java中的日期。我使用了一个现有的库,它将日期作为StringSimpleDateFormat实例来解析它。 一切都很好,但是如果日期格式仅包括自纪元时间(1970年1月1日)以来的毫秒,即UNIX时间(以毫秒为单位),我就遇到了麻烦。使用new SimpleDateFormat("SS")new SimpleDateFormat("SSS")无效:

重现奇怪SimpleDateFormat行为的代码:

TimeZone.setDefault(TimeZone.getTimeZone("GMT")); // just for the test
long currTimeInMilli = System.currentTimeMillis();

SimpleDateFormat msSDF = new SimpleDateFormat("SS");  // same result with SimpleDateFormat("SSS")
SimpleDateFormat secSDF = new SimpleDateFormat("ss");

System.out.println(msSDF.parse("" + currTimeInMilli));
System.out.println(secSDF.parse("" + (currTimeInMilli / 1000)));
System.out.println(new SimpleDateFormat("EEE MMM dd HH:mm:ss zz yyyy").format(currTimeInMilli));

产生输出:

Mon Dec 15 07:46:20 GMT 1969    <-- should be like two other lines (?)!
Mon Apr 28 20:55:19 GMT 2014    <-- OK
Mon Apr 28 20:55:19 GMT 2014    <-- OK

这是正常的吗?如何设置SimpleDateFormat能够解析自纪元以来经过的毫秒数?

注意:

  • 我不能使用像Joda-time
  • 这样的其他库
  • 我无法使用new Date(long pNbMilli)来构建日期(旧版库将SimpleDateFormat实例作为输入)
  • 我发现了这个filed JDK bug,但不确定它是否与此问题直接相关...

1 个答案:

答案 0 :(得分:5)

S模式将无法正确处理大于Integer.MAX_VALUE的毫秒数,这与通常表示为long的数量看起来很奇怪。

如果你真的必须使用需要DateFormat的现有API,你可以随时破解它:

SimpleDateFormat msSDF = new SimpleDateFormat("SSS") {

            @Override
            public Date parse(String source) throws ParseException {
                return new Date(Long.parseLong(source));
            }

}; 

(可能还需要提供format(string)的黑客实施,具体取决于您的遗留API实际上的功能。)