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

Java 为什么System.currentTimeMillis()生成不正确的长值?,java,android,Java,Android,我知道,它被讨论了太多次,但我不明白为什么我的毫秒会产生: System.currentTimeMillis(); 或通过: Calendar.getInstance(TimeZone.getTimeZone("UTC")).getTimeInMillis() 与我在电视上看到的不相等吗 我需要的只是生成一个具体格式的字符串,但我发现毫秒是不对的 以防万一,我是这样做的: private static final String DATE_PATTERN = "y

我知道,它被讨论了太多次,但我不明白为什么我的毫秒会产生:

System.currentTimeMillis();
或通过:

Calendar.getInstance(TimeZone.getTimeZone("UTC")).getTimeInMillis()
与我在电视上看到的不相等吗

我需要的只是生成一个具体格式的
字符串,但我发现毫秒是不对的

以防万一,我是这样做的:

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检查了它(使用
选择strftime(“%s”,timestring);
),得到了正确的毫秒。那么为什么我在上面发布的两条声明中错误地生成了它呢?提前多谢。

有三件事需要考虑

  • 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'
添加到格式中一样,这只是您添加的一个字母。

需要考虑三件事

  • 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'
添加到格式中,这只是您添加的一个字母。

如果希望日期格式将时间格式化为UTC区域,请使用

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

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

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

只要去掉毫秒,数字就会对齐。也许你的SQLite的“区域设置”正确。@RamonBoza,我不需要区域设置时间,但需要UTC时间。看来你的SQLite是在UTC中配置的,java使用GMT+1左右?只要去掉毫秒,数字就会对齐。也许你的SQLite有“区域设置”正确。@RamonBoza,我不需要区域设置时间,但需要UTC时间。您的SQLite似乎是在UTC中配置的,而java使用GMT+1左右?但差异是几个小时,这是一种非常不准确的方式。@siik如果您不知道如何使用默认值,则需要设置时区。但差异是几个小时,一种非常不准确的方法。@siik如果不知道如何使用默认值,则需要设置时区。