不知道你是否忍受夠了JDK 中對周這種日期的處理败潦,比如 2017-1-1.這天不知道你是該記為 2017年的第0周,還是第一周狸膏。而且周日到底是每周的第1天广料,或者是第0天艾杏,或者是周一才是每周的第1天,周日是第7天假残『呐粒總之嗽仪,各個國家和地區(qū)都有不同的統(tǒng)計方式,而且中國古代歷法根本就沒有周的概念,也就是說周對于我們來說是個舶來品介陶。統(tǒng)計方式每個人和組織都有不同的見解堤舒,雖然有國家標準,鮮有人去統(tǒng)一執(zhí)行哺呜。
還好舌缤,國際化標準組織的國際標準ISO 8601 對日期和時間的表示方法做出了明確規(guī)定,周數(shù)也計算方式也做了詳細的說明弦牡,包括中國在內(nèi)的國家標準 GB/T 7408-2005 都是依據(jù)該標準擴展而來友驮。
根據(jù)ISO 8601 的規(guī)則漂羊。
1驾锰、每年有52周或者53周
2、周一至周日為一個完整周走越。
3椭豫、每周的周一是該周的第1天。周日是該周的第7天
4旨指、每年的第一周 為 每年的第一個周四所在的周赏酥。比如 2017年1月5日為當年的第一個周四,那么 2017-01-02 至 2017-01-08 為2017年第一周
5谆构、每年的最后一周為當年最后一個周四所在的周裸扶。比如2016年12月29日為當年的最后一個周四,那么2016-12-26 至2017-01-01 為2016年的最后一周搬素。
6呵晨、周年,當前周所在的年份為周年熬尺。比如 2017年1月1日的周年為2016年摸屠。2016年1月1日,2016年1月2日粱哼,2016年1月3日的周年均為2015年季二。
既然有了這么好的一個國際標準,大部分編程語言自然會對其支持揭措。我們就按照這個標準執(zhí)行胯舷,在數(shù)據(jù)的計算上就不應(yīng)該有問題了,可是偏偏JDK1.7 及其之前的版本居然都不支持ISO 8601 標準绊含。還好民間的力量比較大桑嘶。有眾多API包都發(fā)布了對ISO 8601 的支持,其中joda-time最為流行艺挪。
引入 (maven項目)
joda-time joda-time 2.9.9
1不翩、Date轉(zhuǎn)Joda-time
Date date = new Date();
DateTime dateTime = new DateTime(date);
2兵扬、Joda-time轉(zhuǎn)為Date
DateTime dateTime = new DateTime();
Date date = dateTime.toDate();
3、Calender轉(zhuǎn)為Joda-time
Calendar c = Calendar.getInstance();
DateTime dt3 = new DateTime(c);
4口蝠、Joda-time轉(zhuǎn)為Calender
DateTime dateTime = new DateTime();
Calendar c = dateTime.toCalendar(Locale.CHINA);
5器钟、string轉(zhuǎn)為Joda-time
DateTimeFormatter fmt = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZZ");
DateTime dt2 = fmt.parseDateTime("2017-05-15T10:25:17.432+08:00");
6、Joda-time格式化輸出
DateTime dt = new DateTime();
dt.toString("yyyy-MM-dd");
// 或者
DateTimeFormatter fmt = DateTimeFormat.forPattern("yyyy-MM-dd");
fmt.print(dt);
參考網(wǎng)址:
http://www.joda.org/joda-time/
https://en.wikipedia.org/wiki/ISO_8601
https://en.wikipedia.org/wiki/ISO_week_date