我有一个json格式的响应日期到控制器,这是这样的:
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone = "America/Chicago")
private Date date;
因此,当我进行post调用时,它看起来像:
"date": "2021-08-20 14:17:43"
因此响应字符串看起来像{"date":"2021-05-21 14:23:44"}
。在JUnit中,我手动创建了一个响应对象并设置了Date
对象,这样我就可以使用Gson将其转换为字符串,然后Assert两者相等。我尝试在我的SpringMVC JUnit测试用例中匹配这一点,方法是:
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
sdf.setTimeZone(TimeZone.getTimeZone("America/Chicago"));
String formattedDate = sdf.format(new Date());
LocalDate localDate = LocalDate.parse(formattedDate);
Date date = Date.from(localDate.atStartOfDay(ZoneId.of("America/Chicago")).toInstant());
但是,由于yyyy-MM-dd
和HH:mm:ss
之间的空格,解析时出错:
java.time.format.DateTimeParseException: Text '2021-08-20 14:23:44' could not be parsed, unparsed text found at index 10
我想这样做可能效率不高,所以我想知道是否有更简单的方法来创建与@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone = "America/Chicago")
匹配的Date
对象
我正在尝试匹配响应体,以便它通过mockito传递。
4条答案
按热度按时间2guxujil1#
不要混合使用现代和传统的日期-时间API
输出:
ONLINE DEMO
*java.时间 *
java.util
日期-时间API及其格式化APISimpleDateFormat
已过时且容易出错。建议完全停止使用它们并切换到modern Date-Time API *。但是,无论出于何种原因,如果您需要将Instant
对象转换为java.util.Date
对象,您可以执行以下操作:从**Trail: Date Time**了解有关现代日期-时间API的更多信息。
41ik7eoe2#
您可能缺少日期反序列化程序
gev0vcfq3#
发布这篇文章只是为了满足你想要达到的目标。但是你应该按照@Arvind的回答去做:
ih99xse14#
最好是完全跳过
Date
类,在响应中使用java.time(现代Java日期和时间API)中的Instant
或ZonedDateTime
。如果无法避免使用过期的Date类
......我想知道是否有更简单的方法来生成与
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone = "America/Chicago")
相匹配的Date
对象**基本编辑:**这在很大程度上取决于您所说的 * 匹配格式 * 是什么意思。
Date
既不能有格式,也不能有时区。JSON中的字符串具有上面提到的格式。Date
没有,因为这是不可能的。时区America/芝加哥在JSON和Date
中都不存在。它只用于在两者之间进行转换。如果两个Date
对象表示相同的时间点,则它们是相等的,没有其他任何问题。当您询问如何将Date
化为匹配@JsonFormat
时,这必然意味着将 * 格式化为字符串 *。要将
2021-08-20 14:23:44
这样的字符串转换为老式的Date
对象,我首先要静态定义格式和时区:然后做:
我的时区中的输出为:
欧洲中部时间2021年8月20日星期五21:23:44
如果我在跑步前将时区设置为“America/芝加哥,则更容易看出结果是否正确:
2021年8月20日星期五14:23:44 CDT
您的代码中出现了什么错误?
首先,将一个
Date
化为字符串,然后再解析它,这会使事情变得过于复杂,这是正确的;其次,注意到异常来自下面这一行:LocalDate
是一个没有时间的日期。因此它的单参数parse
方法只需要字符串中的2021-08-20
,没有其他内容。它抱怨空格,不是因为它是一个空格,而是因为在预期的字符后面有更多的字符。