C# 的 DateTime 是很常用的結構,但在下對它並不十分了解。
頂多存取到它的年、月、日、時、分、秒來使用,因此想多了解一下關於 DateTime 結構的使用方法。
於 DateTime 的其中一個建構函式:
public DateTime( int year, int month, int day, int hour, int minute, int second, DateTimeKind kind )除了常用的 年、月、日、時、分、秒外,可以另外指定 DateTimneKind 參數。
若未指定 kind 的話,預設值為 System.DateTimeKind.Unspecified.
MSDN 關於 DateTime.Kind 屬性,有一些相關的說明與範例
主函式如下:
static void Main(string[] args)
{
// 取得目前的本地端時間
DateTime localNow = DateTime.Now;
// 取得目前的國際標準時間
DateTime utcNow = DateTime.UtcNow;
Display("UtcNow:", utcNow);
Display("LocalNow:", localNow);
// 將本地端時間的 Kind 轉為 utc,轉換後兩者的小時一樣
DateTime myDt = DateTime.SpecifyKind(localNow, DateTimeKind.Utc);
ConvertAndDisplay("Utc:", myDt);
// 將本地端時間的 Kind 轉為 local, 轉換後兩者的小時一樣
myDt = DateTime.SpecifyKind(localNow, DateTimeKind.Local);
ConvertAndDisplay("Local:", myDt);
// 將本地端時間的 Kind 轉為 unspecified, 轉換後兩者的小時一樣
myDt = DateTime.SpecifyKind(localNow, DateTimeKind.Unspecified);
ConvertAndDisplay("Unspecified:", myDt);
Console.ReadKey();
}
Display 函式的功能是顯示時間
public static void Display(string title, DateTime inputDt)
{
Console.WriteLine("{0}{1}, kind={2}", title, inputDt.ToString(DatePatt), inputDt.Kind);
}
ConvertAndDisplay函式負責將輸入的時間轉換為本地時間與世界標準時間,然後依序列印出來,
這裡比較要注意的是若
- inputDt.Kind 為 DateTimeKind.Utc 的話,執行 ToLocalTime 會轉換為對應的本地端時間;
- inputDt.Kind 為 DateTimeKind.Local 的話,執行 ToLocalTime 並不會轉換;
- inputDt.Kind 為 DateTimeKind.Unspecified 的話,執行 ToLocalTime 的過程中,inputDt 會被視為世界標準時間來轉換;
- inputDt.Kind 為 DateTimeKind.Utc 的話,執行 ToUniversalTime 會轉換為對應的世界標準時間;
- inputDt.Kind 為 DateTimeKind.Local 的話,執行 ToUniversalTime 並不會轉換;
- inputDt.Kind 為 DateTimeKind.Unspecified 的話,執行 ToUniversalTime 的過程中,inputDt 會被視為本地端時間來轉換
public static void ConvertAndDisplay(string title, DateTime inputDt)
{
Display(title, inputDt);
DateTime localTime = inputDt.ToLocalTime();
Display(" ToLocalTime:", localTime);
DateTime utcTime = inputDt.ToUniversalTime();
Display(" ToUtcTime:", utcTime);
}
執行結果如下:

結論: 只指定年、月、日、時、分、秒的 DateTime 建構函式,其 Kind 屬性預設為 Unspecified。若呼叫 ToLocalTime 時,本身會被視為 Utc Time; 相對的,若呼叫 ToUtcTime 時,本身會被視為 Local Time.

沒有留言:
張貼留言