Java 8 ile UTC formatında DateTime nasıl saklanır?
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
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.