【问题标题】:Incorrect date parsing using SimpleDateFormat, Java使用 SimpleDateFormat,Java 的日期解析不正确
【发布时间】:2012-05-23 06:47:30
【问题描述】:

我需要使用日期模式“yyyy-MM-dd”从输入字符串中解析日期,如果日期将以任何其他格式出现,则抛出错误。

这是我解析日期的一段代码:

private void validateDate() throws MyException {
  Date parsedDate;
  String DATE_FORMAT = "yyyy-MM-dd";
  try{
    parsedDate = new SimpleDateFormat(DATE_FORMAT).parse(getMyDate());
    System.out.println(parsedDate);
  } catch (ParseException e) {
    throw new MyException(“Error occurred while processing date:” + getMyDate());
  }

}

当我在 myDate 中输入像“2011-06-12”这样的字符串时,我会得到输出“Thu Sep 29 00:00:00 EEST 2011”,这很好。

当我发送像“2011-0612”这样的错误字符串时,我收到了预期的错误。

当我尝试传递一个仍然有两个“连字符”但位数错误的字符串时,问题就开始了。 示例:

输入字符串“2011-06-1211” 结果“2014 年 9 月 23 日星期二 00:00:00 EEST”。

输入字符串“2011-1106-12” 结果“2 月 12 日星期一 00:00:00 EET 2103”。

我无法更改字符串日期的输入格式。

如何避免?

【问题讨论】:

  • 我不确定“2011-06-12”作为 myDate 中的输入如何得到输出“Thu Sep 29 00:00:00 EEST 2011”是好的。你应该得到 6 月 12 日的输出 - 而不是 9 月 29 日...

标签: java simpledateformat parse-error


【解决方案1】:

您是否尝试在您的SimpleDateFormat 上拨打setLenient(false)

import java.util.*;
import java.text.*;

public class Test {

    public static void main(String[] args) throws Exception {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        format.setLenient(false);
        Date date = format.parse("2011-06-1211"); // Throws...
        System.out.println(date);
    }
}

请注意,我还建议您设置SimpleDateFormat 的时区和语言环境。 (或者,改用Joda Time...)

【讨论】:

  • 感谢您的回答。我会运行测试并给你反馈。但目前看来问题已经解决了。
  • 在 simpleDateFormat 中,它总是返回错误的月份。这是什么原因?
  • @AnandSavjani:不,它没有。我无法用这么少的信息判断你做错了什么,但SimpleDateFormat 工作得相当合理。如果您认为它已损坏,我建议您提出一个新问题,并使用一个简短但完整的程序来演示该问题。
  • @JonSkeet :在我的情况下,我尝试使用 simpleDateFormat 解析 2015 年 9 月 28 日,但它返回我 2015-22-28 作为日期。请建议我为它做什么?
  • @AnandSavjani:我已经建议你应该怎么做:“提出一个新问题,用一个简短但完整的程序演示问题”。
【解决方案2】:

同样的问题,我注意到当我直接在 main 方法中使用此代码时,它会返回正确的日期,而当我通过单独的方法使用相同的代码时,它会返回错误的日期

String string = "03/01/2015";
DateFormat format = new SimpleDateFormat("MM/dd/yyyy", Locale.ENGLISH);
Date date1 = format.parse(string);
System.out.println(new SimpleDateFormat("dd/MM/yyyy").format(date));

函数中返回错误日期的代码

public Date isValidDate(String dateToValidate, String dateFormat){

  if(dateToValidate == null){
     return null;
  }

  DateFormat format = new SimpleDateFormat(dateFormat,Locale.ENGLISH);
  //format.setLenient(false);

  Date date;
  try {

      date = format.parse(dateToValidate);

  } catch (ParseException e) {

      e.printStackTrace();
      return null;
  }

  return date;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-28
    相关资源
    最近更新 更多