天天看點

ISO 8601中周數的處理及 Joda-Time 的使用

不知道你是否忍受夠了JDK 中對周這種日期的處理,比如 2017-1-1.這天不知道你是該記為 2017年的第0周,還是第一周。而且周日到底是每周的第1天,或者是第0天,或者是周一才是每周的第1天,周日是第7天。總之,各個國家和地區都有不同的統計方式,而且中國古代曆法根本就沒有周的概念,也就是說周對于我們來說是個舶來品。統計方式每個人群組織都有不同的見解,雖然有國家标準,鮮有人去統一執行。

還好,國際化标準組織的國際标準ISO 8601 對日期和時間的表示方法做出了明确規定,周數也計算方式也做了詳細的說明,包括中國在内的國家标準 GB/T 7408-2005 都是依據該标準擴充而來。

根據ISO 8601 的規則。 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年。

既然有了這麼好的一個國際标準,大部分程式設計語言自然會對其支援。我們就按照這個标準執行,在資料的計算上就不應該有問題了,可是偏偏JDK1.7 及其之前的版本居然都不支援ISO 8601 标準。還好民間的力量比較大。有衆多API包都釋出了對ISO 8601 的支援,其中joda-time最為流行。

引入 (maven項目) <dependency> <groupId>joda-time</groupId> <artifactId>joda-time</artifactId> <version>2.9.9</version></dependency>

1、Date轉Joda-time

Date date = new Date();
DateTime dateTime = new DateTime(date);
           

2、Joda-time轉為Date

DateTime dateTime = new DateTime();
Date date = dateTime.toDate();
           

3、Calender轉為Joda-time

Calendar c = Calendar.getInstance();
DateTime dt3 = new DateTime(c);
           

4、Joda-time轉為Calender DateTime dateTime = new DateTime();

Calendar c = dateTime.toCalendar(Locale.CHINA);
           

5、string轉為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);
           

參考網址 http://www.joda.org/joda-time/ https://en.wikipedia.org/wiki/ISO_8601 https://en.wikipedia.org/wiki/ISO_week_date