win10 uwp unix timestamp 时间戳 转 DateTime

时间:2022-03-19 05:59:40

有时候需要把网络的 unix timestamp 转为 C# 的 DateTime ,在 UWP 可以如何转换?

转换函数可以使用下面的代码

private static DateTime UnixTimeStampToDateTime(long unixTimeStamp) { System.DateTime dtDateTime = new System.DateTime(1970, 1, 1, 0, 0, 0, 0); dtDateTime = dtDateTime.AddSeconds(unixTimeStamp); return dtDateTime; }

如何从 DateTime 转 unix timestamp ,请用下面代码

public static long ToUnixTimestamp(DateTime time) { var date = new DateTime(1970, 1, 1, 0, 0, 0, time.Kind); var unixTimestamp = System.Convert.ToInt64((time - date).TotalSeconds); return unixTimestamp; }

如果就是这么简单代码,我就不会写博客专门来说。

我遇到一个问题,我拿到的是 json ,里面的时间是 unix timestamp ,我需要把 long 的时间转换 DateTime ,但是我不喜欢在使用的时候再颠末转换,能够在写的时候,把所有的 unix timestamp 自动转换为 DateTime?

用代码来说,过程就是:

json 转换得到东西

东西进行转换,但是这时发明需要从头写一个类,这个类和本来的类只有类型不一样,其他都一样。看起来代码不优雅。

var json=new Json(" {"created_utc":1498037127}");//下面的类都是我为了说明写的,实际无法在 vs 跑过 Foo foo=json.Convert();//json 转换得到东西 //但是这时 foo 的类型是 class Foo { long created_utc; } //而实际需要的是 class Foo1 { DateTime created_utc; } //那么就需要写一个对象把 Foo 转换 Foo1,看起来不优雅 //那么直接读 Json 进行改削可以不 ,答案是不成以的,因为我如果有一个类是 class Foo { long created_utc; List<Foo> list;//他是一个我也不知道可能存在几多的数组 } //如果是这个,需要读json,那么需要很永劫间才可以写出来 //写完之后,发明有另一个类似的对象,他也需要这样,那么措施员就需要不竭做这个,没有技术含量的对象

看完了上面的问题,是不是想到,json有一个优雅要领可以做到,,是的,他可以本身写转换器。

我找到一个简单要领,可以从 Json 转换过程,直接把 DateTime 和 unix timestamp 彼此转换,要领很简单。

问题在:https://*.com/q/44643498/6116637

下面来讲下如何解决。下面需要用到了 JsonConverter 的高级用法。首先需要使用 Nuget 下载 json 的库,固然搜 json 下载第一个就好。

然后创建一个类,用于类型转换,类型转换的意思就是从输入一个类型转换为输出的一个类型

关于更多 json 高级使用,参见:

class UnixConvert : JsonConverter

可以看到,创建的类型必需从头三个函数

WriteJson ReadJson CanConvert

很容易知道,WriteJson 就是从一个存在的类转换为 json ,遇到类型需要做什么转换。 ReadJson 从一个json转换为类的时候,遇到json需要如何转换。 CanConvert当前的输入是否撑持转换。

固然这几个函数是对付属性的,所以读取一个值就好了。

一开始需要把 unix timestamp 转换为 DateTime ,所以就是从 json 的字符串转属性。

写的代码就是 ReadJson ,于是开始写这个函数

public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { long unixTimeStamp = long.Parse(reader.Value.ToString()); return UnixTimeStampToDateTime(unixTimeStamp); }

这样就是转换的代码,看起来很简单。

读取 一个值,把他转 long ,然后使用上面的函数转换 DateTime ,为什么这里使用的是 long.Parse ,因为保证输入的json是对的,如果json不同错误,那么直接报告错误才是好的做法。

和读函数反过来,需要把 属性转json的字符串,可以从参数看到,需要转换的值是 value ,这里使用强转,因为知道了他的类型。writer 可以直接写入 很多类型

public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { var time = ToUnixTimestamp((DateTime) value); writer.WriteValue(time); }

看起来概略就写好了,但是最后一个函数只需要返回 true 就好,暂时不需要做什么。

开始写一个例子进行测试。

测试之前,我先把上面的转换类所有代码写出来

class UnixConvert : JsonConverter { public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { var time = ToUnixTimestamp((DateTime) value); writer.WriteValue(time); } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { long unixTimeStamp = long.Parse(reader.Value.ToString()); return UnixTimeStampToDateTime(unixTimeStamp); } public override bool CanConvert(Type objectType) { return true; } private static DateTime UnixTimeStampToDateTime(long unixTimeStamp) { System.DateTime dtDateTime = new System.DateTime(1970, 1, 1, 0, 0, 0, 0); dtDateTime = dtDateTime.AddSeconds(unixTimeStamp); return dtDateTime; } public static long ToUnixTimestamp(DateTime time) { var date = new DateTime(1970, 1, 1, 0, 0, 0, time.Kind); var unixTimestamp = System.Convert.ToInt64((time - date).TotalSeconds); return unixTimestamp; } }