最近寫了一個.net core項目,部署到CentOS並在docker上運行的時候,發現DateTime.Now獲取的時間與Windows不一致(定時執行的任務,晚了8個小時),在Windows中可以正確的獲得本地時間,而在Linxu CentOS 的Docker環境中獲取的時間少了8個小時。通過Linxu命令查看本機時間,本地時間正確,但.net core在Docker運行獲取時間依然是少8個小時。猜測可能是時區的問題,然后就找到了NodaTime的一個庫進行獲取統一時區的時間,這下在Linxu CentOS的Docker環境上獲取的時間就與Windows中保持了一致。
新增一個DateTime擴展方法:
public class TimeUtil { public static DateTime GetCstDateTime() { Instant now = SystemClock.Instance.GetCurrentInstant(); var shanghaiZone = DateTimeZoneProviders.Tzdb["Asia/Shanghai"]; return now.InZone(shanghaiZone).ToDateTimeUnspecified(); } } public static class DateTimeExtentions { public static DateTime ToCstTime(this DateTime time) { return TimeUtil.GetCstDateTime(); } }
在程序中獲取時間都通過如下方法,即可實現在Windows和Linux保持統一:
DateTime.Now.ToCstTime();
除了以上方式之外,可以將Linxu時間和Docker容器進行同步。具體詳情,請參考。docker容器與Linux主機環境獲取時間不一致
原文鏈接:https://www.skyfinder.cc/2018/10/01/dotnetcoredatetimenotunified/