如何在Java中解析日期?
嗨,我有一个文件,其中有许多日期是按行写的。我正在提取那个日期字段,然后试图在date对象中解析它们。我正在使用Java。日期如下表所示: “2017年11月13日上午7:03” 我的代码片段如下所示:如何在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
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
是出了名的充满惊喜的。好的解决方案是跳过该类及其过时的朋友,改为使用。谢谢,这很有帮助。这个答案使用了现在遗留的麻烦的旧日期时间类。看见