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
Java 使用两个LocalDateTime实例计算持续时间_Java_Date_Time_Timezone_Jodatime - Fatal编程技术网

Java 使用两个LocalDateTime实例计算持续时间

Java 使用两个LocalDateTime实例计算持续时间,java,date,time,timezone,jodatime,Java,Date,Time,Timezone,Jodatime,我试图计算LocalDateTime的两个实例之间的持续时间。这里的特殊之处在于,LocalDateTime的每个实例都可以来自世界任何地方: LocalDateTime start可以来自内华达州,LocalDateTime end可以来自东京。显然,与LocalDateTime关联的每个“时间”都是该位置的本地时间 所以如果我说 LocalDateTime start=LocalDateTime.parse(“2015-07-14T10:00:00”)并说start代表芝加哥,这意味着芝加哥

我试图计算
LocalDateTime
的两个实例之间的持续时间。这里的特殊之处在于,
LocalDateTime
的每个实例都可以来自世界任何地方:

LocalDateTime start
可以来自内华达州,
LocalDateTime end
可以来自东京。显然,与
LocalDateTime
关联的每个“时间”都是该位置的本地时间

所以如果我说

LocalDateTime start=LocalDateTime.parse(“2015-07-14T10:00:00”)并说
start
代表芝加哥,这意味着芝加哥时间上午10:00。 然后我可以说

LocalDateTime end=LocalDateTime.parse(“2015-07-14T03:00:00”)
end
代表莫斯科,所以现在是莫斯科时间凌晨3点

我能否创建一个足够强大的解决方案,使
开始
结束
能够代表世界上的任何城市,并且仍然能够正确计算这两个城市之间的持续时间?

“LocalDateTime”并不是指某个特定的地区 我想你误解了
LocalDateTime
的目的。“本地”是指任何地点,而不是特定地点。正如“2015年12月25日午夜开始的圣诞节”中所说,我们指的是任何地方的午夜。例如,巴黎的圣诞节比蒙特勒尔早几个小时开始

如果您知道日期时间表示内华达州的日期时间,请使用分配给
America/Boise
的Joda时间
DateTime
。在Java 8及更高版本中内置的新()中,使用具有指定时区的对象

同样,如果您知道日期时间是东京本地的,请不要使用
LocalDateTime
。使用指定时区为亚洲/东京的Joda Time
DateTime

逝去 一对
LocalDateTime
实例之间经过的时间毫无意义。例如,同一日期的时间可能是14:00和18:00,但这并不意味着有四个小时的差异。如果你真的是指巴黎的14:00和芝加哥的18:00,那将是几个小时的差异,而不是两个小时

我不是在讨论计算经过的时间,因为在StackOverflow上已经处理过很多次了。我想在这里澄清一些概念。然后你就可以继续看电影了

数据库存储UTC 通常,在SQL数据库中,您应该将数据类型
TIMESTAMP与时区一起使用(又称
TIMESTAMP与
Z一起使用)。这个用词不当实际上是指“关于时区”。带有偏移或其他时区信息的传入数据调整为UTC。数据的偏移量或时区不保留

不带时区的SQL数据类型
TIMESTAMP
(又称
TIMESTAMP
)与Java中的
LocalDateTime
意思相同:根本没有时区。与时间线无关。忽略任何带有输入数据的偏移量或时区信息,不进行任何调整

也许有助于解释

坚持UTC 从数据库检索此类值时,UTC值可通过您的管理工具(如Postgres中的pgAdmin)或数据库驱动程序或应用程序调整为特定时区

在您的应用程序中,通常最好尽可能将日期时间值保持为UTC。几乎所有的存储、业务逻辑和数据交换都使用UTC。仅在用户期望时调整到特定时区

将LocalDateTime转换为时区的步骤 如果您确实有一个
LocalDateTime
对象,并且希望为其分配一个时区,下面是一些示例代码。我们还进行了调整,以获得与蒙特勒尔和UTC相同的时刻。首先,该示例在Joda Time中显示,然后在java.Time中显示

乔达时间 Joda Time 2.8中的示例

