运行时字符串到 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项目官方推荐说迁移。
链接
- Oracle tutorial: Date Time 解释如何使用 java.time.
- Wikipedia article: ISO 8601
我的请求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项目官方推荐说迁移。
链接
- Oracle tutorial: Date Time 解释如何使用 java.time.
- Wikipedia article: ISO 8601