在java中解析字符串到日期格式默认为1和月到1月

时间:2015-10-30 02:20:50

标签: java

我正在尝试接受日期的用户输入,格式如下:“2000小时,星期四,2015年7月20日”。然后我将其转换为日期格式以对其进行操作。但是从字符串到日期的转换是默认月份到1月,日期为1.这是代码片段:

    String userDateFormat = "HHmm 'hrs', EEEE, MMMM dd, YYYY";
    SimpleDateFormat userDateFormatter = new SimpleDateFormat(userDateFormat);
    String reference_date = "2000 hrs, Thursday, July 20, 2015";

    Date date = null;
    try {
        date = userDateFormatter.parse(reference_date);
    } catch (ParseException e) {
        System.out.println("Date must be in the format " + userDateFormat);
    }

    System.out.println(userDateFormatter.format(date));

以下方法块打印: 2015年1月1日,星期四,2000小时。 有什么线索的原因?

2 个答案:

答案 0 :(得分:4)

因为您在需要YYYY和2015年7月20日时使用了yyyy,所以2015年是星期一。你想要像

这样的东西
String userDateFormat = "HHmm 'hrs', EEEE, MMMM dd, yyyy";
SimpleDateFormat userDateFormatter = new SimpleDateFormat(
        userDateFormat);
String reference_date = "2000 hrs, Monday, July 20, 2015";

然后输出

2000 hrs, Monday, July 20, 2015

然后SimpleDateFormat Javadoc说(部分)

Letter    Date or Time Component  Presentation    Examples
G         Era designator          Text            AD
y         Year                    Year            1996; 96
Y         Week year               Year            2009; 09

答案 1 :(得分:1)

java.time

    DateTimeFormatter userDateTimeFormatter
            = DateTimeFormatter.ofPattern("HHmm 'hrs', EEEE, MMMM dd, uuuu", Locale.ENGLISH);
    String referenceDate = "2000 hrs, Monday, July 20, 2015";
    LocalDateTime dateTime = LocalDateTime.parse(referenceDate, userDateTimeFormatter);
    System.out.println(dateTime.format(userDateTimeFormatter));

输出是:

  

2015年7月20日,星期一,2000小时

answer by Elliott Frisch是正确的。我使用现代Java日期和时间API java.time来提供现代答案。当问到这个问题时,已经有一年半了。现在它已有四年历史了。我还提供了一个明确的语言环境。您的日期时间是英语,虽然您的默认语言环境可能也是如此,但如果有一天您在不同语言环境中的计算机上运行它或者您只是更改自己的语言环境设置,那么依赖它的代码将会中断。

你是唯一一个在格式模式字符串中使用不正确的大小写的错误。有关此问题的问题一直在Stack Overflow上提出。 SimpleDateFormat以表现而闻名:它会给你一个不正确的结果,假装一切都很好,你真的希望它能通知你出错了,例如抛出异常。

现代API 会在您为其提供可检测到的错误输入时抛出异常。例如:

    DateTimeFormatter userDateTimeFormatter
            = DateTimeFormatter.ofPattern("HHmm 'hrs', EEEE, MMMM dd, YYYY", Locale.ENGLISH);
    String referenceDate = "2000 hrs, Thursday, July 20, 2015";

结果:

  

java.time.DateTimeException:无法从中获取LocalDate   TemporalAccessor:{MonthOfYear = 7,DayOfWeek = 4,   WeekBasedYear [WeekFields [SUNDAY,1]] = 2015,DayOfMonth = 20},ISO已解决   到java.time.format.Parsed类型的20:00

它的可读性不高。需要注意的是“WeekBasedYear”。基于周的年份仅对周数有用,所以这里错了。而且the docs会告诉你,大写YYYY给了你这个。我们来修理:

    DateTimeFormatter userDateTimeFormatter
            = DateTimeFormatter.ofPattern("HHmm 'hrs', EEEE, MMMM dd, uuuu", Locale.ENGLISH);

使用DateTimeFormatter习惯使用uuuu年份。 yyyy在0年后也可以使用多年。但是我们还没有完成:

  

java.time.DateTimeException:发现冲突:Field DayOfWeek 1不同   来自DayOfWeek 4源自2015-07-20

现代API也拒绝接受一周中不正确的日期,因此您可以完全验证您的日期(但是,如果您不想进行此验证,则可以使用它来说服它)。正如Elliott Frisch所说,2015年7月20日是星期一(本周的第1天),而不是星期四。在我上面的第一个片段中,我也修复了这个错误,这样就可以了。

链接: Oracle tutorial: Date Time解释如何使用java.time