書接上回,我們繼續來分享一些關於時間轉換的常用擴充套件方法。
01、時間轉日期時間 TimeOnly
該方式是把TimeOnly型別轉為DateTime型別,其中日期部分使用系統當前日期,時間部分則使用TimeOnly,具體程式碼如下:
//時間轉日期時間,預設使用當前日期+時間轉為日期時間格式
public static DateTime ToDateTime(this TimeOnly timeOnly)
{
return DateOnly.FromDateTime(DateTime.Now).ToDateTime(timeOnly);
}
02、日期+時間轉為日期時間 TimeOnly
該方法是直接對TimeOnly時間進行擴充套件,取用其時間,然後補全指定DateOnly日期,最後轉為DateTime,程式碼如下:
//日期+時間轉為日期時間
public static DateTime ToDateTime(this TimeOnly timeOnly, DateOnly dateOnly)
{
return dateOnly.ToDateTime(timeOnly);
}
03、日期時間中日期部分+時間轉日期時間 TimeOnly
該方法是對TimeOnly時間進行擴充套件,取其時間,然後補全指定DateTime中的日期部分,最後再轉為DateTime,程式碼如下:
//日期時間中日期部分+時間轉日期時間格式
public static DateTime ToDateTime(this TimeOnly timeOnly, DateTime dateTime)
{
return DateOnly.FromDateTime(dateTime).ToDateTime(timeOnly);
}
04、日期轉日期時間 DateOnly
該方式是把DateOnly型別轉為DateTime型別,其中日期部分使用DateOnly,時間部分則使用系統當前時間,具體程式碼如下:
//日期轉日期時間,日期+預設使用當前時間轉為日期時間格式
public static DateTime ToDateTime(this DateOnly dateOnly)
{
return dateOnly.ToDateTime(TimeOnly.FromDateTime(DateTime.Now));
}
05、日期+日期時間中時間部分轉日期時間 DateOnly
該方法是對DateOnly日期進行擴充套件,取其日期,然後補全指定DateTime中的時間部分,最後再轉為DateTime,程式碼如下:
//日期+日期時間中時間部分轉日期時間
public static DateTime ToDateTime(this DateOnly dateOnly, DateTime dateTime)
{
return dateOnly.ToDateTime(TimeOnly.FromDateTime(dateTime));
}
06、日期時間中日期部分+時間轉日期時間 DateTime
該方法是對DateTime日期時間進行擴充套件,取其日期部分,然後補全指定TimeOnly時間,最後再轉為DateTime,程式碼如下:
//日期時間中日期部分+時間轉日期時間
public static DateTime ToDateTime(this DateTime dateTime, TimeOnly timeOnly)
{
return DateOnly.FromDateTime(dateTime).ToDateTime(timeOnly);
}
07、日期+日期時間中時間部分轉為日期時間 DateTime
該方法是對DateTime日期時間進行擴充套件,取其時間部分,然後補全指定DateOnly日期,最後再轉為DateTime,程式碼如下:
//日期+日期時間中時間部分轉為日期時間
public static DateTime ToDateTime(this DateTime dateTime, DateOnly dateOnly)
{
return dateOnly.ToDateTime(TimeOnly.FromDateTime(dateTime));
}
08、日期時間轉日期 DateTime
該方法是對DateTime日期時間進行擴充套件,取其日期部分轉為DateOnly,程式碼如下:
//日期時間轉日期,保留日期時間中日期部分
public static DateOnly ToDateOnly(this DateTime dateTime)
{
return DateOnly.FromDateTime(dateTime);
}
09、日期時間轉時間 DateTime
該方法是對DateTime日期時間進行擴充套件,取其時間部分轉為TimeOnly,程式碼如下:
//日期時間轉時間,保留日期時間中時間部分
public static TimeOnly ToTimeOnly(this DateTime dateTime)
{
return TimeOnly.FromDateTime(dateTime);
}
上面的這些擴充套件方法雖然大多都是簡單呼叫原生方法,但是透過擴充套件方法方式提供出來後的確在編碼上提升了一些效率,程式碼也會根據簡潔。
10、程式碼結構設計與組織
程式碼結構的設計和組織是軟體開發過程中重要的一環,它將直接影響程式碼的可讀性、可維護性、擴充套件性、測試性和團隊協作的效率。
到目前為止我們關於時間的擴充套件方法已經有接近30個方法了,後面還有很多,目前都是放在DateTimeExtension類下面,如下圖:
到這裡已經能感受到程式碼結構顯得很混亂了,直觀感覺就是可讀性差,沒有結構化必然會導致擴充套件困難。
可能會有人提出不同觀點,這些不就是很多靜態方法嗎,只有排版整齊就行了,其實不然,我們可以藉助一些小技巧把方法集合結構化的管理起來。
結構化的管理一種實現方式就行——分類。下面我們就對現有程式碼進行分類。
分類是一門技術活,如何選擇分類標準很關鍵,比如我們這裡可以根據入參型別分為針對long型別轉換、針對DateTime型別轉換、針對string型別轉換;也可以根據功能分類比如時間和時間戳互相轉換是一類,時間和字串互相轉換是一類,DateTime與DateOnly和TimeOnly互相轉換是一類等等分類方式。
1、分大類
我的思路是這樣的,首先透過部分類partial把DateTimeExtension根據入參型別分成幾個大類。
程式碼整理後效果如下:
2、分小類
分完大類後發現long型別中方法還是很大,因此我們繼續對其進行分類,我們根據功能不同分為兩類:轉為本地日期時間和轉為UTC日期時間。我們可以使用程式碼摺疊的預處理指令#region和#endregion來處理處理小分類。
程式碼整理以後效果如下:
從一開始一堆方法到現在結構層次已經非常清晰了,閱讀起來也非常方便,後期維護擴充套件就可以很容易的快速找到相應地方處理。
11、單元測試
作為一個開原始碼,我們首要任務應該保證程式碼正確性,因此單元測試是必不可少的。單元測試不但可以保證我們程式碼的正確性,還可以促使我們程式碼寫的跟健壯。
單元測試我們以同樣的分類方式進行程式碼組織,程式碼大致如下:
因為具體的測試用例都比較簡單,這裡就不拿出來講解了。
測試用例編寫的越完善,我們程式碼就越可靠,因此我們在編寫單元測試時候,要儘可能覆蓋所有邏輯,要儘可能覆蓋到一些特例情況,我們想的越多程式碼質量才能越高。
12、文件
作為一個開原始碼,還需要一個好的文件,這樣別人才能輕鬆使用,目前文件還是缺失的,後續我將陸續新增上。
當程式碼結構設計與組織、單元測試、文件這三部分都做好了,我感覺這個開原始碼就達到開源給別人的最低要求了。後面的開原始碼我都將圍繞這三部分展開,希望可以給大家分享一些高質量的開原始碼。
稍晚些時候我會把庫上傳至Nuget上,大家可以搜尋Ideal.Core.Common直接使用。
注:測試方法程式碼以及示例原始碼都已經上傳至程式碼庫,有興趣的可以看看。https://gitee.com/hugogoos/Ideal