日期时间解析未强制执行格式

时间:2017-08-15 19:39:41

标签: java scala datetime

我有一个字符串和格式。我想使用格式将字符串转换为日期时间。但简单的日期时间格式是将字符串转换为日期时间,即使输入字符串格式错误。

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 time formatter解决了这个问题。您还可以使用java时间格式化程序(作为建议的答案之一)。

3 个答案:

答案 0 :(得分:2)

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

将旧的java.util.DateSimpleDateFormatter放在后面,只需在需要它与库进行交互时转换为它们。

答案 1 :(得分:0)

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

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

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

答案 2 :(得分: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