Java 日期时间分析未强制执行该格式

Java 日期时间分析未强制执行该格式,java,scala,datetime,Java,Scala,Datetime,我有一个字符串和一个格式。我想使用该格式将字符串转换为日期时间。但是简单的日期时间格式将字符串转换为日期时间,即使输入字符串的格式错误 val formatter = new SimpleDateFormat("yyyyMMdd") val dateInString = "2017042er7" try { formatter.setLenient(false) val date = formatter.parse(dateInString) System.out.println(date)

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

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)
}
如何强制执行格式


**更新::**使用joda时间格式化程序解决了此问题。您还可以使用java时间格式化程序(正如建议的答案之一)。

setLenient
不太关心字符串格式,而是可以将传递的值转换为日期。例如,应将2017年9月31日<代码>视为2017年8月1日<代码>吗

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


顺便说一句,我并不一定同意这个实现,只是想解释一下它的工作原理:)

setLenient
不太关心字符串格式,而是可以将传递的值转换为日期。例如,应将2017年9月31日<代码>视为2017年8月1日<代码>吗

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


顺便说一句,我并不一定同意这个实现,只是想解释一下它的工作原理:)

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


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

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

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

tl;博士 2017-04-27

提取数字 如中所述,仅从字符串中提取数字

String original = "2017042er7" ;
String input = original.replaceAll( "\\D+" , "" ) ;
解析为
LocalDate
避免问题中出现的麻烦的旧遗留日期时间类。被java.time类取代

该类表示一个仅限日期的值,不包含一天中的时间和时区

该类包含预定义的格式设置模式以满足您的需要:。这是标准格式的“基本”版本(尽量减少使用分隔符)

看这个

原件:2017042er7

ld.toString():2017-04-27

tl;博士 2017-04-27

提取数字 如中所述,仅从字符串中提取数字

String original = "2017042er7" ;
String input = original.replaceAll( "\\D+" , "" ) ;
解析为
LocalDate
避免问题中出现的麻烦的旧遗留日期时间类。被java.time类取代

该类表示一个仅限日期的值,不包含一天中的时间和时区

该类包含预定义的格式设置模式以满足您的需要:。这是标准格式的“基本”版本(尽量减少使用分隔符)

看这个

原件:2017042er7

ld.toString():2017-04-27


它不应该完全按照格式进行解析。否则,提供格式有什么意义呢。我得到了一个错误的值,而我正在期待其他东西。我会说这是一个糟糕的实现。乔达时间比较好。使用joda time解决了我遇到的问题。我并不反对,只是解释了为什么会看到结果。它不应该完全按照格式进行解析。否则,提供格式有什么意义呢。我得到了一个错误的值,而我正在期待其他东西。我会说这是一个糟糕的实现。乔达时间比较好。使用joda time解决了我遇到的问题。我并不反对,只是解释了为什么会看到结果。@Luniam是的,但你应该放弃jodatime,转而使用新的java.time,java.time是jodatime post java 8的继承者。@Luniam是的,但实际上,您应该放弃jodatime,转而使用新的java.time以及java.time,后者是jodatime post java 8.FYI的继承者,诸如
java.util.date
java.text.SimpleTextFormat
等令人烦恼的旧日期时间类现在被这些类所取代。同样,该项目现在正在进行中,团队建议迁移到java.time classes.FYI,像
java.util.date
java.text.SimpleTextFormat
这样麻烦的旧日期时间类现在被类所取代。同样,该项目现在已经开始,团队建议迁移到java.time类。
LocalDate ld = LocalDate.parse( input , DateTimeFormatter.BASIC_ISO_DATE ) ;