在joda时间如何在不改变时间的情况下转换时区

Abh*_*bhi 54 java datetime jodatime

我从数据库获取UTC时间戳,我正在设置为JodaTime DateTime实例

DateTime dt = new DateTime(timestamp.getTime());
Run Code Online (Sandbox Code Playgroud)

它存储时间完美,10:00 AM但与当地时区.例如,我在IST时区,距离UTC +5:30

我已经尝试了很多改变时区的东西,但是10:00 AM通过使用+5:30的不同,它可以将时间从其他东西改变为其他东西

有什么办法可以在不影响当前时间的情况下更改TimeZone

编辑:如果我现在的时间是:

2013-09-25 11:27:34 AM      UTC
Run Code Online (Sandbox Code Playgroud)

以下是我使用它时的结果 new DateTime(timestamp.getTime());

2013-09-25 11:27:34 AM  Asia/Kolkata
Run Code Online (Sandbox Code Playgroud)

以下是我使用时的结果new DateTime(timestamp.getTime(), DateTimeZone.UTC);

2013-09-25 05:57:34 AM  UTC
Run Code Online (Sandbox Code Playgroud)

Ily*_*lya 47

您可以使用类LocalDateTime

LocalDateTime dt = new LocalDateTime(t.getTime()); 
Run Code Online (Sandbox Code Playgroud)

并转换LocalDateTimeDateTime

DateTime dt = new LocalDateTime(timestamp.getTime()).toDateTime(DateTimeZone.UTC);  
Run Code Online (Sandbox Code Playgroud)

Joda DateTime在任何时候都会毫不犹豫地对待"自1970年以来在当前时区的毫升".因此,在创建DateTime实例时,会使用当前时区创建实例.


jgm*_*jgm 45

您可以使用更改时区的withZoneRetainFields()方法DateTime而不更改日期中的数字.

  • 请谨慎使用这种情况,因为如果您在夏令时配置的环境中使用它,它可能会在时移时引发异常.如果您有日期文本,您可能更喜欢这样的解决方案http://stackoverflow.com/questions/5451152/how-to-handle-jodatime-illegal-instant-due-to-time-zone-offset-transition? answertab =票#制表顶 (2认同)

Stv*_*dll 12

如果您的时间戳是:2015-01-01T00:00:00.000-0500(这是当地时间[对我而言])

试试这个:

DateTime localDt = new DateTime(timestamp.getTime())
    .withZoneRetainFields(DateTimeZone.UTC)
    .withZone(DateTimeZone.getDefault());
Run Code Online (Sandbox Code Playgroud)

2014-12-31T19:00:00.000-05:00

分解:这为您提供了与您的时间戳对应的DateTime,指定它是UTC:

new DateTime(timestamp.getTime())
    .withZoneRetainFields(DateTimeZone.UTC)
Run Code Online (Sandbox Code Playgroud)

2015-01-01T00:00:00.000Z

这为您提供了DateTime,但时间转换为您当地时间:

new DateTime(timestamp.getTime())
    .withZoneRetainFields(DateTimeZone.UTC)
    .withZone(DateTimeZone.getDefault());
Run Code Online (Sandbox Code Playgroud)

2014-12-31T19:00:00.000-05:00