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

Java 仅当日期上有时间时,使用时间格式化日期,java,Java,我正在尝试清理从另一个应用程序生成的日期。有时,日期的格式可能不好,如果是,则应将其删除。一般条件应为: 1900年或之前的任何日期都被视为无效并被删除 本年度之后的任何日期都被视为无效并被删除 任何与模式匹配的有效日期都应在输出中返回yyy-MM-dd HH:MM:ss(如果有时间戳可用)或yyy-MM-dd(如果没有时间戳可用) 日期由于您希望处理两个不同的输入并生成两种输出,因此需要在有时间和无时间的输入日期之间分割逻辑并分别处理它们。我没有包括格式化程序,但我将它们分成了两个数组,一

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

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

  • 本年度之后的任何日期都被视为无效并被删除

  • 任何与模式匹配的有效日期都应在输出中返回
    yyy-MM-dd HH:MM:ss
    (如果有时间戳可用)或
    yyy-MM-dd
    (如果没有时间戳可用)


日期由于您希望处理两个不同的输入并生成两种输出,因此需要在有时间和无时间的输入日期之间分割逻辑并分别处理它们。我没有包括格式化程序,但我将它们分成了两个数组,一个用于没有时间模式的格式化程序,另一个用于有时间模式的格式化程序

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 "";
if(input.length()<10){//可能会添加检查>
返回“”;
}
if(input.length()==10){
for(最终日期TimeFormatter格式:可能格式1){
试一试{
最终LocalDate结果=LocalDate.parse(输入,格式);
if(result.getYear()Year.now().getValue()){
返回“”;
}
返回result.format(模式的DateTimeFormatter.of(“yyyy-MM-dd”);
}捕获(最终DateTimeParseException dtpe){
//忽略,请尝试下一种格式
}
}
}否则{
for(最终日期TimeFormatter格式:possibleFormats2){
试一试{
最终LocalDateTime结果=LocalDateTime.parse(输入,格式);
if(result.getYear()Year.now().getValue()){
返回“”;
}
返回result.format(模式的DateTimeFormatter.of(“yyyy-MM-dd HH:MM:ss”);
}捕获(最终DateTimeParseException dtpe){
//忽略,请尝试下一种格式
}
}
}
返回“”;

此解决方案的问题在于,它的前提是
输入中的字符数为10或更多。您可以合法地使用少于10个字符的有效日期(例如ddmmyyy或dd/MM/yy)。它也不是很枯燥,同样的过程重复了两次。解决方案是基于OP定义的格式化程序,8个字符的日期没有格式化程序,那么我的代码为什么要处理这个问题呢?解决手头的问题,而不是一些不存在的问题。我想代码可以重写一些,是的,以减少重复性。是的,我想说的是,根据提问者提到的内容,所有输入的日期可以是10个字符,但听起来他们需要满足一系列不同的格式,而不仅仅是提到的格式。我可能错了。但是为什么应用程序都是基于字符数的呢?这意味着您必须不断修改它需要检查的字符数,而如果您按照最初的实现,即仅根据格式集合解析日期,则只需添加到它认为有效的格式集合中即可。
@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;"));
}
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 "";