J'essaye de convertir de java.sql.timestamp
à OffsetDateTime
de sorte que je puisse retourner ISO8601
chaîne standard dans mon api de repos. J'utilise ce code pour convertir timestamp
à OffsetDateTime
ID invalide pour ZoneOffset
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);
}
Cependant, le code échoue à ZoneOffset offset = ZoneOffset.of(timezone)
pour la valeur Europe/Copenhagen
.
J'utilise le code suivant pour imprimer la liste de tous les fuseaux horaires et je ne vois Europe/Copenhagen
dans cette liste
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);
}
Maintenant, je ne comprends pas ce qui se passe. Comment puis-je convertir java.sql.timestamp
-ISO8601
chaîne (je ne se soucient pas si je dois utiliser OffsetDateTime
ou non. Je préférerais ne pas utiliser une bibliothèque tierce partie
Quel est votre type de données dans votre base de données? horodatage avec fuseau horaire? Autre chose? – Tunaki
Dans la base de données j'ai timestam par exemple, «2016-05-23 15: 00: 00.0» et j'ai une autre colonne qui a un fuseau horaire, par exemple, «Europe/Copenhague». C'est pourquoi je passe 'timezone' comme une chaîne séparée. –
L'expression 'ZoneOffset.of (" Europe/Copenhagen ")' doit échouer car cet ID de zone n'est PAS un simple décalage (contient des informations supplémentaires telles que les règles d'économie d'énergie). Dans ce cas, vous devez d'abord construire un 'ZonedDateTime', puis en déduire un' OffsetDateTime' ou un 'Instant'. –