win10 uwp unix timestamp 時間戳 轉 DateTime

来源:https://www.cnblogs.com/lindexi/archive/2018/01/23/win10-uwp-unix-timestamp.html
-Advertisement-
Play Games

有時候需要把網路的 unix timestamp 轉為 C# 的 DateTime ,在 UWP 可以如何轉換? ...


有時候需要把網路的 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 ),不得用於商業目的,基於本文修改後的作品務必以相同的許可發佈。如有任何疑問,請與我聯繫


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 構造函數特點: 函數名與類名相同、不用定義返回值類型、沒有return語句、構造函數可以有多個並以重載的方式存在 構造函數的作用: 給new出來的對象進行初始化 如果定義的一個類中沒有自定義的構造函數,系統會有預設的產生一個無參的構造函數, 如果有自定義的構造函數, 系統預設構造函數就不存在了,構造 ...
  • 1:條件分支 if 條件 : 語句 else: 語句 2.縮寫 else: if : 可以簡寫為 elif ,因此Python 可以有效的避免“懸掛else” 舉例: 3:條件表達式(三元操作符) small = x if x<y else y 例子將下列代碼修改為三元操作符 修改後 4:斷言(as ...
  • 鏈表 1.鏈表的定義:線性表的鏈式存儲結構的特點是用一組任意的存儲單元存儲線性表的數據元素(這組存儲單元可以是 連續的,也可以是不連續的)。因此,為了表示每個數據元素ai與其直接後繼數據元素ai+1之間的邏輯關係,對數據元素 ai來說,除了存儲其本身的信息之外,還需存儲一個指示其直接後繼的信息(即直 ...
  • 1.純模板語言實現 2.自定義simpletag實現(本質是簡化了純模板語言的判斷) 原理都是通過django路由系統,匹配url篩選條件,將篩選條件作為資料庫查詢結果,返回給前端。 例如:路由系統中的url格式是這樣: 其中article_type_id和category_id和資料庫中欄位是相對 ...
  • (一)定義結構體類型 1.用戶自己建立的由不同類型數據組成的組合型的數據結構稱為結構體如:struct Date{int month; int day; int year; };struct Student{int num; char name[20]; char sex; int age; str ...
  • String 是final修飾的類,不能被改變,改變就是新創建對象 String str = new String(); for(inti=0;i<100;i++) { str = str + i; } 要創建100個對象 引用指向新的變數 ,非常消耗記憶體和執行時間 ...
  • 上面程式的執行結果是什麼 Object類中的getClass方法是final的,所以無論誰調用得到的都一樣,都是當前類的名字 得到父類名字用getClass.getSuperclass() ...
  • 做題的時候遇到這麼一個題: 這個題就涉及位域的問題,現總結如下: 一、位域 有些信息在存儲時,並不需要占用一個完整的位元組, 而只需占幾個或一個二進位位。例如在存放一個開關量時,只有0和1 兩種狀態, 用一位二進位即可。為了節省存儲空間,並使處理簡便,C語言又提供了一種數據結構,稱為“位域”或“位段” ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...