将UTC时间戳转换为任意时区

时间:2014-04-03 08:42:06

标签: java datetime jodatime

我收到UTC中的java.sql.Timestamp,例如:

  

2014-04-03 08:25:20.0

我知道,这个时间戳是UTC。我知道这个时间戳的目标时区。例如:

  

欧洲/柏林

现在我想将UTC时间映射转换为本地化的时间戳。当然,正确的夏令时。

到目前为止我的尝试:

println(msg.timestamp)
println(new DateTime(msg.timestamp))
val storeTz = DateTimeZone.forID(store.timezone)
println(new DateTime(msg.timestamp, storeTz))
val localTimestamp = new DateTime(msg.timestamp).withZone(storeTz)
println(localTimestamp)

打印:

2014-04-03 08:25:20.0
2014-04-03T08:25:20.000+02:00
2014-04-03T07:25:20.000+01:00
2014-04-03T07:25:20.000+01:00

不应该是正确的本地化时间戳:

2014-04-03T10:25:20.000+02:00

2 个答案:

答案 0 :(得分:1)

我认为这可能有效

println(msg.timestamp)
println(new DateTime(msg.timestamp))
val storeTz = DateTimeZone.forID(store.timezone)
println(new DateTime(msg.timestamp, storeTz))
val localTimestamp = new DateTime(msg.timestamp).withZoneRetainFields(DateTimeZone.UTC).toDateTime(storeTz)
println(localTimestamp)

答案 1 :(得分:0)

另一个答案似乎不必要地复杂化。这是我使用Joda-Time 2.3。

由于夏令时无意义,柏林比UTC提前2小时。因此,如果UTC是上午8点,那么柏林是上午10点。

String inputRaw = "2014-04-03 08:25:20.0";
String input = inputRaw.replace( " ", "T" ); // Convert to strict ISO 8601 format.

DateTime dateTimeUtc = new DateTime( input, DateTimeZone.UTC );

DateTimeZone timeZoneBerlin = DateTimeZone.forID( "Europe/Berlin" );
DateTime dateTimeBerlin = dateTimeUtc.withZone( timeZoneBerlin );

转储到控制台...

System.out.println( "input: " + input );
System.out.println( "dateTimeUtc: " + dateTimeUtc );
System.out.println( "dateTimeBerlin: " + dateTimeBerlin );

跑步时......

input: 2014-04-03T08:25:20.0
dateTimeUtc: 2014-04-03T08:25:20.000Z
dateTimeBerlin: 2014-04-03T10:25:20.000+02:00