C#操作时区转换时遇到的一些问题和解决方法分享

先上一下自己弄出来的库,.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对象翻完没找到合适的参数设置,后来查*(度娘搜不出了,上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) }
            });

 

C#操作时区转换时遇到的一些问题和解决方法分享

上一篇:sql语句中单引号嵌套问题


下一篇:SQL Server MERGE