有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

javawhy系统。currentTimeMillis()是否生成不正确的长值?

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

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) 个答案

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

  2. # 2 楼答案

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

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