问题描述
如何转换长时间戳,例如2556072000000L
,到指定时区偏移量的字符串,例如+08:30
?我研究了 Joda 方法,但没有找到解决方案。
同样,如何转换字符串时间戳,例如2050-12-31T04:00:00Z
,到指定时区偏移量的字符串,例如+08:30
?
2050-12-31T12:30:00+08:30
在指定的偏移量中是预期的。
将 +08:30
解析为三部分:+
、小时偏移量(8
)和分钟偏移量(30
),将偏移量添加到 timestamp
或dateTime
可能是一个解决方案。但是,我想知道是否已经有解决方案,这样我就不需要重新发明轮子了?
/*
* timestamp: 2556072000000L (2050-12-31T04:00:00Z)
* offset: +08:30
* return: 2050-12-31T12:30:00+08:30
*/
String toOffset(long timestamp,String offset);
/*
* dateTime: 2050-12-31T04:00:00Z
* offset: +08:30
* return: 2050-12-31T12:30:00+08:30
*/
String toOffset(String dateTime,String offset);
解决方法
阅读此 article,我得到了问题的答案。这是:
import java.time.ZoneOffset;
/*
* timestamp: 2556072000000L (2050-12-31T04:00:00Z)
* offset: +08:30
* return: 2050-12-31T12:30:00+08:30
*/
public String toOffset(long timestamp,String offset); { // +08:30
DateTime time = new DateTime(timestamp + getOffsetMillis(offset));
time = time.withZone(DateTimeZone.forID(DateTimeZone.UTC.getID())); // 2050-12-31T12:30:00Z
DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss");
String dateStr = time.toString(formatter); // 2050-12-31T12:30:00
return dateStr + offset; // 2050-12-31T12:30:00+08:30
}
public long getOffsetMillis(String offset) { // +08:30
ZoneOffset zoneOffSet = ZoneOffset.of(offset);
return zoneOffSet.getTotalSeconds() * 1000; // (8 * 60 * 60 + 30 * 60) * 1000
}
请注意时区偏移量必须在 [-18:00,+18:00] 的包含范围内。以下引自JDK document
在 2008 年,世界各地的时区偏移量从 -12:00 扩展到 +14:00。为防止扩展该范围出现任何问题,但仍提供验证,偏移范围限制为 -18:00 到 18:00(含)。
如果查看 Joda 时区 table,您会发现所有时区的偏移量都在 [-12:00,+14:00] 范围内。