.NET BCL Series | DateTime

2022-06-24

筆記 .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 | learn.microsoft

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

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