Próbuję sformatować Instant na ciąg za pomocą nowego interfejsu API Java 8 i wzoru:
Instant instant = ...;
String out = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(instant);
Korzystając z powyższego kodu, otrzymuję wyjątek, który dotyczy nieobsługiwanego pola:
java.time.temporal.UnsupportedTemporalTypeException: Unsupported field: YearOfEra
at java.time.Instant.getLong(Instant.java:608)
at java.time.format.DateTimePrintContext.getValue(DateTimePrintContext.java:298)
...
yyyy-MM-dd hh:mm:ss
format:DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss").withZone(ZoneId.of("Europe/Paris"));
źródło
Dzięki temu nie musisz przechodzić na UTC. Jednak ramy czasowe niektórych języków mogą nie obsługiwać milisekund, więc powinieneś to zrobić
źródło
Instant
Klasa nie zawiera informacji o strefie, to tylko sklepy timestamp w milisekundach od epoki UNIX, czyli 1 stycznia 1070 od UTC. Formater nie może więc wydrukować daty, ponieważ data jest zawsze drukowana dla konkretnej strefy czasowej. Powinieneś ustawić strefę czasową na formatowanie i wszystko będzie dobrze, tak:źródło
Lub jeśli nadal chcesz używać formatera utworzonego ze wzorca, możesz po prostu użyć LocalDateTime zamiast Instant:
źródło
Instanty są już w UTC i mają już domyślny format daty rrrr-MM-dd . Jeśli jesteś z tego zadowolony i nie chcesz zadzierać ze strefami czasowymi lub formatowaniem, możesz również
toString()
:Nie chcesz T i Z? (Z oznacza, że ta data to UTC. Z oznacza „Zulu”, inaczej „przesunięcie zerowej godziny”, czyli UTC):
Chcesz milisekund zamiast nanosekund? (Więc możesz wstawić go do zapytania SQL):
itp.
źródło
Uważam, że to może pomóc, być może będziesz musiał użyć jakiejś zmiany lokalizacji lokalnej zamiast natychmiastowej
źródło