今天,遇到一個奇怪的問題,之前也沒有注意,固然不多這樣寫,由於公司項目部分是由外包公司開發的,也沒有仔細的review代碼。因爲iOS時間格式爲「YYYY-MM-dd」引發時間相差一年,也就是每一年的12月29日開始後一週裏若是這樣使用會引發時間相差一年。我查了一下資料,具體事說YYYY表明 「week of year」,yyyy表明calendar year。(細節問題,相信不少人之前都沒注意!)sql
原文: ide
A common mistake is to use YYYY. yyyy specifies the calendar year whereas YYYY specifies the year (of 「Week of Year」), used in the ISO year-week calendar. In most cases, yyyy and YYYY yield the same number, however they may be different. Typically you should use the calendar year.ui
Both results are correct, the difference is because the DateUtils.WeekOfTheYear function uses the ISO 8601 standard definition of a week. That is, a week is considered to start on a Monday and end on a Sunday. Check this explanation about the Weeks Numbers in the ISO 8601 format. If 1 January is on a Monday, Tuesday, Wednesday or Thursday, it is in week 01. If 1 January is on a Friday, Saturday or Sunday, it is in week 52 or 53 of the previous year (there is no week 00). 28 December is always in the last week of its year. Also the Embarcadero online help for the DateUtils.WeekOfTheYear function says ....if the first calendar day of the year is a Friday, Saturday, or Sunday, then for the first three, two, or one days of the calendar year, WeekOfTheYear returns the last week of the previous year. Similarly, if the last calendar day of the year is a Monday, Tuesday, or Wednesday, then for the last one, two, or three days of the calendar year, WeekOfTheYear returns 1 (the first week of the next calendar year). So due which the 01-01-2011 was Saturday this week is considered the week number 52 of the previous year. And that also explains why the week number returned for today (19-10-2011) is 42 instead of 43.
使用YYYY 是根據每一年按52周或者53周獲得年份,它規定每一年的12月28必定是本年的。也能夠這樣理解就是若是1月1號是星期5、星期6、星期天,那麼接下來的屬於這個星期的這幾天都是前一年的,這一週是本年的最後一週。若是1月1號是星期1、星期2、星期3、星期四,這周的時間(前一年可能還有0-3天是本週的哦)都算新的一年的第一週。這樣就清楚了!知道緣由了也好解決。this
下面介紹其餘基本的時間格式含義(網上覆制的)。spa
時間分隔符。在某些區域設置中,能夠使用其餘字符表示時間分隔符。時間分隔符在格式化時間值時分隔小時、分鐘和秒。格式化輸出中用做時間分隔符的實際字符由您的應用程序的當前區域性值肯定。orm
(/)three
日期分隔符。在某些區域設置中,能夠使用其餘字符表示日期分隔符。日期分隔符在格式化日期值時分隔日、月和年。格式化輸出中用做日期分隔符的實際字符由您的應用程序的當前區域性肯定。ci
(%)開發
用於代表不論尾隨什麼字母,隨後字符都應該以單字母格式讀取。也用於代表單字母格式應以用戶定義格式讀取。有關更多詳細信息,請參見下面的內容。字符串
d
將日顯示爲不帶前導零的數字(如 1)。若是這是用戶定義的數字格式中的惟一字符,請使用 %d。
dd
將日顯示爲帶前導零的數字(如 01)。
EEE
將日顯示爲縮寫形式(例如 Sun)。
EEEE
將日顯示爲全名(例如 Sunday)。
M
將月份顯示爲不帶前導零的數字(如一月表示爲 1)。若是這是用戶定義的數字格式中的惟一字符,請使用 %M。
MM
將月份顯示爲帶前導零的數字(例如 01/12/01)。
MMM
將月份顯示爲縮寫形式(例如 Jan)。
MMMM
將月份顯示爲完整月份名(例如 January)。
gg
顯示時代/紀元字符串(例如 A.D.)
h
使用 12 小時制將小時顯示爲不帶前導零的數字(例如 1:15:15 PM)。若是這是用戶定義的數字格式中的惟一字符,請使用 %h。
hh
使用 12 小時制將小時顯示爲帶前導零的數字(例如 01:15:15 PM)。
H
使用 24 小時制將小時顯示爲不帶前導零的數字(例如 1:15:15)。若是這是用戶定義的數字格式中的惟一字符,請使用 %H。
HH
使用 24 小時制將小時顯示爲帶前導零的數字(例如 01:15:15)。
m
將分鐘顯示爲不帶前導零的數字(例如 12:1:15)。若是這是用戶定義的數字格式中的惟一字符,請使用 %m。
mm
將分鐘顯示爲帶前導零的數字(例如 12:01:15)。
s
將秒顯示爲不帶前導零的數字(例如 12:15:5)。若是這是用戶定義的數字格式中的惟一字符,請使用 %s。
ss
將秒顯示爲帶前導零的數字(例如 12:15:05)。
f
顯示秒的小數部分。例如,ff 將精確顯示到百分之一秒,而 ffff 將精確顯示到萬分之一秒。用戶定義格式中最多可以使用七個 f 符號。若是這是用戶定義的數字格式中的惟一字符,請使用 %f。
t
使用 12 小時制,並對中午以前的任一小時顯示大寫的 A,對中午到 11:59 P.M 之間的任一小時顯示大寫的 P。若是這是用戶定義的數字格式中的惟一字符,請使用 %t。
tt
對於使用 12 小時制的區域設置,對中午以前任一小時顯示大寫的 AM,對中午到 11:59 P.M 之間的任一小時顯示大寫的 PM。
對於使用 24 小時制的區域設置,不顯示任何字符。
y
將年份 (0-9) 顯示爲不帶前導零的數字。若是這是用戶定義的數字格式中的惟一字符,請使用 %y。
yy
以帶前導零的兩位數字格式顯示年份(若是適用)。
yyy
以四位數字格式顯示年份。
yyyy
以四位數字格式顯示年份。
z
顯示不帶前導零的時區偏移量(如 -8)。若是這是用戶定義的數字格式中的惟一字符,請使用 %z。
zz
顯示帶前導零的時區偏移量(例如 -08)
zzz
顯示完整的時區偏移量(例如 -08:00)