java date parse missbehaviour

时间:2018-04-27 08:22:49

标签: java date

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

4 个答案:

答案 0 :(得分:7)

您的问题是,您使用YYYY代表Week year,而您想yyyy代表year,请参阅所有选项here。< / p>

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

答案 1 :(得分:3)

根据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)

答案 2 :(得分:3)

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

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

日期字符串:"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部分后,您日期的日期和月份将被丢弃,并被“年周”计算的结果替换。)

答案 3 :(得分:0)

Y代表一周

来自Java doc

  

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

     

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