我試圖從java.sql.timestamp
轉換爲OffsetDateTime
,這樣我就可以在我的rest api中返回ISO8601
標準字符串。我使用這個代碼轉換從timestamp
到OffsetDateTime
ZoneOffset的ID無效ID
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
與否。我寧願不使用任何第三方庫
什麼是您的數據類型在你的數據庫?帶時區的時間戳?還有別的嗎? – Tunaki
在數據庫中,我有時間戳,例如「2016-05-23 15:00:00:00」,我有另一個有時區的列,例如「歐洲/哥本哈根」。這就是爲什麼我將'timezone'作爲單獨的字符串傳遞。 –
表達式'ZoneOffset.of(「歐洲/哥本哈根」)'必須失敗,因爲該區域標識不僅僅是偏移量(包含夏令時規則等附加信息)。在這種情況下,您首先需要構建一個'ZonedDateTime',然後從中派生出'OffsetDateTime'或'Instant'。 –