1. 程式人生 > >win10 uwp unix timestamp 時間戳 轉 DateTime

win10 uwp unix timestamp 時間戳 轉 DateTime

string 是否 eva als 知識共享 ice typeof system 所有

原文:win10 uwp unix timestamp 時間戳 轉 DateTime

有時候需要把網絡的 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?

用代碼來說,過程就是:

  1. json 轉換得到對象

  2. 對象進行轉換,但是這時發現需要重新寫一個類,這個類和原來的類只有類型不一樣,其他都一樣。看起來代碼不優雅。

  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://stackoverflow.com/q/44643498/6116637

下面來講下如何解決。下面需要用到了 JsonConverter 的高級用法。首先需要使用 Nuget 下載 json 的庫,當然搜 json 下載第一個就好。

然後創建一個類,用於類型轉換,類型轉換的意思就是從輸入一個類型轉換為輸出的一個類型

關於更多 json 高級使用,參見:http://www.cnblogs.com/yanweidie/p/4605212.html

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

測試是寫一個類,把他進行轉換json,然後使用json轉類,看得到結果是否一樣。

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

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

轉換 得到json 為 {"created_utc":1498037127}

因為我使用的是 DateTime.Now ,所以如果大家使用這個類,得到的結果可能和我得到的不一樣。

可以看到從json轉換結果和創建的類的屬性一樣,所以這個方法可以拿來使用。

https://stackoverflow.com/questions/44643498/convert-unix-timestamp-to-normal-date-uwp/44650513#44650513

技術分享圖片
本作品采用知識共享署名-非商業性使用-相同方式共享 4.0 國際許可協議進行許可。歡迎轉載、使用、重新發布,但務必保留文章署名林德熙(包含鏈接:http://blog.csdn.net/lindexi_gd ),不得用於商業目的,基於本文修改後的作品務必以相同的許可發布。如有任何疑問,請與我聯系。

win10 uwp unix timestamp 時間戳 轉 DateTime