.NET BCL Series | DateTime


  1. 說明
    1. 建構子
    2. Kind
    3. FromFileTime
    4. Now vs Today vs UtcNow
    5. 民國年
    6. 日本曆
    7. DateTime Parse
    8. 妙用 DateTime

筆記 .NET Base Class Library 各式基礎函式庫的使用原理與技巧,讓開發 .NET 程式自然且流暢 🙂

logo

說明

建構子

new DateTime();
// 1/1/0001 12:00:00 AM

new DateTime(DateTime.Now.Ticks);
// 637919541000000000
// 6/27/2022 7:15:00 PM

new DateTime(2022, 6, 27, 19, 15, 00);
// 6/27/2022 7:15:00 PM

Kind

每一個 DateTime 物件都有 Kind 屬性,表示日期時間所使用為 UTC 或者是 Local Time。

如果要調整 DateTime 物件的 Kind,可以藉由 DateTime.SpecifyKind 的方式來重新賦值。

Console.WriteLine(DateTime.UtcNow.ToLocalTime());

var now = DateTime.Now;
for (int i = 0; i < 10; i++)
{
    now = DateTime.SpecifyKind(now, DateTimeKind.Utc).ToLocalTime();
    Console.WriteLine(now);
}

FromFileTime

藉由 LDAP 讀取 AD 中的屬性,部分屬性為 FileTime 必須藉由, DateTime.FromFileTime 來讀取。

需要增加 Reference

  • System.DirectoryServices.dll
  • System.DirectoryServices.Protocols.dll
  • System.DirectoryServices.AccountManagement.dll
using System.DirectoryServices;

DirectoryEntry entry = new DirectoryEntry("LDAP://192.168.112.1");
DirectorySearcher Dsearch = new DirectorySearcher(entry);

Dsearch.Filter = "(&(objectClass=user)(objectClass=person)(sAMAccountName=" + 'sdwh_1' + "))";
foreach (SearchResult sResultSet in Dsearch.FindAll())
{
    DateTime BadPasswordTime = new DateTime(1600, 01, 01, 8, 0, 0, DateTimeKind.Local);
    if (sResultSet.Properties["badPasswordTime"].Count > 0)
    {
        BadPasswordTime= DateTime.FromFileTime((long)sResultSet.Properties["badPasswordTime"][0]);
    }
}

Now vs Today vs UtcNow

DateTime.Now;
// 6/27/2022 7:15:00 PM

DateTime.UtcNow;
// 6/27/2022 11:15:00 AM

DateTime.UtcNow.ToLocalTime();
// 6/27/2022 7:15:00 PM

DateTime.Today;
// 6/27/2022 12:00:00 AM

民國年

using System.Globalization;

new DateTime(111, 6, 27, 19, 15, 00, new TaiwanCalendar());
// 6/27/2022 7:15:00 PM

new TaiwanCalendar().GetYear(DateTime.Now);
/// 111

日本曆

var jaJp = new CultureInfo("ja-JP");
jaJp.DateTimeFormat.Calendar = new JapaneseCalendar();
DateTime.Now.ToString("", jaJp);
// 令和4年6月27日 19:15:00

DateTime.Now.ToString("dddd", jaJp);
// 月曜日

DateTime Parse

DateTime.Parse("2022年6月27日");
// 6/27/2022 12:00:00 AM

var jaJp = new CultureInfo("ja-JP");
jaJp.DateTimeFormat.Calendar = new JapaneseCalendar();
DateTime.Parse("令和4年6月27日 19:15:00", jaJp);
// 6/27/2022 7:15:00 PM

妙用 DateTime

星期比較,比較今天是否為星期六

DateTime.Now.DayOfWeek == DayOfWeek.Saturday

取得星期名稱 (法國)

CultureInfo.GetCultureInfo("fr-FR").DateTimeFormat.GetMonthName(DateTime.Now.Month);
// juin

年份的日數,取得 2022 年 (民國 111 年) 以及 2020 年 (民國 109 年) 共有幾日

new GregorianCalendar().GetDaysInYear(2022);
// 365

new GregorianCalendar().GetDaysInYear(2020);
// 366

new TaiwanCalendar().GetDaysInYear(111);
// 365

new TaiwanCalendar().GetDaysInYear(109);
// 366

GregorianCalendar | docs.microsoft

月份的日數,取得 2022 年 6 月共有幾日

DateTime.DaysInMonth(DateTime.Now.Year, DateTime.Now.Month);
// 30