C# 基礎知識系列- 13 常見類庫介紹(二)日期時間類

来源:https://www.cnblogs.com/c7jie/archive/2020/04/26/12776644.html
-Advertisement-
Play Games

0. 前言 上一篇內容介紹了Console類和Math類,這篇內容著重介紹一下C 中時間日期的處理方式。 上一篇勘誤: 上一篇中關於靜態類沒有構造函數,這一表述有誤。正確的說法是C 中靜態類不包含常規構造函數,但可以添加一個靜態構造函數。 靜態構造函數與普通普通構造函數的區別是,靜態構造函數沒有訪問 ...


0. 前言

上一篇內容介紹了Console類和Math類,這篇內容著重介紹一下C#中時間日期的處理方式。

上一篇勘誤: 上一篇中關於靜態類沒有構造函數,這一表述有誤。正確的說法是C#中靜態類不包含常規構造函數,但可以添加一個靜態構造函數。
靜態構造函數與普通普通構造函數的區別是,靜態構造函數沒有訪問修飾符,即訪問修飾符是預設的,且靜態構造函數只能是無參的,並添加 static 修飾符;靜態構造函數不能手動調用,會在類載入的時候由系統自己載入。

1 DateTime 和 TimeSpan

DateTime表示時間點,TimeSpan表示 時間段。在C#中,這兩個都是結構體,結構體與類都能繼承並實現介面,但是與類不同的是結構體在記憶體中存放在棧里。這部分在微軟官方文檔中關於CLR有過介紹。後續也會針對CLR寫一個系列。這裡就不做過多的介紹了。

DateTime延伸開來也有很多內容要講,這裡只做一個大體的介紹:

1. 創建一個DateTime

DateTime time = new DateTime(2018,1,20);// 2018年1月20日 0時0分0秒
DateTime time = new DateTime(2019,11,30, 12, 01, 59);// 2019年11月30日,12:01:59
DateTime time = DateTime.Now;// 表示代碼運行到這裡的系統時間,一般意義上的當前時間
DateTime time = new DateTime(long ticks);// 以時間刻度計算日期,以西曆 0001 年 1 月 1 日 00:00:00.000 以來所經歷的以 100 納秒為間隔的間隔數來表示

這些是我們常用的創建日期的方法,還有一些通過日曆對象結合日曆來創建日期時間,不過這塊在不涉及到程式國際化之前不需要做過多的深入。

需要註意的是,DateTime.Now在每次運行結果都不一樣,這個屬性返回的是系統運行時當前時間,而不是程式編寫時的時間。與之對應的還有一個DaTime.Today,這個屬性返回結果是當天,也就是Now去掉時分秒的時間。

2. 日期變更

DateTime提供了很多可以變更日期的方法,這些方法可以獲取一個計算之後的時間值:

public DateTime AddDays (double value);// 計算天數,正數代表 天數增加,負數代表天數減少
public DateTime AddHours (double value);// 返回一個新的 DateTime,它將指定的小時數加到此實例的值上。
public DateTime AddMilliseconds (double value);//返回一個新的 DateTime,它將指定的毫秒數加到此實例的值上。
public DateTime AddMonths (int months);//返回一個新的 DateTime,它將指定的月數加到此實例的值上
public DateTime AddMonths (int months);// 返回一個新的 DateTime,它將指定的月數加到此實例的值上
public DateTime AddSeconds (double value);/// 返回一個新的 DateTime,它將指定的秒數加到此實例的值上。
public DateTime AddTicks (long value);// 返回一個新的 DateTime,它將指定的刻度數加到此實例的值上,也就是構造函數里的ticks
public DateTime AddYears (int value);//返回一個新的 DateTime,它將指定的年份數加到此實例的值上。

以上是DateTime類對日期計算的支持,其中參數如果是正的表示時間後移,如果是負的則表示時間向前移。

需要註意的一點就是,日期的變更不會在原有的DateTime元素上變更,會返回一個計算之後的日期類型。

3. 日期算術運算

說了這麼多DateTime,沒有介紹TimeSpan,那麼這裡就會介紹一下TimeSpan是什麼了。TimeSpan表示一個時間間隔,也就是兩個DateTime之間的差值。說到這裡,大家也應該明白日期的算術運算應該是指什麼了。以下來看一組示例:

