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

标签 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);)并得到了正确 毫秒。为什么我上面发布的那两个语句错误地生成了它?非常感谢。

最佳答案

需要考虑的三件事

  • Java 不支持带闰秒的 UTC,仅支持 GMT。这是因为操作系统不支持它。
  • 除非您使用卫星同步设备获取时间,否则您的毫秒数将不准确。
  • 您不能在完全相同的时间运行命令,因此它们有时会不同。

但更重要的是,如果您不设置时区,它将使用默认时区。

    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 - 为什么 System.currentTimeMillis() 生成不正确的 long 值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19139600/

相关文章:

Java 树类

android - Android 应用程序的身份验证方案 : When the SIM card is locked or exhanged by another, 应用程序停止工作

android - toast (使用 alarmmanager)

java - Gradle 插件仅支持 Kotlin Gradle 插件版本 1.3.40 及更高版本将 android studio gradle 从 4.2.2 升级到 7.0.0 时出错

android - ViewPagerAndroid 不使用 React-Native 在 ScrollView 下渲染

java - 执行不会等到 Alertdialog.dismiss()

java - 如何将 BigInteger 转换为科学计数法字符串并返回?

java - 从泛型类返回数组

java - 如何从资源文件夹加载文件?

android - 错误输入的振动模式 (Android)