SimpleDateFormat.format() 给出无效日期

SimpleDateFormat.format() gives invalid Date

final static DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");

此方法生成了无效日期:

public static String getDate(double seconds) {
  Date date = new Date((long)(seconds * 1000));
  return dateFormat.format(date);
}

不知何故 1465235513.09794 出现在 "2015-06-31T02:33:31.921+0000" - 有趣的部分是 6 月 31 日。

有线索吗?

瞎猜,你是在多线程程序中使用这个吗?如果是这样,SimpleDateFormat 就不是线程安全的。我宁愿将 dateFormat 移动到 getDate() 方法中。 来自 Javadoc

Date formats are not synchronized. It is recommended to create separate format instances for each thread. If multiple threads access a format concurrently, it must be synchronized externally.

或按照 Jon Skeet 的建议使用 Java 8 java.time & DateTimeFormatter

来自Javadoc

A formatter created from a pattern can be used as many times as necessary, it is immutable and is thread-safe.

或按照 Adrian Shum 的建议使用 Joda 时间(如果您出于某种原因不能使用 Java 8)。

    final DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
    double seconds = 1465235513.09794;
    Date date = new Date((long)(seconds * 1000));   //1465235513097
    String reqDate = dateFormat.format(date);
    System.out.println(reqDate); // 2016-06-06T23:21:53.097+0530

如有混淆请参考纪元时间