java 如何将日期时间转换为德语格式

cig3rfwq  于 2022-12-28  发布在  Java
关注(0)|答案(3)|浏览(154)

我有一个带有收据实体的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);
    }
6uxekuva

6uxekuva1#

您似乎在LocalDateTime示例和它的文本表示之间感到困惑。LocalDateTime(或任何日期-时间类型)应该保存关于日期-时间单位的信息(例如年、月、日、小时、分钟等)-如何以文本形式打印取决于您如何格式化它。默认的文本表示是LocalDateTime#toString返回的,例如:

class Main {
    public static void main(String[] args) {
        LocalDateTime now = LocalDateTime.now();
        System.out.println(now); // This prints the value of now.toString()

        // An example of textual representation in a custom format
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd.MM.uuuu HH:mm:ss", Locale.GERMAN);
        String formatted = now.format(formatter);
        System.out.println(formatted);
    }
}
    • 输出**:
2022-12-26T13:20:24.257472
26.12.2022 13:20:24

LocalDateTime不包含任何格式。如上所示,您可以通过在自定义模式中设置其格式来获得自定义文本表示形式。如果愿意,您可以将此字符串(这没有意义)存储在文本类型的数据库列中,或将其设置为String变量,但您永远不能以特定格式存储或设置LocalDateTime
代码中的以下行没有意义,也导致了错误:

receiptDTO.setDateTime(LocalDateTime.parse(dtf.format(now)));

你应该写得简单点

receiptDTO.setDateTime(now);

错误的原因是LocalDateTime#parse(CharSequence text)已实现为解析已经是ISO 8601的日期时间字符串(例如2022-12-26T13:25),而代码中的dtf.format(now)返回的字符串不是ISO 8601格式。
从**Trail: Date Time**了解有关现代日期-时间API的更多信息。

sbdsn5lh

sbdsn5lh2#

您实际上不需要编写自己的代码来设置LocalDateTime的格式。您可以使用以下注解声明它:

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd.MM.yyyy HH:mm:ss")
@Nullable
@Column(name = "date_time")
private LocalDateTime dateTime;

有关更多详细信息,请查看此处:Spring Data JPA - ZonedDateTime format for json serialization(查看接受的答案)

xmq68pz9

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的日期)?如果不是这样,那么在持久化之前格式化日期就没有意义了,日期格式主要用于表示和应用程序输入。

相关问题