Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java8-tz数据库时区_Java_Date_Datetime_Java 8_Timezone - Fatal编程技术网

Java8-tz数据库时区

Java8-tz数据库时区,java,date,datetime,java-8,timezone,Java,Date,Datetime,Java 8,Timezone,我必须在不同的时区使用Java 8个日期/时间。例如: LocalDateTime dateTime = LocalDateTime.of(2017, Month.JUNE, 1, 13, 39); Instant instant = dateTime.atZone(ZoneId.of("Europe/Paris")).toInstant(); 时间范围是介于到日期时间之间的实例 但我不想硬编码时区,这总是一种糟糕的做法 我在JavaAPI中找不到任何常数来表示不同的时区,比如 在短区ID中是

我必须在不同的时区使用Java 8个日期/时间。例如:

LocalDateTime dateTime = LocalDateTime.of(2017, Month.JUNE, 1, 13, 39);
Instant instant = dateTime.atZone(ZoneId.of("Europe/Paris")).toInstant();
时间范围是介于到日期时间之间的实例

但我不想硬编码时区,这总是一种糟糕的做法

我在JavaAPI中找不到任何常数来表示不同的时区,比如

在短区ID中是否有任何映射

政客们经常重新定义时区。新区域出现。旧的更名为前:亚洲/加尔各答。有些人决定不去区分,最后指向另一个例子:美国/蒙特利尔。这只是名称——每个区域内的偏移量也经常被政客修改,以应对夏令时DST等异常情况,或者决定完全退出DST,或者决定全年都留在DST,或者决定将偏移量改为15分钟,以发表一些政治声明,比如将自己与邻国区分开来。因此,没有简单的永久清单

Java附带了时区数据库的副本。如果您关心的任何区域发生更改,则需要在Java安装中更新此数据。Oracle在其实现过程中为这项工作提供了一个工具;我不知道其他人。同样,您还应该更新主机操作系统中的tzdata以及其他实用程序,如数据库

对于Java中对ZoneId对象的引用,可以将一些定义为常量。time类是线程安全的。因此,可以将单个实例保持为常量

public class TimeUtils {
    static public ZoneId ZONEID_EUROPE_PARIS = ZoneId.of( "Europe/Paris" ) ;
    static public ZoneId ZONEID_ASIA_KOLKATA = ZoneId.of( "Asia/Kolkata" ) ;
}
您有一个LocalDateTime表示潜在的时刻,而不是时间线上的特定点。LocalDateTime没有时区或偏移量信息。因此,今年6月1日中午的LocalDateTime可能意味着许多不同的时刻,第一个中午发生在时区比UTC提前14小时偏移的地方。孟加拉国的中午来得晚,法国巴黎的中午还要晚几个小时。因此,在为上下文应用时区之前,LocalDateTime没有实际意义

LocalDateTime noon1June2017Anywhere = LocalDateTime.of( 2017 , Month.JUNE , 1 , 12 , 0);
在需要区域ID的地方使用这些常量

请注意,2017年6月1日欧洲议会和2017年6月1日亚洲议会是两个不同的时刻,时间线上的不同点。印度的中午时间比法国早得多

让我们将UTC中的这两个值视为即时对象。这两个瞬间物体并不相等,因为加尔各答天体比巴黎天体早几个小时

Instant instantNoon1June2017EuropeParis = noon1June2017EuropeParis.toInstant() ;  // Extract the same moment but in UTC zone.
Instant instantNoon1June2017AsiaKolkata = noon1June2017AsiaKolkata.toInstant() ; // Extract the same moment but in UTC zone.
外化 如果您的问题的目的是将应用哪个区域的决定具体化,以便您可以在不重新编译源代码的情况下更改该选择,只需将区域名称的字符串(如Europe/Paris)作为字符串存储在某些外部资源中即可

将字符串传递给ZoneId.of

人们常用的可能存储机制:

将文本存储在文件中。 将文本存储在数据库行中,以便应用程序检索。 将文本作为条目存储在JNDI设施LDAP服务器中,将配置文件存储在Servlet容器中,等等。请参阅 来自Web服务的查询。看见 询问用户的首选项,并将字符串作为属性存储在诸如类成员之类的变量中,或存储在Servlet环境中的上下文对象或会话对象上。您可以通过调用为用户提供所有区域的选择列表。 您可以请求JVM的当前默认区域:ZoneId.systemDefault。但请注意,JVM中任何应用程序中的任何代码都可以随时更改这一点。

时区经常被政客重新定义。新区域出现。旧的更名为前:亚洲/加尔各答。有些人决定不去区分,最后指向另一个例子:美国/蒙特利尔。这只是名称——每个区域内的偏移量也经常被政客修改,以应对夏令时DST等异常情况,或者决定完全退出DST,或者决定全年都留在DST,或者决定将偏移量改为15分钟,以发表一些政治声明,比如将自己与邻国区分开来。因此,没有简单的永久清单

