我有一个带有收据实体的Spring Boot应用程序,这里定义了一个LocalDateTime日期,如下所示:
@Nullable
@Column(name = "date_time")
private LocalDateTime dateTime;
在保存实体之前,我尝试将当前系统日期转换为以下格式:
年月日时:分:秒
但我收到一个DateTimeParseExcetion,其中包含以下文本:
java.time.format.DateTimeParseException: Text '26.12.2022 13:25:30' could not be parsed at index 0
下面是我的代码:
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm:ss", Locale.ROOT);
LocalDateTime now = LocalDateTime.now();
log.debug("REST request to save Receipt : {}", receiptDTO);
if (receiptDTO.getId() != null) {
throw new BadRequestAlertException("A new receipt cannot already have an ID", ENTITY_NAME, "idexists");
}
Optional<User> currentUser = userService.getUserWithAuthoritiesByLogin(SecurityContextHolder.getContext().getAuthentication().getName());
receiptDTO.setDateTime(LocalDateTime.parse(dtf.format(now)));
currentUser.ifPresent(user -> receiptDTO.setUser(this.UserMapper.userToUserDTO(user)));
ReceiptDTO result = receiptService.save(receiptDTO);
更新:
DateTimeFormatter dateFormat = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm:ss", Locale.ROOT);
LocalDateTime now = LocalDateTime.now();
String formattedCurrentTime = dateFormat.format(now);
LocalDateTime localdatetime = LocalDateTime.parse(formattedCurrentTime, dateFormat);
log.debug("REST request to save Receipt : {}", receiptDTO);
if (receiptDTO.getId() != null) {
throw new BadRequestAlertException("A new receipt cannot already have an ID", ENTITY_NAME, "idexists");
}
Optional<User> currentUser = userService.getUserWithAuthoritiesByLogin(SecurityContextHolder.getContext().getAuthentication().getName());
receiptDTO.setDateTime(localdatetime);
更新2:
完整方法:
@PostMapping("/receipts")
public ResponseEntity<ReceiptDTO> createReceipt(@RequestBody ReceiptDTO receiptDTO) throws URISyntaxException {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd.MM.uuuu HH:mm:ss", Locale.ENGLISH);
LocalDateTime now = LocalDateTime.now();
String formattedCurrentTime = now.format(formatter);
log.debug("REST request to save Receipt : {}", receiptDTO);
if (receiptDTO.getId() != null) {
throw new BadRequestAlertException("A new receipt cannot already have an ID", ENTITY_NAME, "idexists");
}
receiptDTO.setDateTime(now);
Optional<User> currentUser = userService.getUserWithAuthoritiesByLogin(SecurityContextHolder.getContext().getAuthentication().getName());
currentUser.ifPresent(user -> receiptDTO.setUser(this.UserMapper.userToUserDTO(user)));
ReceiptDTO result = receiptService.save(receiptDTO);
return ResponseEntity
.created(new URI("/api/receipts/" + result.getId()))
.headers(HeaderUtil.createEntityCreationAlert(applicationName, true, ENTITY_NAME, result.getId().toString()))
.body(result);
}
3条答案
按热度按时间6uxekuva1#
您似乎在
LocalDateTime
示例和它的文本表示之间感到困惑。LocalDateTime
(或任何日期-时间类型)应该保存关于日期-时间单位的信息(例如年、月、日、小时、分钟等)-如何以文本形式打印取决于您如何格式化它。默认的文本表示是LocalDateTime#toString
返回的,例如:LocalDateTime
不包含任何格式。如上所示,您可以通过在自定义模式中设置其格式来获得自定义文本表示形式。如果愿意,您可以将此字符串(这没有意义)存储在文本类型的数据库列中,或将其设置为String
变量,但您永远不能以特定格式存储或设置LocalDateTime
。代码中的以下行没有意义,也导致了错误:
你应该写得简单点
错误的原因是
LocalDateTime#parse(CharSequence text)
已实现为解析已经是ISO 8601的日期时间字符串(例如2022-12-26T13:25
),而代码中的dtf.format(now)
返回的字符串不是ISO 8601格式。从**Trail: Date Time**了解有关现代日期-时间API的更多信息。
sbdsn5lh2#
您实际上不需要编写自己的代码来设置LocalDateTime的格式。您可以使用以下注解声明它:
有关更多详细信息,请查看此处:Spring Data JPA - ZonedDateTime format for json serialization(查看接受的答案)
xmq68pz93#
从
LocalDateTime
's javadoc:开始ISO-8601日历系统中不带时区的日期时间,例如2007 - 12 - 03T10:15:30。
从
LocalDateTime
的到字符串()将此日期-时间输出为字符串,例如2007 - 12 - 03T10:15:30。输出将采用以下ISO-8601格式之一:(...)
LocalDateTime
将始终以ISO-8601格式输出日期时间。我不清楚您要做什么,但是,就我所知,您的目标只是将数据保存在数据库中。如果是这种情况,只需按原样保存日期,然后在检索时格式化以供显示。这是您的数据库的限制吗(数据库是否只接受
dd.MM.yyyy HH:mm:ss
的日期)?如果不是这样,那么在持久化之前格式化日期就没有意义了,日期格式主要用于表示和应用程序输入。