mysql-ZoneOffset的无效ID
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了mysql-ZoneOffset的无效ID,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1721字,纯文字阅读大概需要3分钟。
内容图文
![mysql-ZoneOffset的无效ID](/upload/InfoBanner/zyjiaocheng/882/d834d6f42e5f40beb9b32e589ae4cc65.jpg)
我正在尝试从java.sql.timestamp转换为OffsetDateTime,以便可以在我的rest api中返回ISO8601标准字符串.我正在使用此代码从时间戳转换为OffsetDateTime
public static OffsetDateTime sqlTimetampeToOffsetDateTime(Timestamp ts, String timeZone)
{
if (ts == null)
{
return null;
}
Calendar cal = Calendar.getInstance();
cal.setTime(ts);
ZoneOffset offset = ZoneOffset.of(timeZone);
return OffsetDateTime.of(
cal.get(Calendar.YEAR),
cal.get(Calendar.MONTH)+1,
cal.get(Calendar.DAY_OF_MONTH),
cal.get(Calendar.HOUR_OF_DAY),
cal.get(Calendar.MINUTE),
cal.get(Calendar.SECOND),
cal.get(Calendar.MILLISECOND)*1000000,
offset);
}
但是,代码在ZoneOffset偏移量= ZoneOffset.of(timezone)处的值Europe / Copenhagen失败.
我使用以下代码来打印所有时区的列表,并且在该列表中确实看到了欧洲/哥本哈根
Set<String> allZones = ZoneId.getAvailableZoneIds();
LocalDateTime dt = LocalDateTime.now();
List<String> zoneList = new ArrayList<String>(allZones);
Collections.sort(zoneList);
for (String s : zoneList) {
ZoneId zone = ZoneId.of(s);
ZonedDateTime zdt = dt.atZone(zone);
ZoneOffset offset = zdt.getOffset();
int secondsOfHour = offset.getTotalSeconds() % (60 * 60);
String out = String.format("%35s %10s%n", zone, offset);
System.out.printf(out);
}
现在我不明白发生了什么.我如何将java.sql.timestamp转换为ISO8601字符串(我不在乎是否必须使用OffsetDateTime.我宁愿不使用任何第三方库
解决方法:
ZoneOffset仅在处理特定时间点时才有意义.在欧洲/伦敦,根据当前时间,我们目前使用BST或GMT.但是,在100年前(给予或接受),欧洲/伦敦没有BST. ZoneOffset.of()仅从内部缓存中检索区域偏移,内部缓存仅在调用ZoneOffset.ofTotalSeconds()时填充.这是有据可查的.但是,存在一个简单的解决方案:
ZoneId.of("Europe/London").getRules().getOffset(Instant.now());
现在(例如今天)返回欧洲/伦敦的正确ZoneOffset
内容总结
以上是互联网集市为您收集整理的mysql-ZoneOffset的无效ID全部内容,希望文章能够帮你解决mysql-ZoneOffset的无效ID所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。