Java附带了时区数据库的副本。如果您关心的任何区域发生更改,则需要在Java安装中更新此数据。Oracle在其实现过程中为这项工作提供了一个工具;我不知道其他人。同样,您还应该更新主机操作系统中的tzdata以及其他实用程序,如数据库

对于Java中对ZoneId对象的引用,可以将一些定义为常量。time类是线程安全的。因此,可以将单个实例保持为常量

public class TimeUtils {
    static public ZoneId ZONEID_EUROPE_PARIS = ZoneId.of( "Europe/Paris" ) ;
    static public ZoneId ZONEID_ASIA_KOLKATA = ZoneId.of( "Asia/Kolkata" ) ;
}
您有一个LocalDateTime表示潜在的时刻,而不是时间线上的特定点。LocalDateTime没有时区或偏移量信息。因此,今年6月1日中午的LocalDateTime可能意味着许多不同的时刻,第一个没有 在时区比UTC提前14小时偏移的情况下发生。孟加拉国的中午来得晚,法国巴黎的中午还要晚几个小时。因此,在为上下文应用时区之前,LocalDateTime没有实际意义

LocalDateTime noon1June2017Anywhere = LocalDateTime.of( 2017 , Month.JUNE , 1 , 12 , 0);
在需要区域ID的地方使用这些常量

请注意,2017年6月1日欧洲议会和2017年6月1日亚洲议会是两个不同的时刻,时间线上的不同点。印度的中午时间比法国早得多

让我们将UTC中的这两个值视为即时对象。这两个瞬间物体并不相等,因为加尔各答天体比巴黎天体早几个小时

Instant instantNoon1June2017EuropeParis = noon1June2017EuropeParis.toInstant() ;  // Extract the same moment but in UTC zone.
Instant instantNoon1June2017AsiaKolkata = noon1June2017AsiaKolkata.toInstant() ; // Extract the same moment but in UTC zone.
外化 如果您的问题的目的是将应用哪个区域的决定具体化,以便您可以在不重新编译源代码的情况下更改该选择,只需将区域名称的字符串(如Europe/Paris)作为字符串存储在某些外部资源中即可

将字符串传递给ZoneId.of

人们常用的可能存储机制:

将文本存储在文件中。 将文本存储在数据库行中,以便应用程序检索。 将文本作为条目存储在JNDI设施LDAP服务器中,将配置文件存储在Servlet容器中,等等。请参阅 来自Web服务的查询。看见 询问用户的首选项,并将字符串作为属性存储在诸如类成员之类的变量中,或存储在Servlet环境中的上下文对象或会话对象上。您可以通过调用为用户提供所有区域的选择列表。
您可以请求JVM的当前默认区域:ZoneId.systemDefault。但请注意,JVM中任何应用程序中的任何代码都可以随时更改此设置。

请给出一个您想要实现的示例。示例代码中的dateTime是什么?您的问题在编写时没有意义。最佳实践是在以下方面完成大部分工作:日志记录、业务逻辑、数据存储和数据交换/序列化。仅在业务问题或向用户演示时需要使用时区。UTC值的基本java.time类与Instant.now中的Instant相同。我相信我们在您最近的其他问题中已经广泛地讨论了这一点。如果您想根据欧洲/巴黎的时区来计算时间,那么您是否将其称为欧洲/巴黎或FR或ConstantHoldingClass.Europe_Paris或ConstantHoldingClass.FR并不重要。这些都是“硬编码”。如果您“不想硬编码时区”,则必须将其作为程序的参数或配置选项。除非您想使用systemDefault,这已经是一个环境选项了……一个想法是将Europe/Paris放在一个属性文件中,您的应用程序在启动时或第一次需要时区时读取该文件。它是否适合您取决于您的需求、体系结构和开发周期。各种变体包括将其放入数据库表中。请给出一个您想要实现的示例。示例代码中的dateTime是什么?您的问题在编写时没有意义。最佳实践是在以下方面完成大部分工作:日志记录、业务逻辑、数据存储和数据交换/序列化。仅在业务问题或向用户演示时需要使用时区。UTC值的基本java.time类与Instant.now中的Instant相同。我相信我们在您最近的其他问题中已经广泛地讨论了这一点。如果您想根据欧洲/巴黎的时区来计算时间,那么您是否将其称为欧洲/巴黎或FR或ConstantHoldingClass.Europe_Paris或ConstantHoldingClass.FR并不重要。这些都是“硬编码”。如果您“不想硬编码时区”,则必须将其作为程序的参数或配置选项。除非您想使用systemDefault,这已经是一个环境选项了……一个想法是将Europe/Paris放在一个属性文件中,您的应用程序在启动时或第一次需要时区时读取该文件。它是否适合您取决于您的需求、体系结构和开发周期。变化包括将其放入数据库表中。