英文:
Why is the time incorrect when I convert from milliseconds to local time in Android?
问题
fun format(input: Long, outputFormat: String = "yyyy-MM-dd'T'HH:mm:ss", locale: Locale = Locale.US): String {
val sdf = SimpleDateFormat(outputFormat, locale)
sdf.timeZone = TimeZone.getTimeZone("UTC")
return sdf.format(Date(input))
}
println(format(1596095340000))
Expected output:
2020-07-29T17:49:00
英文:
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))
}
I have the following method above, when I enter the following command:
println(format(1596095340000))
I am expecting to get
2020-07-29T17:49:00
however I end up getting this instead
2020-07-30T07:49:00
Do I have to manually do the offset myself, and if I do how would I do that? I thought that this type of offset would be handled automatically?
I've also adapted answer from another SO post at https://stackoverflow.com/questions/31292032/converting-from-milliseconds-to-utc-time-in-java and results were different but still not what I expected:
val sdf = SimpleDateFormat()
sdf.timeZone = TimeZone.getTimeZone("PST")
println(sdf.format(Date(1596095340000)))
7/30/20 12:49 AM
答案1
得分: 1
时间戳1596095340000对应于2020年07月30日07: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"
英文:
The time stamp 1596095340000 corresponds to the instant 2020-07-30T07:49:00 UTC - you can verify this at any online date/time conversion site.
By default, SimpleDateFormat
uses the system time zone. From your output, it looks like the system time zone coincides with UTC.
To get the result you expect 2020-07-29T17:49:00
you would need a time zone with a 14 hour offset:
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"
No place in the world has a 14 hour time zone offset. Either your time stamp is wrong, or the result you expect is wrong. For example, if you got the date wrong, your expected time zone might be Australia/Sydney:
sdf.setTimeZone(TimeZone.getTimeZone("Australia/Sydney"))
sdf.format(new Date(1596095340000L)) // "2020-07-30T17:49:00"
</details>
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论