java - 为什么我在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
解决方案
时间戳 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"
推荐阅读
- python - Python自定义模块导入问题
- javascript - 比较两个数组并在新数组中过滤掉重复项
- reactjs - 为什么 setState(contains another setState inside) 被调用两次?
- python - 使用节点值而不是项号遍历非二叉树
- python - Python Pandas read_csv() 不必要地获取与我的笔记本电脑相关的信息
- node.js - gRPC 错误:带有 NestJS 的 Docker 上的“地址不可用”
- javascript - 在Javascript中是否有更短的方法来做到这一点?(更多下文)
- kotlin - 如果不为空,则分配值的惯用方式
- javascript - 为什么我不能让这个简单的 CSS 过渡工作?
- xaml - UWP:如何将视图传递给 InAppNotifications 控件?