2016年2月4日 星期四

[.NET] DateTimeOffset與DateTime的差異/ What's the difference between DateTimeOffset and DateTime

說明:在.NET framework中用來處理日期與時間的class有DateTimeOffset跟DateTime,究竟差在哪?


說明:

DateTime:好像最直覺用來處理時間的class,但有下列缺點:
● 轉UTC或LocalTime時,可能會與預期不符,如:
DateTime dt = new DateTime(2016,2,4,22,0,0);
dt.ToLocalTime().ToString("yyyy/MM/dd HH:mm:ss");   //顯示為2016/2/5 06:00:00

這是因為DateTime內只儲存Ticks(從0001/1/1起的時間單位)跟Kind,此時Kind為Unspecified,呼叫ToLocalTime()將dt視為UTC時間,依據本地電腦時區+8,因此出現該情形。若改為:
DateTime dt = DateTime.Now;   //Kind為Local,代表本地時間,ToLocalTime()就ok。

● DateTime.CompareTo(),不會考慮時區,單純比較Ticks。


DateTimeOffset:特定時間需指定時區offset,如:
DateTimeOffset dt = new DateTimeOffset(2016,2,4, 22, 0, 0, new TimeSpan(8,0,0));

若有跨時區轉換,用DateTimeOffset是最保險的做法。


參考資料:
http://blogs.msdn.com/b/davidrickard/archive/2012/04/07/system-datetime-good-practices-and-common-pitfalls.aspx




沒有留言:

張貼留言