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_Parsing_Exception - Fatal编程技术网

如何在Java中解析日期?

如何在Java中解析日期?,java,date,parsing,exception,Java,Date,Parsing,Exception,嗨,我有一个文件,其中有许多日期是按行写的。我正在提取那个日期字段,然后试图在date对象中解析它们。我正在使用Java。日期如下表所示: “2017年11月13日上午7:03” 我的代码片段如下所示: String rpattern = "d MMM, yyyy - hh:MM aa"; //13 Nov, 2017 - 7:03 AM SimpleDateFormat rsimpleDateFormat = new SimpleDateFormat(rpattern); Date rtime

嗨,我有一个文件,其中有许多日期是按行写的。我正在提取那个日期字段,然后试图在date对象中解析它们。我正在使用Java。日期如下表所示:

“2017年11月13日上午7:03” 我的代码片段如下所示:

String rpattern = "d MMM, yyyy - hh:MM aa"; //13 Nov, 2017 - 7:03 AM
SimpleDateFormat rsimpleDateFormat = new SimpleDateFormat(rpattern);
Date rtime = rsimpleDateFormat.parse(report_time.trim());
除2017年10月31日下午5:31外,该计划在几个日期都可以正常运行。它将该特定日期(2017年10月31日-下午5:31)的例外情况标记如下:

String rpattern = "d MMM, yyyy - hh:MM aa"; //13 Nov, 2017 - 7:03 AM
SimpleDateFormat rsimpleDateFormat = new SimpleDateFormat(rpattern);
Date rtime = rsimpleDateFormat.parse(report_time.trim());
java.text.ParseException:无法解析的日期:“2017年10月31日-下午5:31”
位于java.text.DateFormat.parse(未知源)
位于Analysis.SnarlVicRoadIncidentReporting.main(SnarlVicRoadIncidentReporting.java:54)


有人能帮我解决这个问题吗?

你有一个输入错误:模式是:“d-MMM,yyy-hh:mmaa”


因此,所有解析都是错误的。您从hh:MM中选择一个月,因此没有31个月,而对于11月的日期,它返回的月份是3月,因为假设一分钟是03,您可能遇到了本地化问题

缩写月份名称(
“Nov”
“Oct”
,在您的情况下)取决于语言

SimpleDataFormat(String)
构造函数使用 系统默认的
语言环境
,可能是德语,因此
“Okt”
(适用于德语Oktober)。但是您的字符串包含
“Oct”
(英语为十月)

解决办法很简单。使用构造函数,即

SimpleDateFormat rsimpleDateFormat = new SimpleDateFormat(rpattern, Locale.ENGLISH);
而不是

SimpleDateFormat rsimpleDateFormat = new SimpleDateFormat(rpattern);
java.time
Date
SimpleDateFormat
早已过时,从堆栈溢出问题的数量来看,
SimpleDateFormat
尤其给许多人带来了麻烦。认识到旧类设计拙劣的事实,
java.time
,现代java日期和时间API于2014年春季推出。使用它会更好,所以我建议您改用它

让我们尝试一个实验:我将您的格式模式字符串与现代API一起使用(格式模式字符串语法有差异,但基本相同)

这会产生
java.lang.IllegalArgumentException:太多的模式字母:a
。现代API对字母的数量要求更严格,无论好坏。它的错误消息通常是有用的;在这种情况下,很容易按照上面所说的去做:

    String rPattern = "d MMM, yyyy - hh:MM a";
现在我得到
java.time.format.DateTimeParseException:无法在索引3处解析文本“2017年11月13日-7:03 AM”。索引3显示的是
Nov
。正如Thomas Fritsch在中所说的,这是一个区域设置问题。让我们修复一下:

    DateTimeFormatter rDateTimeFormatter 
            = DateTimeFormatter.ofPattern(rPattern, Locale.ENGLISH);
我们进一步了解到:
java.time.format.DateTimeParseException:无法在索引15处解析文本“2017年11月13日-上午7:03”。索引15是小时数所在的位置,
7
。我们指定了
hh
,即两位数字,但只有一位。一个
h
将同时接受一位数和两位数的小时数:

    String rPattern = "d MMM, yyyy - h:MM a";
现在情况变得越来越棘手:
java.time.format.DateTimeParseException:无法在索引17处解析文本“2017年11月13日-上午7:03”。索引17是会议记录。您可能需要仔细研究文档,以发现瓦迪姆在中已经说过的话:大写
M
表示月份,小写
M
表示分钟。修正:

    String rPattern = "d MMM, yyyy - h:mm a";
嘿,这次我们成功了:

2017-11-13T07:03

总之,
DateTimeFormatter
更为严格,一开始可能会让人恼火,但它有两个明显的优点:您可以更好地验证格式化程序;您还可以更好地验证日期-时间字符串。

这只是一个粗略的猜测,但月份的名称可能应该使用您所在地区的语言,而不是英语?
SimpleDateFormat
是出了名的充满惊喜的。好的解决方案是跳过该类及其过时的朋友,改为使用。谢谢,这很有帮助。这个答案使用了现在遗留的麻烦的旧日期时间类。看见