运行时字符串到 DateTime JAVA

String to DateTime on runtime JAVA

我的请求POJO中有一个出生日期属性,是String。在我的回复POJO中,出生日期属性是joda的DateTime。我使用 "new DateTime(requestModel.getDateOfBirth())" 将其转换为 DateTime。虽然,它只接受 "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);
}

这是工作正常的 post 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(String date) 是不推荐使用的构造函数。

您可以使用日历 class 构建 DateTime 对象

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

这会在 2000 年 12 月 2 日创建一个日期对象。

在将输入字符串传递给 get 方法之前,您需要对其进行拆分和操作

设置方法接受 3 个参数。

set(int 年, int 月, int 日期) 设置日历字段 YEAR、MONTH 和 DAY_OF_MONTH.

的值

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

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

首先,由于您获得的日期没有时间,因此您应该更喜欢 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);

此片段的输出是:

Date of birth: 2012-12-12

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

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

链接