先上一下自己弄出來的庫,.NETCore 2.2環境,以前的老庫不在適用了TimeZoneInfo物件要熟悉
/// <summary> /// 獲取當前時間戳 /// </summary> /// <returns></returns> public static long CurrentTimestamp() { return ToUnixTimestamp(DateTime.UtcNow); } /// <summary> /// 轉換成unix時間戳 /// </summary> /// <param name="value"></param> /// <returns></returns> public static long ToUnixTimestamp(DateTime value) { TimeSpan span = (value - new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc)); return (long)span.TotalMilliseconds; } /// <summary> /// unit時間轉換成伺服器本地時間 /// </summary> /// <param name="unixTimeStamp"></param> /// <returns></returns> public static DateTime ToLocalTime(long unixTimeStamp) { var gmt = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); DateTime dt = TimeZoneInfo.ConvertTime(gmt.AddMilliseconds(unixTimeStamp), TimeZoneInfo.Local); return dt; }
1、 時間戳走毫秒級,足夠用了
2、SQLServer資料庫存datetime2(7),更加精確一點,以前都是datetime
3、賦值的時候用 obj.GMTCreate = DateTime.UtcNow;不再是DateTime.Now
下面說一下取值,由於很多情況下我們會用Json去序列化物件,所有如果我們的物件包含Utc的DateTime我們改怎麼去轉換?這個問題困擾了一下,JsonSerializerSettings物件翻完沒找到合適的引數設定,後來查stackoverflow(度娘搜不出了,上bing),參考
public class JSONCustomDateConverter : DateTimeConverterBase { private TimeZoneInfo _timeZoneInfo; private string _dateFormat; public JSONCustomDateConverter(string dateFormat, TimeZoneInfo timeZoneInfo) { _dateFormat = dateFormat; _timeZoneInfo = timeZoneInfo; } public override bool CanConvert(Type objectType) { return objectType == typeof(DateTime); } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { throw new NotImplementedException(); } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { writer.WriteValue(TimeZoneInfo.ConvertTimeFromUtc(Convert.ToDateTime(value), _timeZoneInfo).ToString(_dateFormat)); writer.Flush(); } }
推薦直接寫一個轉換器,想用什麼格式就用什麼格式,想做什麼處理就做什麼處理,想要什麼時區就用什麼時區,這裡我是把資料庫取出來後轉成伺服器所在的時區然後轉換成 yyyy-MM-dd HH:mm:ss格式輸出
return JsonCustom(objTable, new JsonSerializerSettings() { Converters = new List<JsonConverter>() { new JSONCustomDateConverter("yyyy-MM-dd HH:mm:ss", TimeZoneInfo.Local) } });