【问题标题】:Testing a Date from a database that uses to_date and testing against LocalTimeDate从使用 to_date 的数据库中测试日期并针对 LocalTimeDate 进行测试
【发布时间】:2017-04-27 20:02:33
【问题描述】:

我有一个旧程序并将其升级到 Java 8。现在我想利用 LocalDateTime。我已经更新了实体,并且在数据库中的值读取为10-APR-1990

但是我收到以下错误:

java.time.format.DateTimeParseException: Text '10-APR-90' could not be parsed at index 3

在我的测试中,我尝试使用 DateTimeFormatter 解析它。

测试:

@Test
    public void testLocalDateTime() throws Exception {

        DateTimeFormatter formatter =
                DateTimeFormatter.ofPattern("dd-MMM-yy", Locale.US);

        Tcan1990 applicant = tcan1990Repository.findOne(new Tcan1990PK("000000009", 888067));

        assertEquals(LocalDateTime.parse("10-APR-90",formatter),applicant.getPymtDt());
    }

【问题讨论】:

    标签: java unit-testing java-8 localdate


    【解决方案1】:

    两件事:

    • 月份需要为驼峰式:"10-Apr-90"
    • 因为您正在解析的内容不涉及时间,所以您应该使用 LocalDate 而不是 LocalDateTime

    【讨论】:

    • 在大多数情况下,用户无法控制输入的确切形式,但必须调整格式化程序以匹配输入。因此,除非您还推荐任何类型的字符串预处理,否则您的第一个建议或多或少毫无意义。
    • 非常正确。然而,这是一个硬编码的字符串,所以我相信答案仍然与 this specific question 相关。
    【解决方案2】:

    更新您的测试用例以使用不区分大小写的格式化程序,并将日期字符串解析为 LocalDate,并将时间设置为一天的开始以获取 LocalDateTime。

    @Test
    public void testLocalDateTime() throws Exception {
    
        DateTimeFormatter formatter = new DateTimeFormatterBuilder().parseCaseInsensitive().appendPattern("dd-MMM-yyyy").toFormatter(Locale.US);
    
        Tcan1990 applicant = tcan1990Repository.findOne(new Tcan1990PK("000000009", 888067));
    
        assertEquals(LocalDate.parse("10-APR-1990", formatter).atStartOfDay(), applicant.getPymtDt());
    
    }
    

    【讨论】:

    • 我无法添加applicant.getPymtDt().atStartOfDay(),我仍然遇到同样的错误。该字段是 LocalDateTIme
    • 更新了代码以删除 atStartOfDay()。您传递的字符串中有时间吗?断言将失败。你可以只断言本地日期部分吗? assertEquals(LocalDate.parse("10-APR-1990", formatter),申请人.getPymtDt().toLocalDate());
    • 我的 IDE 警告 inconvertible types LocalDate and LocalDateTime 并且我收到错误提示 java.lang.AssertionError: Expected :2008-02-08 Actual :2008-02-08T00:00 所以它似乎工作但我需要修复解析
    • 您是否将申请人.getPymtDt().toLocalDate() 添加到实际中?似乎它仍然是本地日期时间。 toLocalDate() 将从 pymtDt 中提取本地日期。
    猜你喜欢
    • 1970-01-01
    • 2012-02-19
    • 2019-04-18
    • 1970-01-01
    • 2022-08-02
    • 2014-08-02
    • 2020-11-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多