LocalDateTime ldt = new LocalDateTime( "2015-07-14T10:00:00" );  // Nowhere in particular.
DateTimeZone zoneChicago = DateTimeZone.forID( "America/Chicago" );
DateTime dateTimeChicago = ldt.toDateTime( zoneChicago );
DateTime dateTimeMontreal = dateTimeChicago.withZone( DateTimeZone.forID( "America/Montreal" ) );
DateTime dateTimeUtc = dateTimeChicago.withZone( DateTimeZone.UTC );
转储到控制台

System.out.println( "LocalDateTime (nowhere): " + ldt );
System.out.println( "Chicago: " + dateTimeChicago );
System.out.println( "Montréal: " + dateTimeMontreal );
System.out.println( "UTC: " + dateTimeUtc);
System.out.println( "LocalDateTime (nowhere): " + ldt );
System.out.println( "Chicago: " + zdtChicago );
System.out.println( "Montréal: " + zdtMontreal );
System.out.println( "UTC: " + zdtUtc);
跑步的时候

LocalDateTime(无处):2015-07-14T10:00:00.000
芝加哥:2015-07-14T10:00:00.000-05:00
艾尔山:2015-07-14T11:00:00.000-04:00
UTC:2015-07-14T15:00:00.000Z
java.time java 8更新51的java.time中的示例

LocalDateTime ldt = LocalDateTime.parse( "2015-07-14T10:00:00" );  // Nowhere in particular.
ZoneId zoneChicago = ZoneId.of( "America/Chicago" );
ZonedDateTime zdtChicago = ZonedDateTime.of( ldt, zoneChicago );
ZonedDateTime zdtMontreal = zdtChicago.withZoneSameInstant( ZoneId.of( "America/Montreal" ) );
ZonedDateTime zdtUtc = zdtChicago.withZoneSameInstant( ZoneOffset.UTC ); // ZoneOffset is a subclass of ZoneId.
转储到控制台

System.out.println( "LocalDateTime (nowhere): " + ldt );
System.out.println( "Chicago: " + dateTimeChicago );
System.out.println( "Montréal: " + dateTimeMontreal );
System.out.println( "UTC: " + dateTimeUtc);
System.out.println( "LocalDateTime (nowhere): " + ldt );
System.out.println( "Chicago: " + zdtChicago );
System.out.println( "Montréal: " + zdtMontreal );
System.out.println( "UTC: " + zdtUtc);
跑步的时候

LocalDateTime(无处):2015-07-14T10:00
芝加哥:2015-07-14T10:00-05:00[美国/芝加哥]
蒙特利尔:2015-07-14T11:00-04:00[美国/蒙特利尔]
UTC:2015-07-14T15:00Z
“LocalDateTime”并不表示特定的地区 我想你误解了
LocalDateTime
的目的。“本地”是指任何地点,而不是特定地点。正如“2015年12月25日午夜开始的圣诞节”中所说,我们指的是任何地方的午夜。例如,巴黎的圣诞节比蒙特勒尔早几个小时开始

如果您知道日期时间表示内华达州的日期时间,请使用分配给
America/Boise
的Joda时间
DateTime
。在Java 8及更高版本中内置的新()中,使用具有指定时区的对象

同样,如果您知道日期时间是东京本地的,请不要使用
LocalDateTime
。使用指定时区为亚洲/东京的Joda Time
DateTime

逝去 一对
LocalDateTime
实例之间经过的时间毫无意义。例如,同一日期的时间可能是14:00和18:00,但这并不意味着有四个小时的差异。如果你真的是指巴黎的14:00和芝加哥的18:00,那将是几个小时的差异,而不是两个小时

我不是在讨论计算经过的时间,因为在StackOverflow上已经处理过很多次了。我想在这里澄清一些概念。然后你就可以继续看电影了

数据库存储UTC 通常,在SQL数据库中,您应该将数据类型
TIMESTAMP与时区一起使用(又称
TIMESTAMP与
Z一起使用)。这个用词不当实际上是指“关于时区”。带有偏移或其他时区信息的传入数据