我正在接收一个 java.sql.Timestamp 格式的 UTC 时间戳,例如:
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
我认为这可能会起作用
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)
另一个答案似乎不必要地复杂。这是我使用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