Java 是否将带时区的Joda Time`DateTime`转换为不带时区的DateTime?

Java 是否将带时区的Joda Time`DateTime`转换为不带时区的DateTime?,java,datetime,jodatime,Java,Datetime,Jodatime,给出一个例子,例如2015-07-09T05:10:00+02:00使用什么 如何将其转换为本地时间,这意味着将时区添加到时间本身。 期望输出:2015-07-09T07:10:00 我尝试了dateTime.toDateTime(DateTimeZone.UTC),但没有得到理想的结果。没有时区的dateTime没有意义。DateTime始终相对于使用它们的时区。如果没有时区信息,日期-时间组合对地理环境本身就没有任何意义。然而,原始时间戳毫秒可以作为自1970年1月1日以来消失的毫秒数来访问

给出一个例子,例如
2015-07-09T05:10:00+02:00
使用什么

如何将其转换为本地时间,这意味着将时区添加到时间本身。 期望输出:
2015-07-09T07:10:00


我尝试了
dateTime.toDateTime(DateTimeZone.UTC)
,但没有得到理想的结果。

没有时区的dateTime没有意义。DateTime始终相对于使用它们的时区。如果没有时区信息,日期-时间组合对地理环境本身就没有任何意义。然而,原始时间戳毫秒可以作为自1970年1月1日以来消失的毫秒数来访问,但任何具体的日期-时间组合都必须有一个时区。

Nazgul所说的是正确的,但如果您只想在UTC区域实现“墙时间”,您可以这样做:

DateTime dateTimePlus2 = DateTime.parse("2015-07-09T05:10:00+02:00");
System.out.println(dateTimePlus2);

DateTime dateTimeUTC = dateTimePlus2.withZone(DateTimeZone.UTC);
System.out.println(dateTimeUTC);

LocalDateTime localDateTimeUTC = dateTimeUTC.toLocalDateTime();
System.out.println(localDateTimeUTC);
结果:

2015-07-09T05:10:00.000+02:00
2015-07-09T03:10:00.000Z        ("Z" == Zulu tz == UTC)
2015-07-09T03:10:00.000

如您所见,时间并非如您所预期的“07:10”,因为UTC+2区域比UTC早两个小时。转换为UTC将减去2小时。

为正确答案添加更多信息和示例(和)

更新在java.time类的末尾添加了一节。这些取代了乔达时代

LocalDateTime的目的
你可能会对这个计划的目的感到困惑

如果试图使用某个地区的人查看自己的时钟和日历时看到的“挂钟时间”来表示日期时间值,则调整
DateTime
对象的时区以适合所需的地区

LocalDateTime不是针对特定的地区,而是针对日期+时间的一般概念。例如,“今年的圣诞节从2014年12月25日午夜开始”。从概念上讲,这是一个LocalDateTime,意指巴黎与蒙特勒尔和奥克兰不同的时刻

调整时区 使用Joda Time中的
DateTimeZone
类调整到所需的时区。Joda Time使用不可变对象。因此,我们不是更改时区(“mutate”),而是基于旧的但具有所需差异(其他一些时区)的DateTime对象实例化一个新的DateTime对象

使用适当的工具。通常为
大陆/城市或地区

DateTimeZone zoneParis = DateTimeZone.forID( "Europe/Paris" );
DateTimeZone zoneMontréal = DateTimeZone.forID( "America/Montreal" );
DateTimeZone zoneAuckland = DateTimeZone.forID( "Pacific/Auckland" );
解析字符串,指定时区,调整到其他时区

DateTime dateTimeParis = new DateTime( "2015-07-09T05:10:00+02:00" , zoneParis );
DateTime dateTimeMontréal = dateTimeParis.withZone( zoneMontréal );
DateTime dateTimeAuckland = dateTimeParis.withZone( zoneAuckland );
转储到控制台

System.out.println( "dateTimeParis: " + dateTimeParis );
System.out.println( "dateTimeMontréal: " + dateTimeMontréal );
System.out.println( "dateTimeAuckland: " + dateTimeAuckland );
跑步的时候

