【发布时间】:2016-08-25 03:48:07
【问题描述】:
我正在尝试从java.sql.timestamp 转换为OffsetDateTime,以便我可以在我的rest api 中返回ISO8601 标准字符串。我正在使用此代码将 timestamp 转换为 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 offset = ZoneOffset.of(timezone) 处失败,值 Europe/Copenhagen。
我使用以下代码打印所有时区的列表,我确实在该列表中看到了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。我不想使用任何第三方库
【问题讨论】:
-
您的数据库中的数据类型是什么?带时区的时间戳?还有什么?
-
在数据库中我有时间戳,例如
2016-05-23 15:00:00.0,我还有另一列有时区,例如Europe/Copenhagen。这就是为什么我将timezone作为单独的字符串传递。 -
表达式
ZoneOffset.of("Europe/Copenhagen")必须失败,因为该区域 id 不仅仅是一个偏移量(包含诸如夏令时规则之类的附加信息)。在这种情况下,您必须首先构造一个ZonedDateTime,然后从中派生一个OffsetDateTime或Instant。
标签: mysql date java-8 timestamp datetimeoffset