如何使用 Java 8 以 UTC 格式存储 DateTime?
How to store DateTime at UTC format with Java 8?
Spring 引导版本 2.3.1
.
我有以下 class:
@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;
在本地存储事件后,我必须将它发送到后端。
目前,发送数据如下:
"createdAt" : "2020-10-01T17:15:23.481"
但是,后端需要以下数据格式:
"createdAt" : "2020-10-01T17:15:23Z"
该应用程序的主要思想是将事件发送到后端。
所以我需要发送他们期望的准确数据。
看了下面的回答后:
- What is this date format? 2011-08-12T20:17:46.384Z
无法理解我必须如何在本地存储该字段?
我需要换到 OffsetDateTime
或 ZonedDateTime
吗?
此外,我想使用 Java 8 日期时间 API.
要控制日期时间设置,请使用以下实用程序 class:
@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();
}
}
我在任何应该创建新日期时间的地方使用它。
使用Java8和Spring引导存储ISO 8601数据时间格式的最佳策略是什么?
此处 LocalDateTime
的问题在于它根本不存储偏移量或时区,这意味着您无法将其格式化为包含 Z
的 String
对于 UTC 分别是 +00:00
.
的偏移量
我会使用一个 ZonedDateTime
,它将有一个偏移量和一个区域 ID,格式使用特定的 DateTimeFormatter
(不完全知道你的注释将如何处理这个)。
这是一个简单的小 Java 示例:
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")));
}
这个小例子的输出是(几秒钟前):
2020-10-01T15:06:16.705916600Z
2020-10-01T15:06:16.7059166Z
2020-10-01T15:06:16Z
我认为您可以在 @JSONFormat
注释中使用这样的模式。不完全确定,但现在无法查询。
Spring 引导版本 2.3.1
.
我有以下 class:
@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;
在本地存储事件后,我必须将它发送到后端。 目前,发送数据如下:
"createdAt" : "2020-10-01T17:15:23.481"
但是,后端需要以下数据格式:
"createdAt" : "2020-10-01T17:15:23Z"
该应用程序的主要思想是将事件发送到后端。
所以我需要发送他们期望的准确数据。
看了下面的回答后:
- What is this date format? 2011-08-12T20:17:46.384Z
无法理解我必须如何在本地存储该字段?
我需要换到 OffsetDateTime
或 ZonedDateTime
吗?
此外,我想使用 Java 8 日期时间 API.
要控制日期时间设置,请使用以下实用程序 class:
@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();
}
}
我在任何应该创建新日期时间的地方使用它。
使用Java8和Spring引导存储ISO 8601数据时间格式的最佳策略是什么?
此处 LocalDateTime
的问题在于它根本不存储偏移量或时区,这意味着您无法将其格式化为包含 Z
的 String
对于 UTC 分别是 +00:00
.
我会使用一个 ZonedDateTime
,它将有一个偏移量和一个区域 ID,格式使用特定的 DateTimeFormatter
(不完全知道你的注释将如何处理这个)。
这是一个简单的小 Java 示例:
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")));
}
这个小例子的输出是(几秒钟前):
2020-10-01T15:06:16.705916600Z
2020-10-01T15:06:16.7059166Z
2020-10-01T15:06:16Z
我认为您可以在 @JSONFormat
注释中使用这样的模式。不完全确定,但现在无法查询。