最近在知乎看到有篇回答说:跨年导致日期格式YYYY和yyyy导致日期显示Bug的帖子,微信公众号、一些论坛好多中招了,快来看看你的项目里面有没有这个bug吧,哈哈lo(╥﹏╥)o。
在网上有人发帖子说,腾讯的微信公众平台在2019年元旦所在的一周日期全部按照2020显示了,如2019-12-31显示为了2020-12-31。评论说应该是日期格式使用出错。
下面是一个网友的复现日历格式bug的代码demo,我试了一下,结果不一样,大家也可以试一试,琢磨下日期格式YYYY和yyyy的区别,有兴趣的话可以在公众号后台留言,我们一起探讨下。
Calendar calendar = Calendar.getInstance(); // 2019-12-31 calendar.set(2019, Calendar.DECEMBER, 31); Date strDate1 = calendar.getTime(); // 2020-01-01 calendar.set(2020, Calendar.JANUARY, 1); Date strDate2 = calendar.getTime(); // 大写 YYYY DateFormat dateFormat0 = new SimpleDateFormat("YYYY/MM/dd"); System.out.println("2019-12-31 to YYYY/MM/dd: " + dateFormat0.format(strDate1)); System.out.println("2020-01-01 to YYYY/MM/dd: " + dateFormat0.format(strDate2)); // 小写 YYYY DateFormat dateFormat1 = new SimpleDateFormat("yyyy/MM/dd"); System.out.println("2019-12-31 to yyyy/MM/dd: " + dateFormat1.format(strDate1)); System.out.println("2020-01-01 to yyyy/MM/dd: " + dateFormat1.format(strDate2));
网友贴出的程序输出结果:
可以看到日期格式YYYY和yyyy导致了2019-12-31这一天有两个不同的显示结果!
经过网上查资料得出结论:YYYY是以周来计算年的,意思是当天所在周属于的年份,一周从周日开始算计算,周六结束,只要本周跨年,那么这一周就算下一年的。也就是说:年份如果用Y会是这周的年份,y才是标准的年份。结合上述例子来看,2019-12-31这一天,按照YYYY日历格式,已经算是2020的第一周了。
所以建议以后大家以后使用尽量使用"yyyy-MM-dd"日历格式,避免后续出现日期bug。
YYYY与yyyy文章作者:张大炮来巡山
链接:
https://mp.weixin.QQ.com/s/uz_L47VU4mCIaj8Jhk5ptA 来源:微信公众号文章
Java获取指定时间的年月日几种方法
01
使用 java.util.Calendar (不推荐)
适用范围:Java 7 及之前的版本
import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; public class Demo { public static void main(String[] args) throws ParseException { Date date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2020-01-05 09:27:00"); Calendar now = Calendar.getInstance(); now.setTime(date); int year = now.get(Calendar.YEAR); int month = now.get(Calendar.MONTH) + 1; int day = now.get(Calendar.DAY_OF_MONTH); System.out.println("year: " + year); System.out.println("month: " + month); System.out.println("day: " + day); } }
输出结果:
year: 2020 month: 1 day: 5
02
使用joda-time (推荐)
适用范围:需要下载并导入joda-time包。
下载地址:https://www.joda.org/joda-time/
使用教程:https://blog.csdn.net/whgyxy/article/details/86584535
import org.joda.time.LocalDate; import org.joda.time.format.DateTimeFormat; import org.joda.time.format.DateTimeFormatter; public class Demo { public static void main(String[] args) { DateTimeFormatter formatter = DateTimeFormat.forPattern("YYYY-MM-dd HH:mm:ss"); LocalDate localDate = formatter.parseLocalDate("2020-01-05 09:27:00"); System.out.println("year: " + localDate.getYearOfCentury()); System.out.println("month: " + localDate.getMonthOfYear()); System.out.println("day: " + localDate.getDayOfMonth()); } }
输出结果:
year: 2020 month: 1 day: 5
03
使用datetime(推荐)
适用范围:Java 8及以上版本,在Java8中可以直接使用新的datetime。
import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; public class Demo { public static void main(String[] args) { DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); LocalDateTime ldt = LocalDateTime.parse("2020-01-05 09:27:00", formatter); System.out.println("Year: " + ldt.getYear()); System.out.println("Month: " + ldt.getMonth().getValue()); System.out.println("DayOfMonth: " + ldt.getDayOfMonth()); } }
输出结果:
year: 2020 month: 1 day: 5
祝君工作顺利,加油。