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