java 中的通用日期解析

Generic date parsing in java

我有各种格式的日期字符串,例如 Oct 10 11:05:03 或 12/12/2016 4:30 等 如果我这样做

// some code...
getDate("Oct 10 11:05:03", "MMM d HH:mm:ss");
// some code ...

日期被解析,但我得到的年份是 1970 年(因为字符串中没有指定年份。)但是如果没有指定年份,我希望年份是当前年份。这同样适用于所有领域。

这是我的 getDate 函数:

public Date getDate(dateStr, pattern) {
    SimpleDateFormat parser = new SimpleDateFormat(pattern); 
    Date date = parser.parse(myDate);
    return date;
}

谁能告诉我如何在 getDate 函数中执行此操作(因为我想要一个通用解决方案)?

提前致谢!

一个选项是将当前年份连接到传入日期字符串,然后解析:

String ts = "Oct 10 11:05:03";
int currYear = Calendar.getInstance().get(Calendar.YEAR);
ts = String.valueOf(currYear) + " " + ts;

Date date = getDate(ts, "yyyy MMM d HH:mm:ss");
System.out.println(date);

Wed Oct 10 11:05:03 CEST 2018

Demo

请注意,我们可以在上面使用 StringBuilder,但为了代码简洁,我使用原始字符串连接代替。我还修复了您的辅助方法 getDate().

中的一些拼写错误

如果您事先不知道格式,您应该列出您期望的实际格式,然后尝试解析它们。如果一个失败,请尝试下一个。

默认怎么填

你最终会得到这样的结果:

DateTimeFormatter f = new DateTimeFormatterBuilder()
    .appendPattern("ddMM")
    .parseDefaulting(YEAR, currentYear)
    .toFormatter();
LocalDate date = LocalDate.parse("yourstring", f);

或者更好的是,上述格式化程序 class 支持 可选元素 。将年份说明符括在方括号中,该元素将是可选的。然后,您可以使用 parseDefaulting.

提供默认值

这是一个例子:

String s1 = "Oct 5 11:05:03";
String s2 = "Oct 5 1996 13:51:56"; // Year supplied
String format = "MMM d [uuuu ]HH:mm:ss";

DateTimeFormatter f = new DateTimeFormatterBuilder()
    .appendPattern(format)
    .parseDefaulting(ChronoField.YEAR, Year.now().getValue())
    .toFormatter(Locale.US);

System.out.println(LocalDate.parse(s1, f));
System.out.println(LocalDate.parse(s2, f));

注意:日期和时间并不容易。您应该考虑到日期解释通常取决于语言环境,这有时会导致歧义。例如,日期字符串“05/12/2018”在美国表示2018年5月12日,但在某些欧洲地区表示2018年12月5日。您需要注意这一点。