我正在尝试清理从另一个应用程序生成的日期。有时,日期的格式可能不正确,如果不正确,则应将其删除。一般条件应为;
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
由于要处理两个不同的输入并生成两种输出,因此需要在有时间和无时间的输入日期之间划分逻辑,并分别处理它们。我没有包括格式化程序,但是我将它们分为两个数组,一个数组用于没有时间模式的格式化程序,一个数组用于具有时间模式的格式化程序
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
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。