Java中java.util.Date年末日期转字符串出现年份错误求助
问题分析与解决方案
你遇到的这个日期格式化错误,根源在于**YYYY和yyyy的语义差异**:
yyyy:代表普通的公历年(Calendar Year),也就是我们日常使用的年份。YYYY:代表周年(Week Year),它是基于ISO周历规则计算的年份——一周从周一开始,且一年的第一周必须包含至少4天在当年。
2017年12月31日是周日,按照ISO周历规则,这一天属于2018年的第一周(因为2018年1月1日是周一,该周包含2017年12月31日和2018年的前4天),所以用YYYY格式化时就会错误地得到2018。
修正后的代码
只需要把格式化模式中的YYYY替换成yyyy即可:
String dateSt = "Sun Dec 31 10:30:00 IST 2017"; DateFormat formatter = new SimpleDateFormat("E MMM dd HH:mm:ss Z yyyy"); Date date = formatter.parse(dateSt); DateFormat ft= new SimpleDateFormat("yyyyMMdd"); // 这里把YYYY改成yyyy String dateStr = ft.format(date); System.out.println("New Date =="+dateStr);
运行这段代码后,输出就会是预期的20171231。
额外建议:使用Java 8+的新日期API
SimpleDateFormat是线程不安全的,而且旧的Date/CalendarAPI设计存在诸多缺陷。推荐使用Java 8引入的java.time包下的API,示例代码如下:
import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; public class DateDemo { public static void main(String[] args) { String dateSt = "Sun Dec 31 10:30:00 IST 2017"; DateTimeFormatter inputFormatter = DateTimeFormatter.ofPattern("E MMM dd HH:mm:ss z uuuu"); ZonedDateTime zonedDateTime = ZonedDateTime.parse(dateSt, inputFormatter); DateTimeFormatter outputFormatter = DateTimeFormatter.ofPattern("uuuuMMdd"); String dateStr = outputFormatter.format(zonedDateTime); System.out.println("New Date =="+dateStr); } }
这里用uuuu代替yyyy(语义一致,但更符合新API的规范),z代表时区标识,ZonedDateTime可以正确处理带时区的日期时间,而且新API是线程安全的,使用起来更可靠。
内容的提问来源于stack exchange,提问作者vinod kumar
相关产品推荐
相关产品推荐

