我有一个字符串和格式。我想使用格式将字符串转换为日期时间。但简单的日期时间格式是将字符串转换为日期时间,即使输入字符串格式错误。
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时间格式化程序(作为建议的答案之一)。
答案 0 :(得分:2)
您应该使用新的java.time
API及其DateTimeFormatter
来解析您的日期。它允许更大的控制和正确性,并且格式更严格。
将旧的java.util.Date
和SimpleDateFormatter
放在后面,只需在需要它与库进行交互时转换为它们。
答案 1 :(得分:0)
setLenient
并不关心String格式,而是传递的值可以转换为日期。例如,31-Sept-2017
应该被视为01-Aug-2017
。
图书馆试图通过解析你的输入来提供帮助(dd是一个数字,因此2满足了这个要求,之后的所有内容都可以被忽略)。如果您要求String
格式准确,那么您应该使用正则表达式在转换之前验证输入。
答案 2 :(得分:0)
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