Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中的泛型日期解析_Java_Date_Date Format - Fatal编程技术网

java中的泛型日期解析

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

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

解析日期,但我得到的年份是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()

中的一些输入错误。一个选项是将当前年份连接到传入的日期字符串,然后解析:

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
类。它不仅早已过时,而且还出了名的麻烦。今天我们的生活好多了。