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
答案 0 :(得分:7)
您的问题是,您使用YYYY
代表Week year
,而您想yyyy
代表year
,请参阅所有选项here。< / p>
SimpleDateFormat sdf = new SimpleDateFormat("MMM dd, yyyy, EEE", Locale.US);
答案 1 :(得分:3)
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年。