资讯

展开

Java获取指定时间年月日 | 时间戳转换bug你的项目中招了吗 | yyyy和YYYY的区别

作者:快盘下载 人气:

最近在知乎看到有篇回答说:跨年导致日期格式YYYY和yyyy导致日期显示Bug的帖子,微信公众号、一些论坛好多中招了,快来看看你的项目里面有没有这个bug吧,哈哈lo(╥﹏╥)o。

在网上有人发帖子说,腾讯的微信公众平台在2019年元旦所在的一周日期全部按照2020显示了,如2019-12-31显示为了2020-12-31。评论说应该是日期格式使用出错。

Java获取指定时间年月日 | 时间戳转换bug你的项目中招了吗 | yyyy和YYYY的区别

下面是一个网友的复现日历格式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

Python

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

祝君工作顺利,加油。

加载全部内容

相关教程
猜你喜欢
用户评论
快盘暂不提供评论功能!