Java 8 ile UTC formatında DateTime nasıl saklanır?

Oct 01 2020

Spring Boot versiyonu 2.3.1.

Aşağıdaki sınıfa sahibim:

@Data
@Entity
@NoArgsConstructor
public class CarParkEvent implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Enumerated(EnumType.STRING)
    private EventType eventType;

    @Column(columnDefinition = "TIMESTAMP")
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createdAt;

Olayı yerel olarak kaydettikten sonra arka uca göndermem gerekiyor. Şimdilik veri göndermek şu şekildedir:

"createdAt": "2020-10-01T17: 15: 23.481"

Ancak, arka uç aşağıdaki veri biçimini bekler:

"createdAt": "2020-10-01T17: 15: 23Z"

Uygulamanın ana fikri, olayları arka uca göndermektir .
Bu yüzden onların bekledikleri kesin verileri göndermem gerekiyor.

Aşağıdaki cevaplara baktıktan sonra:

  • Bu tarih biçimi nedir? 2011-08-12T20: 17: 46,384Z
  • LocalDateTime “yyyy-MM-dd'T'HH:mm:ss'Z'”biçimine nasıl dönüştürülür

Bu alanı yerel olarak tam olarak nasıl saklamam gerektiğini anlayamadınız mı?

OffsetDateTimeVeya geçiş yapmam gerekiyor ZonedDateTimemu?

Ayrıca Java 8 Date Time API kullanmak istiyorum .

Tarih saat ayarını kontrol etmek için aşağıdaki fayda sınıfını kullanın:

@Slf4j
@UtilityClass
public class TimeClock {

    private LocalDateTime dateTime;

    public LocalDateTime getCurrentDateTime() {
        return (dateTime == null ? LocalDateTime.now() : dateTime);
    }

    public void setDateTime(LocalDateTime date) {
        log.info("Set current date for application to: {}", date);
        TimeClock.dateTime = date;
    }

    public void resetDateTime() {
        log.info("Reset date for the application");
        TimeClock.dateTime = LocalDateTime.now();
    }

    /**
     * Different formats for current dateTime.
     */
    public LocalDate getCurrentDate() {
        return getCurrentDateTime().toLocalDate();
    }

    public LocalTime getCurrentTime() {
        return getCurrentDateTime().toLocalTime();
    }
}

Yeni tarih-saatin oluşturulması gereken her yerde kullanıyorum.

ISO 8601 veri zaman formatını Java 8 ve Spring Boot ile depolamak için en iyi strateji nedir ?

Yanıtlar

deHaar Oct 01 2020 at 22:08

Buradaki sorun, LocalDateTimebasitçe bir uzaklık veya saat dilimini saklamamasıdır, bu da onu UTC için sırasıyla bir ofset Stringiçeren bir şekilde biçimlendiremeyeceğiniz anlamına gelir .Z+00:00

Ben kullanacağı ZonedDateTimebir ofset ve bir bölge kimliğe sahip olacak ve biçimi özgü kullanarak hangi DateTimeFormatter(tam olarak ek açıklama bu nasıl işleyeceğini bilmiyorum).

İşte küçük ve sade bir Java örneği:

public static void main(String[] args) {
    // get an example time (the current moment) in UTC
    ZonedDateTime now = ZonedDateTime.now(ZoneOffset.UTC);
    // print its toString (implicitly)
    System.out.println(now);
    // format it using a built-in formatter
    System.out.println(now.format(DateTimeFormatter.ISO_ZONED_DATE_TIME));
    // or define a formatter yourself and print the ZonedDateTime using that
    System.out.println(now.format(DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ssz")));
}

Bu küçük örneğin çıktısı (birkaç saniye önce):

2020-10-01T15:06:16.705916600Z
2020-10-01T15:06:16.7059166Z
2020-10-01T15:06:16Z

@JSONFormatEk açıklamada böyle bir kalıp kullanabileceğinizi düşünüyorum . Tam olarak emin değilim, ama şimdi bakamam.