只有毫秒的SimpleDateFormat



I必须使用SimpleDateFormat在Java中解析日期。我正在使用一个现有的库,该库将日期作为String,并使用一个SimpleDateFormat实例来解析它。一切都很好,但如果日期格式自epoch时间(1/1/1970(以来仅包含毫秒,即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,使其能够解析自epoch以来经过的毫秒数?

注意:

  • 我不能使用像Joda time这样的其他库
  • 我不能使用new Date(long pNbMilli)来构造日期(遗留库将SimpleDateFormat实例作为输入(
  • 我发现了这个JDK错误,但不确定它是否与这个问题直接相关

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

如果你真的必须使用现有的API,需要一个日期格式,你可以随时破解它:

SimpleDateFormat msSDF = new SimpleDateFormat("SSS") {
            @Override
            public Date parse(String source) throws ParseException {
                return new Date(Long.parseLong(source));
            }
}; 

(当然,可能还需要提供format(string)的破解实现,这取决于您的传统API的实际功能。(

相关内容

  • 没有找到相关文章

最新更新