java - 国家/地区本地 TZD 格式的纪元时间戳
问题描述
我有纪元时间戳和国家。我想将该时间戳转换为具有夏令时(TZD)格式的给定国家/地区本地时间戳,如下所示
yyyy-mm-ddThh:MM:ssTZD
e.g. 2018-02-25T22:36:23+0100
Timestamp : 1525370235
Country : NLD (ISO alpha-3 code)
我如何在 Java 中实现这一点?
更新 1:
我正在使用这种转换,但不确定它是正确还是错误。有人可以让我知道这是进行转换的正确方法吗
Locale locale = new Locale("NLD");
Date date = new Date(1525381190 * 1000L);
SimpleDateFormat dateFormatCN = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ssZ", locale);
//Output : 2018-05-03T01:59:50-0700
解决方案
这是进行转换的正确方法吗
不它不是。我看到以下问题。
- 整个事情是不可能的,因为许多国家跨越多个时区。这意味着,从国家代码中,您无法知道选择哪个时区。由于本地时间因时区而异,在这些情况下您无法打印正确的时间。跨越多个时区的国家包括但不限于加拿大、美国、墨西哥、格陵兰、巴西、厄瓜多尔、俄罗斯、印度尼西亚、基里巴斯——甚至荷兰,您的示例国家。请注意,列表中有一些人口最多的国家/地区,因此如果您的数据代表世界人口,您可能会经常遇到此问题。请参阅此列表:按国家/地区列出的时区列表。
- 语言环境和时区是两个不同的东西,尽管它们或多或少都与地点没有直接关系。因此,获取正确的语言环境对您没有帮助。您还可以看到打印输出的 UTC 偏移量为 -0700,而夏季阿姆斯特丹的正确偏移量为 +0200。
new Locale("NLD")
不会为您提供有效的荷兰语言环境。构造函数的参数Locale(String)
是一个语言标签nl
,如荷兰语或en
英语。三个字母的国家/地区代码不起作用。- 因此,如果您只想做一些您所询问的工作,您将需要访问一些可以将国家代码转换为国家代码和将国家代码转换为时区的数据库。我不知道这里有什么好的选择,但我希望有一些这样的数据库可用。
java.time
最后,不要使用SimpleDateFormat
and Date
。这些课程早已过时且设计不佳。格式化荷兰大陆纪元时间戳值的现代正确方法是:
ZoneId zone = ZoneId.of("Europe/Amsterdam");
String nldTime = Instant.ofEpochSecond(1_525_370_235L)
.atZone(zone)
.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME);
System.out.println(nldTime);
这打印:
2018-05-03T19:57:15+02:00
如果您需要不带冒号的偏移量+0200
,请使用DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ssXX")
.
如果您想在荷兰加勒比地区的城市而不是阿姆斯特丹,请使用 America/Kralendijk 时区。那么结果就是2018-05-03T13:57:15-04:00
。
推荐阅读
- java - 为什么我的 JavaFX 对象构造函数在测试文件中返回 null?
- flurry - #flurry 数据下载是否存在最近或已知的问题?
- python - 使用 findall 获取 bs4 元素 python 的标题子项?
- azure - 在 Azure Blob 存储中看不到上传的文件
- c++ - 为什么少
用于最大堆和更大的比较器 对于最小堆? - syntax - 我使用“turtles-on”的方式有什么问题?
- nginx - 重写授权标头,在 Nginx Plus 中的 jwt 验证之前修复错字
- android - 如何在android的网格布局中添加背景?
- spring-boot - spring boot: hikari configs camelcase vs configs with lowercase and -
- uwp - 在为 uwp 生成 AppPackage 时在 Xamarin.Forms 中。有没有办法将其转换为 .exe 或单击安装之类的东西