java中的泛型日期解析
我有各种格式的日期字符串,如10月10日11:05:03或12/12/2016 4:30等 如果我这样做 解析日期,但我得到的年份是1970年(因为字符串中没有指定年份)。但如果未指定年份,我希望该年份为当前年份。这同样适用于所有字段 下面是我的getDate函数:java中的泛型日期解析,java,date,date-format,Java,Date,Date Format,我有各种格式的日期字符串,如10月10日11:05:03或12/12/2016 4:30等 如果我这样做 解析日期,但我得到的年份是1970年(因为字符串中没有指定年份)。但如果未指定年份,我希望该年份为当前年份。这同样适用于所有字段 下面是我的getDate函数: public Date getDate(dateStr, pattern) { SimpleDateFormat parser = new SimpleDateFormat(pattern); Date date
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()
中的一些输入错误。一个选项是将当前年份连接到传入的日期字符串,然后解析:
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
,但为了代码的简洁性,我使用了原始字符串连接。我还修复了helper方法getDate()
中的一些拼写错误。如果您事先不知道格式,则应列出所需的实际格式,然后尝试解析它们。如果其中一个失败,请尝试下一个
如何填写默认值
你会得到这样的结果:
DateTimeFormatter f = new DateTimeFormatterBuilder()
.appendPattern("ddMM")
.parseDefaulting(YEAR, currentYear)
.toFormatter();
LocalDate date = LocalDate.parse("yourstring", f);
甚至更好的是,上述格式化程序类支持可选元素。将年份说明符括在方括号中,元素将是可选的。然后可以使用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日。您需要注意这一点。如果您事先不知道格式,您应该列出您期望的实际格式,然后尝试解析它们。如果其中一个失败,请尝试下一个 如何填写默认值 你会得到这样的结果:
DateTimeFormatter f = new DateTimeFormatterBuilder()
.appendPattern("ddMM")
.parseDefaulting(YEAR, currentYear)
.toFormatter();
LocalDate date = LocalDate.parse("yourstring", f);
甚至更好的是,上述格式化程序类支持可选元素。将年份说明符括在方括号中,元素将是可选的。然后可以使用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日。您需要意识到这一点。您应该看看Java 8时间API。
Date
类被认为已经过时,并且已经被java.time
中的类所取代。除了@mcepender所说的,java.time中的DateTimeFormatterBuilder
有一个parseDefaulting
方法,用于指定解析字符串中没有年份的年份。您从未向我们展示实际存在年份的时间戳的外观。请在你的问题中包含这些信息,谢谢。我认为你走的是一条不健康的道路。首先指定允许哪些格式模式字符串以及它们的含义,然后验证实际格式模式字符串是否符合规范,这会给您带来很多麻烦。我建议您避免使用SimpleDateFormat
类。它不仅早已过时,而且还出了名的麻烦。今天,我们有了更好的功能,您应该看看Java8时间API。Date
类被认为已经过时,并且已经被java.time
中的类所取代。除了@mcepender所说的,java.time中的DateTimeFormatterBuilder
有一个parseDefaulting
方法,用于指定解析字符串中没有年份的年份。您从未向我们展示实际存在年份的时间戳的外观。请在你的问题中包含这些信息,谢谢。我认为你走的是一条不健康的道路。首先指定允许哪些格式模式字符串以及它们的含义,然后验证实际格式模式字符串是否符合规范,这会给您带来很多麻烦。我建议您避免使用SimpleDateFormat
类。它不仅早已过时,而且还出了名的麻烦。今天我们的生活好多了。