不要使用 YYYY ,使用 yyyy 來獲取年份

@org.junit.Test
public void test() throws ParseException {
    SimpleDateFormat yyyy = new SimpleDateFormat("MM-dd-yyyy");
    SimpleDateFormat YYYY = new SimpleDateFormat("MM-dd-YYYY");

    System.out.println(yyyy.format(new Date()));
    System.out.println(YYYY.format(new Date()));

    System.out.println(yyyy.parse("12-25-2018"));
    System.out.println(YYYY.parse("12-25-2018"));
}

Console:      
01-06-2019
01-06-2019
Tue Dec 25 00:00:00 CST 2018
Sun Dec 31 00:00:00 CST 2017

使用format 出來的日期的正確的,不要歡喜的太早,parse 給出的結果就徹底讓人摸不着頭腦。java

在 ISO 8601 中 Y 表明的是 Week of year, 是不能和 MM``dd 一塊兒使用的。要想用他須要和其餘的格式化元素一塊兒使用, u (一週當中的某天) 和 ww (一年中的某周),使用這兩個元素咱們就能夠正確的表示日期了。 這是一月份的日曆編程

January 2019      
Su Mo Tu We Th Fr Sa  
       1  2  3  4  5  
 6  7  8  9 10 11 12  
13 14 15 16 17 18 19  
20 21 22 23 24 25 26  
27 28 29 30 31
@org.junit.Test
public void test() throws ParseException {
    SimpleDateFormat YYYY = new SimpleDateFormat("ww-u-YYYY");

    System.out.println(YYYY.format(new Date()));

    System.out.println(YYYY.parse("53-2-2018"));
    System.out.println(YYYY.parse("01-2-2019"));
}

Console:
02-7-2019
Tue Jan 01 00:00:00 CST 2019
Tue Jan 01 00:00:00 CST 2019

u 按照java 文檔的解釋爲Day number of week (1 = Monday, ..., 7 = Sunday), 是從1 開始的,會讓你覺得一週是從週一到週日,但從上面的執行來看,7 也就是週日應該是每週開始的第一天swift

Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.DAY_OF_YEAR, 1);//2019 Jan 1st
System.out.println(YYYY.format(calendar.getTime()));

calendar.set(Calendar.DAY_OF_YEAR, 6); //2019 Jan 6th
System.out.println(YYYY.format(calendar.getTime()));

calendar.set(Calendar.DAY_OF_YEAR, 7); //2019 Jan 7th
System.out.println(YYYY.format(calendar.getTime()));

Console:

01-2-2019
02-7-2019
02-1-2019

這挺讓人糊塗的,須要記住這個規則,其餘編程語言中都將週日做爲0來處理,更符合人們的心理。編程語言

回到最上面的那個,當咱們使用MM-dd-YYYY來 parse 一個字符串日期的時候,出現了奇怪的結果。咱們再作一下實驗:code

System.out.println(YYYY.parse("02-02-2017"));
System.out.println(YYYY.parse("04-20-2017"));
System.out.println(YYYY.parse("12-25-2018"));
System.out.println(YYYY.parse("01-01-2018"));
System.out.println(YYYY.parse("12-26-2019"));
System.out.println(YYYY.parse("02-02-2019"));

Console:

Sun Jan 01 00:00:00 CST 2017
Sun Jan 01 00:00:00 CST 2017
Sun Dec 31 00:00:00 CST 2017
Sun Dec 31 00:00:00 CST 2017
Sun Dec 30 00:00:00 CST 2018
Sun Dec 30 00:00:00 CST 2018

對照日曆能夠發現,這些日期都是每一年的第一週的第一天(週日)。所以在其餘元素與YYYY不匹配時,程序永遠獲取的是默認的第一週第一天。orm

注: Erica Sadun 的 ISO-8601, YYYY, yyyy, and why your year may be wrong 使用swift 語言演示了這種狀況,Java語言在格式化語句與默認行爲上與 Apple 都不一致,記錄在此。文檔

相關文章
相關標籤/搜索