将unix时间戳转换为正常日期(UWP)

时间:2017-06-20 03:47:26

标签: c# .net json unix uwp

我有UWP应用程序,我得到了我的json,写入列表和Binf to View

以下是View Model的代码:

 public class TopPostsViewModel : INotifyPropertyChanged
{
    private List<Child> postsList;

    public List<Child> PostsList
    {
        get { return postsList; }
        set { postsList = value; OnPropertyChanged(); }
    }

    public TopPostsViewModel()
    {
        Posts_download();
    }


    public async void Posts_download()
    {
        string url = "https://www.reddit.com/top/.json?count=50";

        var json = await FetchAsync(url);


        RootObject rootObjectData = JsonConvert.DeserializeObject<RootObject>(json);
        PostsList = new List<Child>(rootObjectData.data.children);

    }
    private async Task<string> FetchAsync(string url)
    {
        string jsonString;

        using (var httpClient = new System.Net.Http.HttpClient())
        {
            var stream = await httpClient.GetStreamAsync(url);
            StreamReader reader = new StreamReader(stream);
            jsonString = reader.ReadToEnd();
        }

        return jsonString;
    }

在json中我有 data.created_utc 字段。例如,它就像这个created_utc: 1446179731。我读到这是unix timestamp

这是我的课程:Classes

我需要将其转换为正常日期。我怎么做这个并写回List?

所以我的问题更多的是关于如何拍摄并将其写回来。

2 个答案:

答案 0 :(得分:3)

您必须在Data2类中添加另一个属性才能在DateTime中获取转换后的数据。

    [JsonIgnore]
    public DateTime created_utc
    {
        get
        {
            var unix = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
            return unix.AddSeconds(this.created_utcUnix);
        }
        set
        {
            var unix = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
            this.created_utcUnix = Convert.ToInt64((value - unix).TotalSeconds);
        }
    }

    [JsonProperty("created_utc")]
    public double created_utcUnix { get; set; }

现在,您始终可以在客户端代码中使用created_utcCustom

新密码:https://pastebin.com/A4GReYHj

答案 1 :(得分:2)

虽然@saurabh有一个好方法。但我认为你可能想转换它并且不要改变课程。

您可以使用JsonConverter进行转换。

public class Data2
{
   [JsonConverter(typeof(UnixConvert))]
   public DateTime created_utc{set;get;}
}

我有一个foo课。 foo类有一个名为created_utc的属性。

    class Foo
    {
        [JsonConverter(typeof(UnixConvert))]
        public DateTime created_utc { set; get; }
    }

UnixConvert是一个JsonConverter

    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;
        }
    }

我写了一个测试代码:

        Foo foo = new Foo()
        {
            created_utc = DateTime.Now
        };
        var str = JsonConvert.SerializeObject(foo);
        foo = JsonConvert.DeserializeObject<Foo>(str);

我可以看到它可以运行。

请参阅https://stackoverflow.com/a/28305303/6116637