首页 > 解决方案 > 为什么我在Android中从毫秒转换为本地时间时时间不正确?

问题描述

    fun format(input: Long, outputFormat: String = "yyyy-MM-dd'T'HH:mm:ss", locale: Locale = Locale.US): String {
        SimpleDateFormat(outputFormat, locale).apply {
        return format(Date(input))
    }

当我输入以下命令时,我有上面的方法:

println(format(1596095340000))

我期待得到

2020-07-29T17:49:00

但是我最终得到了这个

2020-07-30T07:49:00

我是否必须自己手动进行偏移,如果我这样做,我会怎么做?我认为这种类型的偏移会自动处理?

我还改编了另一篇 SO 帖子在 Java 中从毫秒转换为 UTC 时间的答案,结果有所不同,但仍不是我所期望的:

    val sdf = SimpleDateFormat()
    sdf.timeZone = TimeZone.getTimeZone("PST")
    println(sdf.format(Date(1596095340000)))

7/30/20 12:49 AM

标签: javaandroidkotlin

解决方案


时间戳 1596095340000 对应于即时 2020-07-30T07:49:00 UTC - 您可以在任何在线日期/时间转换站点上验证这一点。

默认情况下,SimpleDateFormat使用系统时区。从您的输出来看,系统时区似乎与 UTC 一致。

要获得您期望的结果,您2020-07-29T17:49:00需要一个偏移 14 小时的时区:

var sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss")
sdf.setTimeZone(TimeZone.getTimeZone("GMT-1400"))
sdf.format(new Date(1596095340000L)) // "2020-07-29T17:49:00"

世界上没有一个地方有 14 小时的时区偏移。要么你的时间戳是错误的,要么你期望的结果是错误的。例如,如果您弄错了日期,您的预期时区可能是澳大利亚/悉尼:

sdf.setTimeZone(TimeZone.getTimeZone("Australia/Sydney"))
sdf.format(new Date(1596095340000L)) // "2020-07-30T17:49:00"

推荐阅读