C#操作時區轉換時遇到的一些問題和解決方法分享

FourOne發表於2020-05-14

先上一下自己弄出來的庫,.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) }
            });

 

相關文章