在编写集成测试时,我期望响应中出现硬编码的日期。
基本上我是硬编码的
expected date value '2020-11-10T00:00:00.000-05:00'
然后跑了new GregorianCalendar(2020, 10, 10).getTime()
当我在本地放置并断言并运行它时,它会通过,但是当相同的代码被推送到bamboo构建服务器时,它生成的实际值是
'2020-11-10T00:00:00.000Z'
,所以我的测试失败了。
为什么同一个calendar.getTime生成两个不同的时间,是因为服务器机器配置为GMT吗?
我可以做些什么让它们同时出现或有其他解决方法吗?
注意:这里不能选择将其设置为字符串或比较没有时间的日期,因为我使用的是 Spring MockWebServiceServer,其中我必须对responseXML 进行硬编码并指定日期,类似于 Enum 中的内容。
REQUESTAUTOMATESETTLEMENTWORKCASE("<aut:AutomateSettlementWorkcaseRequest xmlns:aut=\"http://www.abcd.com/abcd/workflow/services/workcase/model/AutomateSettlementWorkcase_1_0_0\">" +
" <aut:customerAccountId>5049903033584324</aut:customerAccountId>\n" +
" <aut:settlementDate>2020-11-10T00:00:00.000-05:00</aut:settlementDate>\n" +
" </aut:AutomateSettlementWorkcaseRequest>"),
输入数据中的“-5”部分将其丢弃......理想情况下,您应该在构造日历时指定时区,然后将其设置为 UTC 凌晨 5 点(例如)。基本上,
2020-11-10T00:00:00.000-05:00
与 2020-11-10T05:00:00.000Z
是同一时刻。
现在,我们不知道保留 UTC 偏移量对您是否重要。如果是,您需要在日历中设置一个适当的时区 - 该时区与生成输入数据的规则相同。如果不是,我会使用 UTC 并适当设置时间。
我个人建议使用 Joda Time 而不是
Calendar
和 Date
- 这是一个更好更好的日期和时间 API。对于初学者来说,没有从 0 开始的月份:)
您正在使用有严重缺陷的日期时间类,这些类现在已经成为遗留的。它们被 JSR 310 中定义的现代 java.time 类取代。
您的输入字符串
2020-11-10T00:00:00.000-05:00
符合日期时间格式的ISO 8601标准。
将该字符串解析为
OffsetDateTime
对象。此类表示具有从特定偏移量看到的时间的日期。偏移量只是 UTC 时间子午线之前/之后的小时数、分钟数、秒数。 (时区是特定地区人民使用的偏移量的过去、现在和未来变化的命名历史,由其政治家确定。)
OffsetDateTime odt = OffsetDateTime.parse( "2020-11-10T00:00:00.000-05:00" ) ;