运行时JAVA上DateTime的字符串

问题描述 投票:0回答:2

我的请求POJO中有一个“出生日期”属性,它是String。在我的回复POJO中,出生日期属性是joda的DateTime。我通过使用“新的DateTime(requestModel.getDateOfBirth())”将其转换为DateTime。不过,它仅接受日期格式(在String中)为“ yyyy-mm-dd”。当我更改请求日期格式时,它将引发“ 500

Blockquote

“。这是我的POJO:

RequestModel.java

public class RequestModel {
@NotNull(message = "dateOfBirth cannot be null")
private String dateOfBirth;

public RequestModel(String dateOfBirth) {
    super();
    this.dateOfBirth = dateOfBirth;
}
public String getDateOfBirth() {
    return dateOfBirth;
}

}

ResponseModel.java

public class ResponseModel {
private DateTime dateOfBirth;
public ResponseModel( DateTime dateOfBirth) {
    super();
    this.dateOfBirth = dateOfBirth;
}
public DateTime getDateOfBirth() {
    return dateOfBirth;
}
}

MyController.java

    @PostMapping(consumes = {
                            MediaType.APPLICATION_JSON_VALUE,
                            MediaType.APPLICATION_XML_VALUE
                        },
             produces = {
                        MediaType.APPLICATION_JSON_VALUE,
                        MediaType.APPLICATION_XML_VALUE
                        })
public ResponseEntity<ResponseModel> create(@Valid @RequestBody RequestModel requestModel) {
    ResponseModel response = new ResponseModel(new DateTime(requestModel.getDateOfBirth()));
    return new ResponseEntity<ResponseModel>(response, HttpStatus.CREATED);
}

这是发布的JSON请求,效果很好:

{
"dateOfBirth" : "2012-12-12"
}

以下请求正文引发错误:

{
"dateOfBirth" : "12-12-2012",
}

错误是:

{
"timestamp": "2020-03-14T19:09:51.647+0000",
"status": 500,
"error": "Internal Server Error",
"message": "Invalid format: \"12-12-2012\" is malformed at \"12\"",
"path": "/myPath/"
}

我想知道如何改善控制器逻辑或设计以接受API中的任何Date格式?感谢您的帮助

java spring spring-boot datetime jodatime
2个回答
1
投票

Date(String date)被弃用的构造函数。

您可以使用Calendar类构建DateTime对象

Calendar c = Calendar.getInstance();
c.set(2000,11,2);
Date d = c.getTime();
System.out.println(d.toString());

这将在2000年12月2日创建一个Date对象。

[您需要先对输入字符串进行拆分和操作,然后再将其传递给get方法

设置方法接受3个参数。

设置(整数年,整数月,整数日期)设置日历字段YEAR,MONTH和DAY_OF_MONTH的值。

有关更多信息,请参见日历API

https://docs.oracle.com/javase/7/docs/api/java/util/Calendar.html


0
投票

首先,由于您获得的日期中没有一天中的时间,因此您最好选择Joda-Time的LocalDate,而不是DateTime

第二,构造函数接受的格式(以及LocalDate构造函数也为国际标准ISO 8601)。我应该说,建议您的客户在他们的请求中使用此格式将是很好的建议。

但是,如果您坚持要使用:使用格式化程序将请求中的字符串解析为LocalDate

    DateTimeFormatter dateFormatter = DateTimeFormat.forPattern("dd-MM-yyyy");

    String requestDateOfBirth = "12-12-2012";
    LocalDate dateOfBirth = LocalDate.parse(requestDateOfBirth, dateFormatter);

    System.out.println("Date of birth: " + dateOfBirth);

此片段的输出是:

出生日期:2012-12-12

12-12-2012中,我不知道是哪个月和哪个月,但是如果需要,您可以在格式模式字符串中将dd替换为一个月的天,将MM替换为一个月。

最后,如果这是新代码,您可能更喜欢使用Java.time(现代Java日期和时间API)而不是Joda-Time。 Joda-Time项目的官方建议说要迁移。

链接

© www.soinside.com 2019 - 2024. All rights reserved.