class Program
{
    static void Main(string[] args)
    {
        DateTime lastYear = new DateTime(2019, 03, 08, 20,49, 36);
        DateTime now = DateTime.Now;
        TimeSpan span = now - lastYear;
        DateTime newTime = lastYear + span;
    }
}

這就是C#中關於日期運算的基本內容。那我們來看看 TimeSpan里封裝了哪些內容吧。

TimeSpan的屬性:

public int Days { get; }//獲取當前 TimeSpan 結構所表示的時間間隔的天數部分。
public int Hours { get; }// 獲取當前 TimeSpan 結構所表示的時間間隔的小時數部分。
public int Milliseconds { get; }//獲取當前 TimeSpan 結構所表示的時間間隔的毫秒數部分。
public int Minutes { get; }//獲取當前 TimeSpan 結構所表示的時間間隔的分鐘數部分。
public int Seconds { get; }//獲取當前 TimeSpan 結構所表示的時間間隔的秒數部分。

以上屬性表示一個TimeSpan的代表的時間間隔中的天數、小時、分鐘等。

public double TotalDays { get; }//獲取以整天數和天的小數部分表示的當前 TimeSpan 結構的值。
public double TotalHours { get; }//獲取以整小時數和小時的小數部分表示的當前 TimeSpan 結構的值。
public double TotalMinutes { get; }//獲取以整分鐘數和分鐘的小數部分表示的當前 TimeSpan 結構的值。
public double TotalSeconds { get; }//獲取以整秒數和秒的小數部分表示的當前 TimeSpan 結構的值。
public double TotalMilliseconds { get; }//獲取以整毫秒數和毫秒的小數部分表示的當前 TimeSpan 結構的值。

上述幾組屬性表示以XXX為單位,返回的TimeSpan的值,與之相對應的TimeSpan提供了一組FormXXX的方法,可以將double類型的值還原成TimeSpan。

因為TimeSpan表示時間間隔,所以TimeSpan也允許兩個TimeSpan進行加法運算,並提供了一個Add(TimeSpan ts)的方法。

這些是TimeSpan最常用的一些屬性和方法。不過在使用TimeSpan中需要註意的地方是,TimeSpan計算返回的值可正可負,正值表示時間間隔的頭在前尾在後,負值表示頭在後尾在前;TimeSpan中沒有提供TotalMonths這個方法,這是因為每個月具體有多少天不是固定值,如果想計算兩個日期直接相差幾個月,則需要自定義對應的計算方法了。

4. DateTime與字元串之間的恩怨情仇

在程式中,用戶或者三方輸入的日期大多都是字元串格式的,而且系統獲取到的時間也大多會轉成字元串給其他人展示,所以這裡就會涉及到DateTime與字元串之間的相互轉換。

我們先試試日期的各種ToString會產生什麼樣的結果:

class Program
{
    static void Main(string[] args)
    {
        DateTime now = DateTime.Now;
        Console.WriteLine("ToString :{0}", now.ToString());
        Console.WriteLine("ToLongDateString :{0}", now.ToLongDateString());
        Console.WriteLine("ToLongTimeString :{0}", now.ToLongTimeString());
        Console.WriteLine("ToShortDateString :{0}",now.ToShortDateString());
        Console.WriteLine("ToShortTimeString :{0}",now.ToShortTimeString());
    }
}

結果:

image-20200425111100330

這是DateTime的預設輸出結果,當然會根據系統的語言和地區等設置變化而產生不同的變化。為了避免這種變化,C#提供了一種日期類型的格式化模板,這裡介紹幾個常用的格式代表:

格式符 含義
yy 年份。00~99,如果年份大於99,則只保留後兩位。如2020年則顯示20,2019年則顯示19
yyyy 年份,顯示四位。0000~9999
M 月份,顯示1~12
MM 月份,顯示01~12
d 天,1~31(具體看月份允許的最大天數)
dd 與d一致,顯示為01~31
h 小時,12小時制顯示1~12
hh 與h一致,顯示為01~12
H 小時,24小時制,顯示0~23
HH 小時,24小時制,顯示00~23
m 分鐘,顯示0~59
mm 分鐘,顯示00~59
s 秒,顯示0~59
ss 秒,顯示00~59
f 表示日期和時間值的十分之幾秒,顯示0~9
ff 表示百分之幾秒,顯示00~99

最後的f,f的次數越多精度越細,但需要考慮系統的時鐘精度。