dateTimeParis: 2015-07-09T05:10:00.000+02:00
dateTimeMontréal: 2015-07-08T23:10:00.000-04:00
dateTimeAuckland: 2015-07-09T15:10:00.000+12:00
使用格式化字符串本地化 在创建日期时间对象的字符串表示形式时,Joda Time可以转换为特定区域设置的语言和习惯样式

DateTimeFormatter formatterMontréal = DateTimeFormat.forStyle( "FF" ).withZone( zoneMontréal ).withLocale( Locale.CANADA_FRENCH );
String outputMontréal = formatterMontréal.print( dateTimeParis );
System.out.println( "outputMontréal: " + outputMontréal );
运行时:

outputMontréal: mercredi 8 juillet 2015 23 h 10 EDT

java.time 该项目现已启动,建议迁移到类。Joda时间框架启发了java.Time,因此概念非常相似

ZoneId
ZoneOffset
是分别表示时区和的两个类。偏移量只是小时数、分数和秒数。时区是一个偏移量加上一组处理异常的规则,如夏令时(DST)

java.time中的主要日期时间类有:

  • –时间轴上的一个瞬间,分辨率为(小数点后最多九(9)位)
  • –一个
    即时
    加上一个
    
  • –一个
    即时
    加上一个
在解析/生成表示日期时间值的字符串时,java.time类默认使用标准格式。因此,无需使用此类输入指定格式化模式

这里的输入表示一个时区,但不是一个完整的时区。因此,我们将其解析为
OffsetDateTime
,而不是
zoneDateTime

OffsetDateTime odt = OffsetDateTime.parse( "2015-07-09T05:10:00+02:00" );
作为java.time的基本构建块,您可能需要提取一个
即时

Instant instant = odt.toInstant();  // `Instant` is always in UTC by definition.
你可以调整到一个时区

ZonedDateTime zdtParis = odt.atZoneSameInstant( zoneParis );
ZonedDateTime zdtMontreal = odt.atZoneSameInstant( zoneMontreal );
ZonedDateTime zdtAuckland = zdtMontreal.withZoneSameInstant( zoneAuckland );
通过类进行本地化

odt:2015-07-09T05:10+02:00

瞬间:2015-07-09T03:10:00Z

zdtParis:2015-07-09T05:10+02:00[欧洲/巴黎]

ZDTM合同:2015-07-08T23:10-04:00[美国/蒙特利尔]

zdtAuckland:2015-07-09T15:10+12:00[太平洋/奥克兰]

产出:mercredi 8 juillet 2015年美国东部夏令时23小时10分


关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

该项目现已启动,建议迁移到类

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是

从哪里获得java.time类

  • 后来
    • 内置的
    • 标准JavaAPI的一部分,带有捆绑实现
    • Java9添加了一些次要功能和修复
    • 大部分java.time功能都在中向后移植到Java6和Java7
    • 该项目专门针对Android采用了Three Ten Backport(如上所述)

该项目使用其他类扩展了java.time。这个项目是java.time将来可能添加的一个试验场。您可以在这里找到一些有用的类,例如、、和。

我可以使用哪一个joda对象作为只有日期+时间但没有时区的替代对象?不,我想您不能。但是你能做的是让所有有关日期时间的时区都相同(最好都是UTC),这样在比较或对其进行任何操作时,时区就不是一个区分因素。感谢你的详细见解!这个“挂钟时间”正是我需要的,但我不知道时间应该在哪个时区,只是时间本身。所以我可能不得不选择LocalDateTime…非常有启发性。
ZonedDateTime zdtParis = odt.atZoneSameInstant( zoneParis );
ZonedDateTime zdtMontreal = odt.atZoneSameInstant( zoneMontreal );
ZonedDateTime zdtAuckland = zdtMontreal.withZoneSameInstant( zoneAuckland );
DateTimeFormatter f = DateTimeformatter.ofLocalizedDateTime( FormatStyle.FULL ).withLocale( Locale.CANADA_FRENCH );
String output = zdtMontreal.format( f );