Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java DateFormat UnitTest在Jenkins中失败,但在本地失败_Java_Unit Testing_Jenkins_Date Format - Fatal编程技术网

Java DateFormat UnitTest在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

我已经对一个服务进行了单元测试,当我执行Jenkins作业时,每个测试方法都正确通过,只有一个例外。
但是这个测试方法在我的机器上工作,既可以使用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);