为什么System.currentTimeMillis()生成不正确的长值?

时间:2013-10-02 14:36:44

标签: java android

我知道,讨论的次数太多了,但我无法理解为什么我的生成毫秒:

System.currentTimeMillis();

或者通过:

Calendar.getInstance(TimeZone.getTimeZone("UTC")).getTimeInMillis()

是否与我在www.epochconverter.com上看到的相同?

我需要的是仅生成String具体格式,但我发现毫秒是不对的。

以防万一我是这样做的:

private static final String DATE_PATTERN = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'";

public static String getCurrentTimestamp() {
        long time = System.currentTimeMillis();
        SimpleDateFormat sdf = new SimpleDateFormat(DATE_PATTERN);
        String lastModifiedTime = sdf.format(time);
        Logger.logVerbose(TAG, "Generated timestamp is " + lastModifiedTime);
        return lastModifiedTime;
    }

我最终得到的只是当地时间,但我需要的唯一时间是纯UTC而不与我的时区相结合。

我甚至用SQLite检查了它(使用SELECT strftime('%s',timestring);)并获得正确毫秒。为什么我上面发布的这两个语句错误地生成了它?非常感谢。

2 个答案:

答案 0 :(得分:1)

要考虑的三件事

  • Java不支持闰秒的UTC,只支持GMT。这是因为操作系统不支持它。
  • 除非您从卫星同步设备上获得时间,否则您的毫秒数将不准确。
  • 您无法在同一时间运行命令,因此在某些时候它们会有所不同。

但更重要的是,如果你没有设置tiemzone,它将使用默认时区。

    SimpleDateFormat sdf = new SimpleDateFormat(DATE_PATTERN);
    // no time zone set so the default is used.
    String lastModifiedTime = sdf.format(time);

相反,你应该添加

    sdf.setTimeZone(TimeZone.getTimeZone("GMT"));

在格式中添加'Z'会将时区更改为仅添加'T'格式,这只是您添加的一封信。

答案 1 :(得分:0)

如果您希望日期格式格式化UTC区域中的时间,请使用

sdf.setTimeZone(TimeZone.getTimeZone("UTC"));