zoukankan      html  css  js  c++  java
  • 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) }
                });
  • 相关阅读:
    linux signal之初学篇
    Eclipse 每次打开workspace目录记录位置?
    [Clojure] A Room-Escape game, playing with telnet and pure-text commands
    孔雀翎----《Programming C# 》中国版 文章4版
    js一些编写的函数
    KVM,QEMU核心分析
    apche commons项目简介
    java基础—网络编程———建立聊天的形式
    学习算法
    css+html+js实现多级下拉和弹出菜单
  • 原文地址:https://www.cnblogs.com/RainbowInTheSky/p/12887463.html
Copyright © 2011-2022 走看看