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
请注意,我们可以在上面使用 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日。您需要注意这一点。
我有各种格式的日期字符串,例如 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
请注意,我们可以在上面使用 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日。您需要注意这一点。