• 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对象翻完没找到合适的参数设置,后来查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) }
                });
  • 相关阅读:
    《集体智慧编程》第7章代码 Python3执行出错
    pymysql.err.IntegrityError: (1062, "Duplicate entry 'roxml-ROXML' for key 'PRIMARY'")
    Linux下MariaDB 安装及root密码设置(修改)
    Excel VBA入门(九)操作工作薄
    Excel VBA入门(八)单元格边框
    Excel VBA入门(七)注释、宏按钮及错误处理
    Excel VBA入门(六)过程和函数
    Excel VBA入门(五)Excel对象操作
    Excel VBA入门(四)流程控制2-循环控制
    Excel VBA入门(三) 流程控制1-条件选择
  • 原文地址:https://www.cnblogs.com/RainbowInTheSky/p/12887463.html
Copyright © 2020-2023  润新知