【问题标题】:java date parse missbehaviour [duplicate]java日期解析错误行为[重复]
【发布时间】:2018-04-27 08:22:49
【问题描述】:
SimpleDateFormat sdf = new SimpleDateFormat("MMM dd, YYYY, EEE", Locale.US);

System.out.println(sdf.format(new Date()));
System.out.println(sdf.format(sdf.parse("Apr 27, 2018, Fri")));

Java 未按预期解析日期并输出:

Apr 27, 2018, Fri
Jan 05, 2018, Fri // I can not understand why java parse the month of April as January

【问题讨论】:

  • 我建议您避免使用 SimpleDateFormat 类。它不仅与Date 一起早已过时,而且还出了名的麻烦。今天我们在java.time, the modern Java date and time API 和它的DateTimeFormatter 中做得更好。

标签: java date


【解决方案1】:

您的问题是您使用的是YYYY,它代表Week year,而您想要的是yyyy,它代表year,查看所有选项here

SimpleDateFormat sdf = new SimpleDateFormat("MMM dd, yyyy, EEE", Locale.US);

【讨论】:

    【解决方案2】:

    根据SimpleDateFormat Javadoc

    y    Year    
    Y    Week year  
    

    所以你想使用yyyy 而不是YYYY

    SimpleDateFormat sdf = new SimpleDateFormat("MMM dd, yyyy, EEE", Locale.US);
    
    System.out.println(sdf.format(new Date()));
    System.out.println(sdf.format(sdf.parse("Apr 27, 2018, Fri")));
    

    将导致 int:

    Apr 27, 2018, Fri
    Apr 27, 2018, Fri
    

    请注意,在使用 SimpleDateFormat 时您可能希望设置 sdf.setLenient(false)

    【讨论】:

      【解决方案3】:

      正如其他答案中所解释的,您想要的是 yyyy 而不是 YYYY

      现在添加有关您获得的结果的更多信息:

      日期字符串:"Apr 27, 2018, Fri"

      格式:"MMM dd, YYYY, EEE"YYYY 是周年)

      引用How does Java “week year” really work?

      在解析时,SimpleDateFormat 需要一组匹配的值:要么 日、月、年或一周中的一天、一年中的一周、一年中的一周。自从你 提供了一周年,但没有提供一周中的某一天和一年中的一周, 那些值已被假定为 1。

      您没有 一年中的星期 部分(或者您的格式将包含 w),因此假定为 1。

      您最终会在 2018 年的第一周星期五,即:

      Jan 05, 2018, Fri
      

      (一旦格式达到YYYY 部分,您的日期开始的日期和月份将被丢弃,并由“年周”计算的结果替换。)

      【讨论】:

        【解决方案4】:

        Y 代表周年

        来自 Java 文档

        一周年与 WEEK_OF_YEAR 周期同步。之间的所有星期 第一周和最后一周(含)具有相同的周年值。 因此,一周年的第一天和最后一天可能有不同的 日历年值。

        例如,1998 年 1 月 1 日是星期四。如果 getFirstDayOfWeek() 是 MONDAY 和 getMinimalDaysInFirstWeek() 为 4(ISO 8601 标准 兼容设置),然后 1998 年的第 1 周从 1997 年 12 月 29 日开始, 并于 1998 年 1 月 4 日结束。最后三个星期的年份是 1998 年 1997 日历年的天数。但是,如果 getFirstDayOfWeek() 是 星期日,然后 1998 年的第 1 周开始于 1998 年 1 月 4 日,结束于 1998 年 1 月 10 日; 1998 年的前三天是一周的一部分 1997 年的 53 个,他们的周年是 1997 年。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-04-10
          • 2012-06-29
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多