当前位置: 首页 > 面试题库 >

为什么SimpleDateFormat解析错误的日期?

令狐声
2023-03-14
问题内容

我有字符串格式的日期,我想将其解析为使用日期。

var date ="03/11/2013"

我将其解析为:

new SimpleDateFormat("MM/dd/yyyy").parse(date)

但是奇怪的是,如果我传递的是“ 03-08- 201309 hjhkjhk ”或“ 03- 88 -2013”​​或 43
-88-201378,它不会抛出错误,而是对其进行解析。

为此,我必须编写正则表达式模式以检查日期的输入是否正确。但是为什么会这样呢?

代码:

scala> val date="03/88/201309 hjhkjhk"
date: java.lang.String = 03/88/201309 hjhkjhk

scala> new SimpleDateFormat("MM/dd/yyyy").parse(date)
res5: java.util.Date = Mon May 27 00:00:00 IST 201309

问题答案:

您应该使用DateFormat.setLenient(false)

SimpleDateFormat df = new SimpleDateFormat("MM/dd/yyyy");
df.setLenient(false);
df.parse("03/88/2013"); // Throws an exception

我不确定是否可以捕获 您想要的 所有内容 -我似乎还记得,即使setLenient(false)它比您预期的宽容得多-
但它应该捕获无效的月份数。

我认为它不会捕获尾随文本,例如“ 03/01/2013
sjsjsj”。您可能使用其中的重载parse接受ParsePosition,然后在解析完成后检查当前的解析索引:

ParsePosition position = new ParsePosition(0);
Date date = dateFormat.parse(text, position);
if (position.getIndex() != text.length()) {
    // Throw an exception or whatever else you want to do
}

您还应该查看Joda Time API,它很可能允许进行更严格的解释-
而且无论如何,它通常是一种更干净的日期/时间API。



 类似资料:
  • 我有字符串格式的日期,我想解析成使用日期。 我将其解析为: 但奇怪的是,如果我通过"03-08-201309hjhkjhk"或"03-88-2013"或43-88-201378",它不会抛出错误,它会解析它。 现在,我必须编写正则表达式模式来检查日期的输入是否正确。但为什么会这样呢?? 代码:

  • 问题内容: 我有这个代码: 而且我希望dateFormat.parse调用会引发ParseException,因为我提供的年份长5个字符,而不是像我定义的格式那样长4个字符。但是出于某种原因,即使将lenient设置为false,此调用也会返回Date对象10/20/20128。 这是为什么?这对我来说没有多大意义。还有其他设置可以使其更加严格吗? 问题答案: 20128是有效的一年,我想Java

  • 问题内容: 前三行工作正常。当我再次尝试将字符串解析为日期时,出现错误。我该如何解决? 错误看起来像这样: 问题答案: 为我工作。在模式末尾使用“ SSSZ”而不是“ SZ”。

  • 问题内容: SimpleDateFormat: 抛出的异常: 有任何想法吗? 编辑: 感谢您的快速解答。你们都是正确的,我只是错过了SimpleDateFormat文档中的一个关键句子-我可能应该把它称为一天。 问题答案: 从SimpleDateFormat javadocs : 月:如果图案字母的数目为3或更多,则将月份解释为文本;否则,将其解释为数字。 尝试使用“ MMM dd yyyy”之类

  • 问题内容: 谁能告诉我这段代码有什么问题: 输出是: 当输入时间以毫秒为单位时,请注意以分钟为单位的差异。 问题答案: 对于,毫秒格式的值包含大写字符,而不是秒的小写字符。 秒(秒)55 毫秒数978 它解释为秒,并将这些秒(847秒是13分钟47秒)添加到您的值中。 使用毫秒。 顺便说一句,如果相同,则无需多次创建。您可以创建一次,将其保存到变量中,然后多次调用,对于您要解析的每个日期/时间字符

  • 问题内容: 我遇到了一种奇怪的行为,这使我感到好奇,并且还没有令人满意的解释。 为简单起见,我将注意到的症状减少到以下代码: 运行此代码时,我得到的内容与以下输出非常相似: true,areAllFieldsSet = true,lenient = true,zone = sun.util.calendar.ZoneInfo [id =“ America / Los_Angeles”,offset