如何解析日期字符串,如' 21Jul12'。我尝试了以下方式:
import org.apache.commons.lang.time._
DateUtils.parseDate("21Jul12", Array("ddMMMyy"));
但由于错误,它无法正常工作:
java.text.ParseException: Unable to parse the date: 21Jul21
at org.apache.commons.lang.time.DateUtils.parseDateWithLeniency(DateUtils.java:359)
at org.apache.commons.lang.time.DateUtils.parseDate(DateUtils.java:285)
at .<init>(<console>:20)
at .<clinit>(<console>)
at .<init>(<console>:11)
at .<clinit>(<console>)
at $print(<console>)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at scala.tools.nsc.interpreter.IMain$ReadEvalPrint.call(IMain.scala:704)
at scala.tools.nsc.interpreter.IMain$Request$$anonfun$14.apply(IMain.scala:920)
at scala.tools.nsc.interpreter.Line$$anonfun$1.apply$mcV$sp(Line.scala:43)
at scala.tools.nsc.io.package$$anon$2.run(package.scala:25)
at java.lang.Thread.run(Thread.java:662)
即使我使用java.text.SimpleDateFormat
,我也有一个类似的例外:
java.text.ParseException: Unparseable date: "21Jul12"
at java.text.DateFormat.parse(DateFormat.java:337)
at .<init>(<console>:13)
at .<clinit>(<console>)
at .<init>(<console>:11)
at .<clinit>(<console>)
at $print(<console>)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at scala.tools.nsc.interpreter.IMain$ReadEvalPrint.call(IMain.scala:704)
at scala.tools.nsc.interpreter.IMain$Request$$anonfun$14.apply(IMain.scala:920)
at scala.tools.nsc.interpreter.Line$$anonfun$1.apply$mcV$sp(Line.scala:43)
at scala.tools.nsc.io.package$$anon$2.run(package.scala:25)
at java.lang.Thread.run(Thread.java:662)
答案 0 :(得分:2)
以上是解析上述日期的代码
System.out.println("ddMMMyy >>>" + DateUtils.parseDate("21Jul12", new String[] { "ddMMMyy" }));
System.out.println("yyyy-MM-dd >>>" + DateUtils.parseDate("2012-07-21", new String[] { "yyyy-MM-dd" }));
System.out.println("yyyy MMM dd >>>" + DateUtils.parseDate("2012 Jul 21", new String[] { "yyyy MMM dd" }));
和控制台上的结果
ddMMMyy >>>Sat Jul 21 00:00:00 CEST 2012
yyyy-MM-dd >>>Sat Jul 21 00:00:00 CEST 2012
yyyy MMM dd >>>Sat Jul 21 00:00:00 CEST 2012
也许你试图用“ddMMMyy”解析“2012年7月21日”
System.out.println("ddMMMyy >>>" + DateUtils.parseDate("2012 Jul 21", new String[] { "ddMMMyy" }));
给你的堆栈
java.text.ParseException: Unable to parse the date: 2012 Jul 21
at org.apache.commons.lang.time.DateUtils.parseDateWithLeniency(DateUtils.java:359)
at org.apache.commons.lang.time.DateUtils.parseDate(DateUtils.java:285)
at com.collibra.dgc.core.model.activity.impl.TestTree.testname(TestTree.java:88)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
答案 1 :(得分:2)
当我明确地将语言环境设置为Locale.en_US时,它可以正常工作。由于默认语言环境设置而引发的异常为Locale.CHINA
答案 2 :(得分:0)
我们使用消除过程进行日期解析,基本上,我们使用常用日期格式的数组(对于我们的应用程序),并且不会抛出异常的是我们使用的那个。不是最干净的解决方案,但它有效......
例如
parse("2012 Jul 21", "ddMMMyy", "yyyy MMM dd");
parse("21Jul12", "ddMMMyy", "yyyy MMM dd");
public Date parse(String value, String... formats) throws ParseException {
Date date = null;
for (String format : formats) {
try {
date = new SimpleDateFormat(format).parse(value);
} catch (ParseException exp) {
}
}
if (date == null) {
throw new ParseException(value + " is an unrecognized date format", 0);
}
return date;
}
答案 3 :(得分:0)
String date="21JUL12";
try {
System.out.println(new SimpleDateFormat("ddMMMyy").parse(date));
}
catch(ParseException ex) {
ex.printStackTrace();
}
上面的代码给出了这个输出:
Sat Jul 21 00:00:00 BST 2012
答案 4 :(得分:0)
LocalDate.parse( // Represent a date-only value without time-of-day and without time zone using the `LocalDate` class.
"21Jul12" , // A poor choice of format for date value as text. Instead use standard ISO 8601 formats.
DateTimeFormatter.ofPattern( "ddMMMuu" , Locale.US ) // Specify `Locale` to determine the human language and cultural norms used in translating.
)
不需要 Apache 实用程序。
现代方法使用 java.time 类。
String input = "21Jul12" ;
DateTimeFormatter f = DateTimeFormatter.ofPattern( "ddMMMuu" , Locale.US ) ;
LocalDate ld = LocalDate.parse( input , f ) ;
ld.toString():2012-07-21
两个提示:
20xx
)。 java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和&amp; SimpleDateFormat
现在位于Joda-Time的maintenance mode项目建议迁移到java.time类。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310。
使用符合JDBC driver或更高版本的JDBC 4.2,您可以直接与数据库交换 java.time 对象。不需要字符串也不需要java.sql。* classes。
从哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
和more。