最近開始試著學 ASP.Net Core ,用 .Net 5 寫WebAPI。用前端的 DatePicker 選日期會變成前一天,再追下去,居然是DateTime都會少8小時,這到底是怎麼一回事呢?可能是我之前都沒有用MVC的Model去解析JSON物件,所以沒有發生。 用股溝搜尋在暗黑大的文章有提到這問題,但我不太相信微軟會犯這種低級錯誤,所以再繼續追下去真正原因。
先假設 Model 裡有一個 public DateTime StartDate {get; set;}
WebAPI接收到前端吐回的JSON Date 字串後,會解析成
StartDate.Kind 會是 DateTimeKind.Utc;
這沒錯,若是
DateTime now = DateTime.Now;
now.Kind 是 DateTimeKind.Local
所以存到SQL Server時,變成UTC時區,而SQL Server讀取的時候,會依照儲存的時區把資料吐出來,再自己把DateTime.ToString("yyyy/MM/dd")時,就會變成前一天了@@。
目前我的解法是在儲存到SQL Server前, StartDate = StartDate.ToLocalTime();
若是在讀取時轉換應該也行啦,但我的情況和暗黑大一樣,使用者都在這小島內,不會跨時區,用最簡單的方式處理就好。就算有人跨時區使用, DateTime.ToLocalTime() 也不會有錯誤。
結案收工。
留言