【问题标题】:Strange behaviour of ww SimpleDateFormatww SimpleDateFormat 的奇怪行为
【发布时间】:2014-05-08 12:48:11
【问题描述】:

谁能解释为什么我在尝试解析日期时会得到这些值? 我尝试了三种不同的输入,如下所示:

1) 2013 年第三周

Date date = new SimpleDateFormat("ww.yyyy").parse("02.2013");
Calendar cal = Calendar.getInstance();
cal.setTime(date);
System.out.println(cal.get(Calendar.WEEK_OF_YEAR) + "." + cal.get(Calendar.YEAR));

哪个输出:02.2013(如我所料)

2) 2013 年的第一周

Date date = new SimpleDateFormat("ww.yyyy").parse("00.2013");
Calendar cal = Calendar.getInstance();
cal.setTime(date);
System.out.println(cal.get(Calendar.WEEK_OF_YEAR) + "." + cal.get(Calendar.YEAR));

哪个输出:52.2012(这对我来说很好,因为 2013 年的第一周也是 2012 年的最后一周)

3) 2013 年第二周

Date date = new SimpleDateFormat("ww.yyyy").parse("01.2013");
Calendar cal = Calendar.getInstance();
cal.setTime(date);
System.out.println(cal.get(Calendar.WEEK_OF_YEAR) + "." + cal.get(Calendar.YEAR));

哪个输出:1.2012(这对我来说绝对没有意义)

有人知道为什么会这样吗?我需要以格式(一年中的星期)解析日期。(年)。我使用了错误的模式吗?

【问题讨论】:

  • 提示:考虑改变您的周格式以遵循ISO 8601 标准定义的明确格式。像这样:2014-W19。然后Joda-Time 库可以帮助您使用内置在ISODateTimeFormat 工厂中的格式化程序来解析和生成此类字符串。

标签: java parsing simpledateformat


【解决方案1】:

您使用的是ww,它是“一周中的一周”,然后是yyyy,它是“日历年”而不是“周年”。设置星期几,然后设置日历年是一个问题的根源,因为它们实际上只是单独的编号系统。

您应该在格式字符串中使用YYYY 来指定周年...尽管不幸的是,您似乎无法以理智的方式获取该值。 (我希望有一个 Calendar.WEEKYEAR 常量,但没有这样的东西。)

此外,一年中的周值从 1 开始,而不是 0...并且没有一周是在两周年中;它是要么 2013 年的第一周 这是 2012 年的最后一周......它不是两者。

如果可能的话,我个人会避免使用周年和周 - 它们可能会非常令人困惑,尤其是当一个日历年的日期位于不同的周年时。

【讨论】:

  • 谢谢,现在我明白为什么有yyyy和YYYY了
  • 问题(正如你提到的)是我无法获得周年的值(我需要它,我只是解析字符串来验证它)。我是否应该发布另一个问题以查看是否有人知道我该怎么做?
  • @fvdalcin:是的,发布另一个问题 - 但请解释您的实际情况。您对“一年中的几周”的想法是否与java.util.Calendar 的做法一致?您可能还想考虑使用 Joda Time,它不仅可以提供这些信息,而且在各个方面都是更好的日期/时间 API。
【解决方案2】:

使用Calendar.getWeekYear() 获取与Calendar.WEEK_OF_YEAR 字段同步的年份值。 在GregorianCalendar doc 上有更多关于一年中的一周和一周年的信息。

【讨论】:

    猜你喜欢
    • 2016-08-30
    • 2013-08-25
    • 2021-11-25
    • 1970-01-01
    • 1970-01-01
    • 2011-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多