【程序猿硬核科普】Java获取指定时间年月日 | 时间戳转换bug你的项目中招了吗 | yyyy和YYYY的区别

  • 2020 年 2 月 13 日
  • 笔记

最近在知乎看到有篇回答说:跨年导致日期格式YYYYyyyy导致日期显示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

祝君工作顺利,加油。