只有累積,沒有奇蹟

2019年8月9日 星期五

[OpenSource] Moda-Time 時間套件

前言
過去開發時常常都會需要處理關於時間顯示問題,C# 日期輸出格式可以透過 DateTime.ToString() 方式來自訂顯示輸出內容舉例來說取得時間後對於輸出內容格式化、指定日期是一周中的星期幾等資訊,都會在 ToString() 時候加上 format 來定義,這些格式化的內容讓代碼在閱讀上會有些小混亂,且不容易記住需要查文件才知道,因此我利用一點時間整理過去在 C# 處理時間時常用到的方法,於是乎  Moda-Time  Library 就誕生了,希望可以讓開發者在處理時間上更方便,此篇就簡單介紹此套件所提供的 API 使用及簡單範例,若有問題或是錯誤的地方歡迎各位前輩一起討論指導

使用方式
Moda-Time 所提供的 API 是使用 C# 3.0 開始有的擴充方法 (Extension Method) 為基礎,並參考 Java 著名的時間套件 joda-Time 提供的 API,在原有的 C# DateTime 中加入新的方法簽章,以下根據此套件的方簽章做簡單的介紹與範例

日期時間信息
取得有關指定日期的顯示資訊,代碼如下
  1. var now = DateTime.Now;
  2.  
  3. Console.WriteLine($"現在時間是:{now.ToString()}...");
  4. Console.WriteLine($" - DayNameOfWeek: {now.DayNameOfWeek()}");
  5. Console.WriteLine($" - ShortDayNameOfWeek: {now.ShortDayNameOfWeek()}");
  6. Console.WriteLine($" - ShortDayNameOfWeek (指定 Culture): {now.ShortDayNameOfWeek(new CultureInfo("en-us"))}");
  7. Console.WriteLine($" - MonthNameOfYear: {now.MonthNameOfYear()}");
  8. Console.WriteLine($" - MonthNameOfYear (指定 Culture): {now.MonthNameOfYear(new CultureInfo("en-us"))}");
  9. Console.WriteLine($" - ShortMonthNameOfYear: {now.ShortMonthNameOfYear()}");
  10. Console.WriteLine($" - ShortMonthNameOfYear (指定 Culture): {now.ShortMonthNameOfYear(new CultureInfo("en-us"))}");
  11. Console.WriteLine($" - GetWeekOfYear: {now.GetWeekOfYear()}");
  12. Console.WriteLine($" - GetWeekOfMonth: {now.GetWeekOfMonth()}");
  13. Console.WriteLine($" - GetEndDayOfMonth: {now.GetEndDayOfMonth()}");
  14.  
  15. 輸出如下:
  16. 現在時間是:2019/8/10 上午 06:53:42...
  17. - DayNameOfWeek: 星期六
  18. - ShortDayNameOfWeek:
  19. - ShortDayNameOfWeek (指定 Culture): Sat
  20. - MonthNameOfYear: 八月
  21. - MonthNameOfYear (指定 Culture): August
  22. - ShortMonthNameOfYear: 八月
  23. - ShortMonthNameOfYear (指定 Culture): Aug
  24. - GetWeekOfYear: 32
  25. - GetWeekOfMonth: 2
  26. - GetEndDayOfMonth: 31

日期比較
取得有關指定日期的顯示資訊,代碼如下
  1. var t1 = new DateTime(2019,1,2,3,4,5);
  2. var t2 = t1.AddMinutes(-1);
  3. var t3 = t1.AddMinutes(1);
  4. var t4 = new DateTime(2019, 1, 2, 3, 4, 5);
  5.  
  6. Console.WriteLine($" - t1 IsAfter t2: {t1.IsAfter(t2)}");
  7. Console.WriteLine($" - t1 IsBefore t3: {t1.IsBefore(t3)}");
  8. Console.WriteLine($" - t1 IsEqual t4: {t1.IsEqual(t4)}");
  9.  
  10. 輸出如下:
  11. - t1 IsAfter t2: True
  12. - t1 IsBefore t3: True
  13. - t1 IsEqual t4: True

