开发者社区> 问答> 正文

仅当日期上有时间时,才用时间格式化日期

我正在尝试清理从另一个应用程序生成的日期。有时,日期的格式可能不正确,如果不正确,则应将其删除。一般条件应为;

  • 1900年或之前的任何日期均被视为无效并被删除

  • 当年之后的任何日期均被视为无效并被删除

  • 任何与模式匹配的有效日期都应在输出中返回yyyy-MM-dd HH:mm:ss(有可用时间戳),或者yyyy-MM-dd在无可用时间戳时返回。

日期<= 1900和当年之后的日期被认为是无效的,因为它们正在加载到另一个系统中,在这些系统中,这些日期在应用程序的上下文中没有意义。出于相同的原因,我需要以上述格式返回日期,以便可以将它们加载到下一个应用程序中。

如何修改下面的代码以处理没有时间戳的日期?当前代码给出错误:java.time.temporal.UnsupportedTemporalTypeException: Unsupported field: HourOfDay尝试调用时;SanitiseDate("01/01/2001")

到目前为止,这是我的代码:

public static String SanitiseDate(String input) {
    DateTimeFormatter[] possibleFormats = {
            DateTimeFormatter.ofPattern("uuuu-MM-dd").withResolverStyle(ResolverStyle.STRICT),
            DateTimeFormatter.ofPattern("uuuu/MM/dd").withResolverStyle(ResolverStyle.STRICT),
            DateTimeFormatter.ofPattern("dd/MM/uuuu").withResolverStyle(ResolverStyle.STRICT),
            DateTimeFormatter.ofPattern("dd-MM-uuuu").withResolverStyle(ResolverStyle.STRICT),
            DateTimeFormatter.ofPattern("mm-DD-uuuu").withResolverStyle(ResolverStyle.STRICT),

            DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss").withResolverStyle(ResolverStyle.STRICT),
            DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm").withResolverStyle(ResolverStyle.STRICT),

            DateTimeFormatter.ofPattern("uuuu/MM/dd HH:mm").withResolverStyle(ResolverStyle.STRICT),
            DateTimeFormatter.ofPattern("uuuu/MM/dd HH:mm:ss").withResolverStyle(ResolverStyle.STRICT),

            DateTimeFormatter.ofPattern("dd/MM/uuuu HH:mm:ss").withResolverStyle(ResolverStyle.STRICT),
            DateTimeFormatter.ofPattern("dd/MM/uuuu HH:mm").withResolverStyle(ResolverStyle.STRICT),

            DateTimeFormatter.ofPattern("dd-MM-uuuu HH:mm").withResolverStyle(ResolverStyle.STRICT),
            DateTimeFormatter.ofPattern("dd-MM-uuuu HH:mm:ss").withResolverStyle(ResolverStyle.STRICT),

            DateTimeFormatter.ofPattern("mm-DD-uuuu HH:mm").withResolverStyle(ResolverStyle.STRICT),
            DateTimeFormatter.ofPattern("mm-DD-uuuu HH:mm:ss").withResolverStyle(ResolverStyle.STRICT),
    };

    for (DateTimeFormatter format : possibleFormats) {
        try {
            LocalDate result = LocalDate.parse(input, format);
            if (result.getYear() <= 1900 || result.getYear() > Year.now().getValue())
            {
                return "";
            }
            return result.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
        } catch (DateTimeParseException dtpe) {
            // ignore, try next format
        }
    }
    return "";
}

我的测试:

@Test
public void sanitiseDateTest()
{
    assertEquals("", StringUtil.SanitiseDate(""));
    assertEquals("", StringUtil.SanitiseDate("01/01/1601"));
    assertEquals("", StringUtil.SanitiseDate("01/01/1501"));
    assertEquals("2001-01-01", StringUtil.SanitiseDate("01/01/2001"));
    assertEquals("1980-01-01", StringUtil.SanitiseDate("01/01/1980"));
    assertEquals("", StringUtil.SanitiseDate("05/05/1900"));
    assertEquals("", StringUtil.SanitiseDate("01/01/1989"));
    assertEquals("1901-01-01", StringUtil.SanitiseDate("01/01/1901"));
    assertEquals("2020-02-29", StringUtil.SanitiseDate("29/02/2020"));
    assertEquals("2020-01-29", StringUtil.SanitiseDate("29/01/2020"));
    assertEquals("2020-01-29 01:00:00", StringUtil.SanitiseDate("29/01/2020 01:00:00"));
    assertEquals("", StringUtil.SanitiseDate("12/12/2030 01:00:00"));
    assertEquals("", StringUtil.SanitiseDate("12/12/2030 01:00:00; 12/12/2030 01:00:00;"));
}

问题来源:Stack Overflow

展开
收起
montos 2020-03-22 16:22:25 823 0
1 条回答
写回答
取消 提交回答
  • 由于要处理两个不同的输入并生成两种输出,因此需要在有时间和无时间的输入日期之间划分逻辑,并分别处理它们。我没有包括格式化程序,但是我将它们分为两个数组,一个数组用于没有时间模式的格式化程序,一个数组用于具有时间模式的格式化程序

    if (input.length() < 10) { // maybe add check for >
        return ""; 
    }
    
    if (input.length() == 10) {
        for (final DateTimeFormatter format : possibleFormats1) {
            try {
                final LocalDate result = LocalDate.parse(input, format);
                if (result.getYear() <= 1900 || result.getYear() > Year.now().getValue()) {
                    return "";
                }
                return result.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
            } catch (final DateTimeParseException dtpe) {
                // ignore, try next format
            }
        }
    } else {
        for (final DateTimeFormatter format : possibleFormats2) {
    
            try {
                final LocalDateTime result = LocalDateTime.parse(input, format);
                if (result.getYear() <= 1900 || result.getYear() > Year.now().getValue()) {
                    return "";
                }
                return result.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
            } catch (final DateTimeParseException dtpe) {
                // ignore, try next format
            }
        }
    }
    return "";
    

    回答来源:Stack Overflow

    2020-03-22 16:23:17
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载