timezone - 将时间戳转换为指定的时区偏移量
问题描述
如何将长时间戳(例如)转换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);
解决方案
阅读这篇文章,我得到了我的问题的答案。这里是:
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文档
2008 年,世界各地的时区偏移从 -12:00 扩大到 +14:00。为了防止扩展该范围出现任何问题,但仍提供验证,偏移范围限制为 -18:00 到 18:00(含)。
如果查看 Joda 时区表,您会发现所有时区的偏移量都在 [-12:00, +14:00] 范围内。
推荐阅读
- chisel - 如何使用命名端口实现低电平有效复位?
- ms-access - 为什么我从访问表单中的标签中得到类型不匹配?
- java - 定义使用 API 的规则的标准方法,也许是动态 UI
- c++ - 如何在 Windows 中使用 FindNextFile 调用列出目录内容?
- crystal-reports - 在水晶报表中创建唯一的 id
- java - 如何使用 JPQL 从 SELECT 操作中获取第一行?
- python - 使用 periodindex 在具有多索引列的数据帧上进行 GroupBy
- windows - 按住 alt 键时如何防止 Windows 激活键提示?
- python - wx.KeyEvent 和非 QWERTY 键盘
- android - 引用泛型类型 T 的实例