在實際開發中,最常用的格式是:yyyy-MM-dd HH:mm:ss,顯示效果就是:2020-04-25 12:00:00。其中連接符可以根據開發需求更換。

上述是時間轉字元串,反過來也有字元串轉時間。

使用DateTime.Parse或者Convert.ToDateTime就可以將字元串轉換為時間類型。C#並不需要在字元串轉日期的時候指定字元串的顯示格式,這是因為一個約定優於配置的設計理念。C#通過分析字元串,然後將字元串轉換成對應的時間類型。當然,在正確解析到時間的時候,C#會拋出異常。為此,C#提供了DateTime.TryParse方法,該方法不會拋出異常,會返回一個是否正確轉換的bool值。

它的聲明如下:

public static bool TryParse (string s, out DateTime result);// 使用了result作為實際轉換結果

雖然C# 不用提供轉換格式就可以讀取,但是如果時間字元串的格式比較少見呢,或者說就想指定一個格式字元串,怎麼辦?別急,C#還提供了一個方法:

public static DateTime ParseExact (string s, string format, IFormatProvider provider);

不過,這個方法需要指定一個區域性的格式信息:provider。這個信息可以通過CultureInfo.CurrentCulture來獲取,這個屬性表示系統的當前區域信息。

以上是DateTime的基本內容,有興趣的小伙伴可以查閱一下微軟的官方文檔繼續深入研究一下。

更多內容煩請關註我的博客

file


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

-Advertisement-
Play Games
更多相關文章
  • 說明 這裡基於 php7.2.5 進行測試,php7 之後內部結構變化應該不是太大,但與 php5.X 有差別。 函數分類 用戶自定義函數 say(); function say() { echo "周傑倫"; } php hello.php 周傑倫 cli 模式下我們執行這個代碼之後就會輸出函數調 ...
  • 詞法分析器 一、 目標和要求 首先本次實驗分為三個小題分別為:C語言詞法分析器、四則運算文法、解釋器。因此以下一 ~ 九部分是C語言詞法分析器的實驗內容,十 ~ 十三部分是四則運算及其解釋器的實驗內容。 1.第一小題: 明確目標: 按照已經掌握的C語言的詞法規範,編寫能夠按照C語言規範識別每個詞法符 ...
  • 1. 打開 Container Station 2. 點擊左側 屬性 ,切換到 Registry伺服器 ,點擊 新增 ,如下圖 " " 3. 填寫鏡像信息,網址:https://p31wiatp.mirror.aliyuncs.com ,填寫完後,記得點擊一下 測試 ,驗證一下網路是否暢通,一般是可 ...
  • 大家在應聘的時候,特別需要註意的是公司的任職要求,也就是招聘標準,有時候不是你不行,而是你與公司需求不匹配。下麵的言論來自學姐昨天的朋友圈: ​ “知己知彼,方能百戰百勝”。而基本上所有互聯網公司的技術,都是BAT等領軍企業技術的跟隨者。 所以,瞭解BAT等一線互聯網的任職要求,顯得十分的重要,下麵 ...
  • 因為使用重定向的跳轉方式的情況下,跳轉到的地址無法獲取 request 中的值。 很好的解決了這個問題。 1. redirectAttributes.addAttributie("param", value); 這種方法相當於在重定向鏈接地址追加傳遞的參數。以上重定向的方法等同於 ,註意這種方法直接 ...
  • 在 SpringMVC 中,可以指定畫面的跳轉方式。使用 首碼實現請求轉發跳轉,使用 首碼實現重定向跳轉。有首碼的轉發和重定向操作和配置的視圖解析器沒有關係,視圖解析器不會進行拼串。 請求轉發首碼—forward: 使用請求轉發跳轉方式,url 地址不會改變,一次請求一次相應,跳轉到的地址可以獲得 ...
  • 面試題51. 數組中的逆序對 題目來源: "https://leetcode cn.com/problems/shu zu zhong de ni xu dui lcof/" 題目 在數組中的兩個數字,如果前面一個數字大於後面的數字,則這兩個數字組成一個逆序對。輸入一個數組,求出這個數組中的逆序對的 ...
  • 首先我們來看解封裝: >>> mytuple=3,4,5 >>> mytuple (3, 4, 5) 這將 3,4,5 封裝到元組 mytuple 中。 現在我們將這些值解封裝到變數 x,y,z 中: >>> x,y,z=mytuple >>> x+y+z 得到結果12.結語 本文首發於python ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...