La *_*ell 1 java timezone datetime date java-8
我必须在不同的时区使用Java 8日期/时间.例如:
LocalDateTime dateTime = LocalDateTime.of(2017, Month.JUNE, 1, 13, 39);
Instant instant = dateTime.atZone(ZoneId.of("Europe/Paris")).toInstant();
Run Code Online (Sandbox Code Playgroud)
时间帧是到dateTimes之间的实例
但我不想硬编码时区,这总是一个不好的做法
我在Java API中找不到任何常量来表示不同的时区,如https://en.m.wikipedia.org/wiki/List_of_tz_database_time_zones
是否有任何映射,因为它在短区ID?
https://docs.oracle.com/javase/8/docs/api/java/time/ZoneId.html#of-java.lang.String-java.util.Map-
时区经常被政治家重新定义.出现新区域.旧的重命名(例如Asia/Kolkata
).有些人决心实际上并不是独特的,最终指向另一个人(例如:)America/Montreal
.而这只是名称 - 每个区域内的偏移也经常被政治家修改为夏令时(DST)等异常,或决定完全退出DST或决定全年保持DST或决定将偏移量改变15分钟,以便做出一些政治声明,例如区别于邻国.所以没有简单的永久清单.
Java附带了tzdata时区数据库的副本.如果您关心的任何区域都经历了更改,则需要在Java安装中更新此tzdata.Oracle在实现过程中为这项工作提供了一个工具; 我不了解别人.同样,您还应该更新主机计算机操作系统中的tzdata以及其他实用程序,例如像Postgres这样的数据库.
对于ZoneId
Java中对象的引用,您可以将一些定义为常量.java.time类是线程安全的.因此,您可以将单个实例保持为常量.
public class TimeUtils {
static public ZoneId ZONEID_EUROPE_PARIS = ZoneId.of( "Europe/Paris" ) ;
static public ZoneId ZONEID_ASIA_KOLKATA = ZoneId.of( "Asia/Kolkata" ) ;
}
Run Code Online (Sandbox Code Playgroud)
您有LocalDateTime
代表潜在时刻,而不是时间轴上的特定点.一个LocalDateTime
有没有时区或偏移信息.因此LocalDateTime
,今年6月1日的中午可能意味着许多不同的时刻,第一个中午发生在基里巴斯,时区比UTC早14个小时.孟加拉国的中午来晚了,法国巴黎的中午还有几个小时.因此,在LocalDateTime
为上下文应用时区之前,没有任何实际意义.
LocalDateTime noon1June2017Anywhere = LocalDateTime.of( 2017 , Month.JUNE , 1 , 12 , 0);
Run Code Online (Sandbox Code Playgroud)
在需要的地方使用那些常量ZoneId
.
ZonedDateTime noon1June2017EuropeParis = noon1June2017Anywhere.atZone( TimeUtils.ZONEID_EUROPE_PARIS ) ;
ZonedDateTime noon1June2017AsiaKolkata = noon1June2017Anywhere.atZone( TimeUtils.ZONEID_ASIA_KOLKATA ) ;
Run Code Online (Sandbox Code Playgroud)
请注意,noon1June2017EuropeParis
并noon1June2017AsiaKolkata
有两种不同的时刻,在时间轴上的不同点.中午在印度比在法国发生得更早.
让我们将UTC中的这两个值看作Instant
对象.这两个Instant
对象并不相同,因为加尔各答比巴黎的早几个小时.
Instant instantNoon1June2017EuropeParis = noon1June2017EuropeParis.toInstant() ; // Extract the same moment but in UTC zone.
Instant instantNoon1June2017AsiaKolkata = noon1June2017AsiaKolkata.toInstant() ; // Extract the same moment but in UTC zone.
Run Code Online (Sandbox Code Playgroud)
如果您的问题的目的是外部化要应用的区域的决定,以便您可以在不重新编译源代码的情况下更改该选择,只需将区域名称的字符串(例如Europe/Paris
字符串)存储在某个外部资源中.
把你的字符串传递给ZoneId.of
.
ZoneId z = ZoneId.of( someStringOfZoneName ) ;
Run Code Online (Sandbox Code Playgroud)
人们常用的可能的存储机制:
ZoneId.getAvailableZoneIds
.您可以询问JVM的当前默认区域:ZoneId.systemDefault
.但要注意,这可以随时由该JVM中的任何应用程序中的任何代码进行更改.
归档时间: |
|
查看次数: |
1848 次 |
最近记录: |