日期比較 
日期比較 API 是我個人比較愛的部分,過去在計算兩個日期的差異時都需要先做日期相減取得 timespan,在取得透過 timespan 去看差異的天數、或是時分秒等需要的數字,過去往往代碼都要寫 3 行以上,但透過此 Library 僅需要一行,範例如下
  1. var t1 = new DateTime(2019, 1, 1, 1, 1, 1, 1);
  2. var t2 = new DateTime(2019, 1, 2, 3, 4, 5, 6);
  3.  
  4. Console.WriteLine($"t1 : {t1.ToString()}");
  5. Console.WriteLine($"t2 : {t2.ToString()}");
  6. Console.WriteLine($" - compare two date - timespan: {t1.Compare(t2)}");
  7. Console.WriteLine($" - compare two date - totalDay: {t1.GetCompareTotalDays(t2)}");
  8. Console.WriteLine($" - compare two date - TotalHours: {t1.GetCompareTotalHours(t2)}");
  9. Console.WriteLine($" - compare two date - TotalMinute: {t1.GetCompareTotalMinute(t2)}");
  10. Console.WriteLine($" - compare two date - TotalSecond: {t1.GetCompareTotalSecond(t2)}");
  11. Console.WriteLine($" - compare two date - TotalMilliseconds: {t1.GetCompareTotalMilliseconds(t2)}");
  12.  
  13. 輸出如下:
  14. t1 : 2019/1/1 上午 01:01:01
  15. t2 : 2019/1/2 上午 03:04:05
  16. - compare two date - Timespan: -1.02:03:04.0050000
  17. - compare two date - TotalDay: -1.0854630208333333
  18. - compare two date - TotalHours: -26.0511125
  19. - compare two date - TotalMinute: -1563.06675
  20. - compare two date - TotalSecond: -93784.00499999999
  21. - compare two date - TotalMilliseconds: -93784005
另外 API 中還有提供 plus 日期相關方法,但用法和 DateTime.Add 差異不大,這裡就不在特別另外說明與附上範例程式碼,需要可自行使用。


感想
最後附上 Github 連結,歡迎提供建議、或直接修改程式碼(修改完成後請發 pull request),覺得不錯也請給我顆星星鼓勵,希望這篇介紹可以有幫助到有需要的朋友,Happy Coding :)
Github : https://github.com/marcustung/Moda-Time

參考
DateTime.ToString

Related Posts:

  • [OpenTelemetry] 現代化監控使用 OpenTelemetry 實現 : 在 .NET 如何使用 OpenTelemetry 前言 最近在 suvery 監控相關議題時接觸到 OpenTelemetry 蒐集遙測數據的開源框架,覺得這議題挺有趣的因此整理變成系列文,這篇是研究 OpenTelemetry 的系列文第三篇, 這系列主要會分為四篇分別是 現代化監控使用 OpenTelemetry 實現 : 可觀測性(Observability) 現代化監控使用 OpenTelemetry 實現 : OpenTelemetry 開放遙測 現代化監控使用… Read More
  • [OpenTelemetry] 現代化監控使用 OpenTelemetry 實現 : OpenTelemetry 開放遙測 前言 最近在 suvery 監控相關議題時接觸到 OpenTelemetry 蒐集遙測數據的開源框架,覺得這議題挺有趣的因此整理變成系列文,這篇是研究 OpenTelemetry 的系列文第二篇, 這系列主要會分為四篇分別是 現代化監控使用 OpenTelemetry 實現 : 可觀測性(Observability) 現代化監控使用 OpenTelemetry 實現 : OpenTelemetry 開放遙測 現代化監控使用 … Read More
  • [NETCore] ASP.NET Core 使用強型別取代 IOption 注入配置前言 之前的 如何取得 appsettings.json 組態設定 文章中有介紹在 ASP.NET Core 中透過 IOptions 方法取得設定檔的方法,在需要用到的地方注入 IOptions 取得設定類別的資訊,相信使用上並不困難在 MSDN 官方推薦作法也是如此,但如果開發一陣子之後可以發現到處都是 IOptios 類別,這篇文章介紹如何使用擴充 IServiceCollection 的方法來降低對 IOptios 的… Read More
  • [NETCore] ASP.NET Core 中的例外處理方式前言 錯誤處理一直是開發中的重要環節之一,如果在程式發生異常錯誤的當下有效的將錯誤訊息完整的記錄下來,可以大大的節省 debug 的時間與效率,反過來如果在開發時沒有考慮到異常處理的機制,可能在發生問題時要找到錯誤的原因難度就會提高,因此在開發時必須要考慮到異常處理的機制,過去公司都會將 exception 訊息透過推(push)或是拉(pull)的方式傳送到 Logstash 再搭配 Elasticsearch 與 Kibana 搜尋到相對… Read More
  • [NETCore] ASP.NET Core 中加入 API 版本控制前言 在開發 API 時可能會因為代碼調整或是架構的演進,相同的 API 接口可能會有新的版本出現,為了不影響舊的呼叫端程式邏輯運作,就需要在代碼中加上新舊版本的對應來解決 API 版本問題,或許為了解決 API 版本問題可以有很多種不同的解法,在 ASP.NET Core 中可以透過  Microsoft.AspNetCore.Mvc.Versioning  來解決此問題,這篇就來分享一下有關M… Read More

0 意見:

張貼留言

Copyright © 2025 m@rcus 學習筆記 | Powered by Blogger

Design by Anders Noren | Blogger Theme by NewBloggerThemes.com