Java DateFormat UnitTest在Jenkins中失败,但在本地失败
我已经对一个服务进行了单元测试,当我执行Jenkins作业时,每个测试方法都正确通过,只有一个例外。Java DateFormat UnitTest在Jenkins中失败,但在本地失败,java,unit-testing,jenkins,date-format,Java,Unit Testing,Jenkins,Date Format,我已经对一个服务进行了单元测试,当我执行Jenkins作业时,每个测试方法都正确通过,只有一个例外。 但是这个测试方法在我的机器上工作,既可以使用Eclipse,也可以使用mvn命令。 // TARGET_RUN_DATE_OF_YEAR = "2018-01-01" @Test public void dateToTimestamp() { Service service = getService(); String df = "YYY
但是这个测试方法在我的机器上工作,既可以使用Eclipse,也可以使用
mvn
命令。 // TARGET_RUN_DATE_OF_YEAR = "2018-01-01"
@Test
public void dateToTimestamp() {
Service service = getService();
String df = "YYYY-MM-dd";
String invalid = "INVALID";
// Check success
Timestamp timestamp = service.dateToTimestamp(TARGET_RUN_DATE_OF_YEAR, df);
Assert.assertEquals(service.getTodayTimestamp(), timestamp); // <-- Fail here
// Check failure
Assert.assertNull(service.dateToTimestamp(TARGET_RUN_DATE_OF_YEAR, invalid));
Assert.assertNull(service.dateToTimestamp(invalid, df));
}
正如我之前所说,测试在我的电脑上运行得很好,但在Jenkins上却不行(将@Ignore
注释添加到这个方法中,可以使工作成功)。启动作业时,出现以下错误: 失败的测试:dateToTimestamp(com.test.service.ServiceImplTest):应为:但为: 我可以保证的是,即使在Jenkins中,
dateToTimestamp
方法也会使用参数TARGET\u RUN\u DATE\u OF
,即“2018-01-01”
,dateFormart字符串为“YYYY-MM-dd”
。但是仍然返回2017-12-31 00:00:00.0
作为时间戳。有什么想法吗?java.time 我假设您想要一个
时间戳
,用于SQL数据库。2019年不要使用时间戳。那门课设计得很糟糕,而且早已过时
- 如果SQL端的数据类型是带时区的时间戳(应该是时间戳),请在Java中使用
OffsetDateTime
- 如果在SQL端只需要
(不带时区),请使用Java中的时间戳
LocalDateTime
String dateString = "2018-01-01";
OffsetDateTime odt = LocalDate.parse(dateString)
.atStartOfDay()
.atOffset(ZoneOffset.UTC);
System.out.println(odt);
输出为:
2018-01-01T00:00Z
现在,您可以使用如下方法将OffsetDateTime
传递给JDBC:
yourPreparedStatement.setObject(4, odt);
你的代码出了什么问题?
我相信您正经历两个问题的结合:
- 在格式模式字符串中使用大写
是不正确的。大写字母YYYY
表示基于周的年份,仅对周数有用。使用旧的、麻烦的Y
格式,您将需要在一年内使用小写的SimpleDateFormat
y
- (机器上的JVM)和Jenkins服务器具有不同的默认区域设置
String dateString = "2018-01-01";
String dateFormatString = "YYYY-MM-dd"; // Incorrect format pattern string
DateFormat df = new SimpleDateFormat(dateFormatString);
System.out.println(df.parseObject(dateString));
我的计算机上的输出(丹麦地区、欧洲/哥本哈根时区):
2018年1月1日星期一00:00:00 CET
但是,如果我首先这样做:
Locale.setDefault(Locale.US);
-那么上述代码段的输出就不同了,即:
2017年12月31日星期日欧洲中部时间00:00:00
发生的情况是,SimpleDateFormat
放弃了从基于周的年、月和月日中确定确切日期,而只给出基于周的年的第一个日期。SimpleDateFormat
的典型行为是给你一个不可能正确的结果,然后假装一切正常。在某些地区,一周从周一开始,你会得到Mon Jan 01,这恰好符合你的字符串。在其他地方,如美国,这一周从周日开始,所以你会得到前一年的12月31日太阳
链接
- 解释如何使用java.time
- 有关年份大写字母
的相关问题:Y
时间戳
、日期格式
和简单格式
。这些类的设计很糟糕,而且早已过时,尤其是后两个类的设计非常麻烦。而是使用LocalDate
、Instant
和中的其他类。
Locale.setDefault(Locale.US);