2017-08-15 58 views
0

我有一个字符串和一个格式。我想使用该格式将字符串转换为日期时间。但简单的日期时间格式将字符串转换为日期时间,即使输入字符串格式不正确。日期时间解析不执行格式

val formatter = new SimpleDateFormat("yyyyMMdd") 
val dateInString = "2017042er7" 

try { 
formatter.setLenient(false) 
val date = formatter.parse(dateInString) 
System.out.println(date) 
System.out.println(formatter.format(date)); 

} catch { 

case e:Exception=>println(e) 
} 

我该如何执行格式?

** UPDATE :: **使用joda时间格式化程序解决了这个问题。您也可以使用java时间格式化程序(作为建议的答案之一)。

+1

仅供参考,诸如'java.util.Date',['java.util.Calendar'](https://docs.oracle.com)之类的麻烦的旧日期时间类.com/javase/8/docs/api/java/util/Calendar.html)和'java.text.SimpleTextFormat'现在是[legacy](https://en.wikipedia.org/wiki/Legacy_system),代替通过[java.time](https://docs.oracle.com/javase/8/docs/api/java/time/package-summary.html)类。同样,[Joda-Time](http://www.joda.org/joda-time/)项目现在处于[维护模式](https://en.wikipedia.org/wiki/Maintenance_mode),其中团队建议迁移到java.time类。 –

回答

2

您应该使用新的API java.time及其DateTimeFormatter解析您的日期。它允许更好的控制和正确性,并且对格式更严格。

将旧的java.util.DateSimpleDateFormatter保留下来,只是在需要它与库进行交互时将它们转换为它们。

+0

使用乔达时间也解决了这个问题。 – Luniam

+2

@Luniam是的,但实际上应该放弃使用新的java.time的jodatime,以及java.time是java 8之后的jodatime的继承者。 – puhlen

0

setLenient并不关心字符串格式,而是传递的值可以转换为日期。例如,应将31-Sept-2017视为01-Aug-2017

这个库试图通过解析你的输入来帮助你(dd是一个数字,所以2满足要求,之后的所有内容都可以忽略)。如果您需要的格式为String,那么在转换输入之前,您应该使用正则表达式来验证输入。

顺便说一句,我不一定与实施同意,只是试图解释为什么它的工作原理:)

+0

它不应该完全按照格式进行解析。否则,提供格式有什么意义。当我期待别的事情时,我得到一个错误的价值。我会说这是一个糟糕的实现。乔达时间更好。使用约达时间解决了我遇到的问题。 – Luniam

+0

我不反对,只是解释你为什么看到你的结果。 – StuPointerException

0

TL;博士

LocalDate.parse(        // Use modern java.time classes. 
    "2017042er7".replaceAll("\\D+" , "") , // Extract digits from string. 
    DateTimeFormatter.BASIC_ISO_DATE   // Use pre-defined formatter for YYYYMMDD input, the “basic” version of standard ISO 8601 format. 
).toString()         // Generate String in full version of ISO 8601 format (with hyphens as separators). 

2017年4月27日

提取数字

Extract digits from a string in Java解释的那样,只从一个字符串中提取数字。

String original = "2017042er7" ; 
String input = original.replaceAll("\\D+" , "") ; 

解析为LocalDate

避免在看到问题的麻烦旧的遗留日期时间类。由java.time类提供。

LocalDate类代表没有时间和不带时区的仅有日期的值。

DateTimeFormatter类包含一个预定义的格式模式以满足您的需求:BASIC_ISO_DATE。这是标准ISO 8601格式的“基本”版本(尽量减少使用分隔符)。

LocalDate ld = LocalDate.parse(input , DateTimeFormatter.BASIC_ISO_DATE) ; 

看到这个code run live in IdeOne.com

原:2017042er7

LD。toString():2017-04-27