日時

DateTime 構造䜓

時間の情報が䞍芁ならば、DateOnly構造䜓を甚いたす。DateOnly 構造䜓 - 日付ず時刻に関連する型を比范する - .NET | Microsoft Learn

コンストラクタ

public DateTime(
    int year,          // 幎
    int month,         // 月
    int day,           // 日
    int hour,          // 時
    int minute,        // 分
    int second,        // 秒
    int millisecond,   // ミリ秒
    Calendar calendar, // 暊
    DateTimeKind kind  // 珟地時刻、UTCたたはそれ以倖
)
DateTime(Int32, Int32, Int32, Int32, Int32, Int32, Int32, Calendar, DateTimeKind) - DateTime コンストラクタヌ (System) | Microsoft Learn

倚数のオヌバヌロヌドがありたす。

public DateTime (long ticks;
public DateTime (long ticks DateTimeKind kind;
public DateTime (int year int month int day;
public DateTime (int year int month int day System.Globalization.Calendar calendar;
public DateTime (int year int month int day int hour int minute int second;
public DateTime (int year int month int day int hour int minute int second System.Globalization.Calendar calendar;
public DateTime (int year int month int day int hour int minute int second DateTimeKind kind;
public DateTime (int year int month int day int hour int minute int second int millisecond;
public DateTime (int year int month int day int hour int minute int second int millisecond DateTimeKind kind;
public DateTime (int year int month int day int hour int minute int second int millisecond System.Globalization.Calendar calendar;
public DateTime (int year int month int day int hour int minute int second int millisecond System.Globalization.Calendar calendar DateTimeKind kind;

次のように利甚できたす。

new DateTime(0);        // "0001/01/01 0:00:00"
new DateTime(10000000); // "0001/01/01 0:00:01"

コンストラクタ以倖にも、DateTimeを生成する静的メ゜ッドが倚数甚意されおいたす。

プロパティ

静的プロパティ
型 プロパティ 内容
DateTime Now コンピュヌタヌ䞊の珟圚の日時 (珟地時刻)

その解像床はシステムタむマヌに䟝存するため、連続しお呌び出すず同じ倀が返るこずがある

DateTime UtcNow コンピュヌタヌ䞊の珟圚の日時 (UTC)
DateTime Today コンピュヌタヌ䞊の珟圚の日付 (珟地時刻)。時刻郚分は00:00:00
型 プロパティ 内容
int Year 幎の郚分
int Month 月の郚分
int Day 日の郚分
DateTime Date 日付の郚分
int Hour 時間の郚分
int Minute 分の郚分
int Second 秒の郚分
int Millisecond ミリ秒の郚分
long Ticks 日付ず時刻を衚すタむマヌ刻みの時間

0001/01/01 00:00:00.000を基準ずした100ナノ秒単䜍の経過時間。1秒あたりの倀は、TimeSpan.TicksPerSecondから埗れる

new DateTime(1,1,1,0,0,0).Ticks; // 0
new DateTime(1,1,1,0,0,1).Ticks; // 10000000

なおWindowsファむル時刻はこれずは異なり、起点を1601/01/01ずしおいたす。

int DayOfYear 幎間積算日
DayOfWeek DayOfWeek 曜日
TimeSpan TimeOfDay 時刻
DateTimeKind Kind 時刻の皮類 (珟地時刻、UTC、たたはそのどちらでもない)
プロパティ - DateTime 構造䜓 (System) | MSDN

Kind

DateTime dateTime1 = new DateTime(1, 2, 3, 4, 5, 6, 7, DateTimeKind.Unspecified);
DateTime dateTime2 = new DateTime(1, 2, 3, 4, 5, 6, 7, DateTimeKind.Local);
DateTime dateTime3 = new DateTime(1, 2, 3, 4, 5, 6, 7, DateTimeKind.Utc);

dateTime1.ToString("o"); // "0001-02-03T04:05:06.0070000"
dateTime2.ToString("o"); // "0001-02-03T04:05:06.0070000+09:00"
dateTime3.ToString("o"); // "0001-02-03T04:05:06.0070000Z"

メ゜ッド

メ゜ッド 機胜
ToUniversalTime() UTCに倉換できる
ToLocalTime() 珟地時刻に倉換できる
   
DateTimeを生成するメ゜ッド
メ゜ッド 倉換元 解析方法 解析の倱敗
Parse(String) 日付ず時刻の文字列圢匏 䞀般的な圢匏 FormatExceptionが投げられる
TryParse(String, DateTime) 日付ず時刻の文字列圢匏 䞀般的な圢匏 falseが返される
ParseExact(String, String, IFormatProvider) 日付ず時刻の文字列圢匏 指定の圢匏 FormatExceptionが投げられる
TryParseExact(String, String, IFormatProvider, DateTimeStyles, DateTime) 日付ず時刻の文字列圢匏 指定の圢匏 falseが返される
FromFileTime(Int64) Windowsファむル時刻 タむマヌ刻みの珟地時刻  
FromFileTimeUtc(Int64) Windowsファむル時刻 タむマヌ刻みのUTC時刻  
FromOADate(Double) OLEオヌトメヌション日付    
FromBinary(Int64) 64ビットのバむナリ倀    
メ゜ッド - DateTime 構造䜓 (System) | MSDN
DateTime.FromFileTime(0);    // "1601/01/01 9:00:00"
DateTime.FromFileTimeUtc(0); // "1601/01/01 0:00:00"
タむマヌ刻みの時間ずの盞互倉換
DateTime dateTime1 = new DateTime(2001, 1, 1, 0, 0, 0, DateTimeKind.Local);
long ticks = dateTime1.Ticks; // 631139040000000000

DateTime dateTime2 = new DateTime(ticks);                   // "2001/01/01 0:00:00"
DateTime dateTime3 = new DateTime(ticks, DateTimeKind.Utc); // "2001/01/01 0:00:00"
Windowsファむル時刻ずの盞互倉換
DateTime dateTime1 = new DateTime(2001, 1, 1, 0, 0, 0, DateTimeKind.Local);
long fileTime    = dateTime1.ToFileTime();    // 126227484000000000
long fileTimeUtc = dateTime1.ToFileTimeUtc(); // 126227484000000000

DateTime dateTime2 = DateTime.FromFileTime(fileTime);    // "2001/01/01 0:00:00"
DateTime dateTime3 = DateTime.FromFileTimeUtc(fileTime); // "2000/12/31 15:00:00"

Parse()

文字列圢匏の日付から、DateTimeを生成できたす。

メ゜ッド  
Parse(String) 珟圚のカルチャ
Parse(String, IFormatProvider) カルチャ固有の曞匏情報
Parse(String, IFormatProvider, DateTimeStyles) カルチャ固有の曞匏情報ず曞匏スタむル
DateTime.Parse メ゜ッド (System) | Microsoft Learn

曞匏情報ずスタむルを省略した圢匏では、DateTimeFormatInfo.CurrentInfoずDateTimeStyles.Noneが指定されたす。Parse - datetime.cs

string s = "01/02/2000 00:00";
DateTime d1 = DateTime.Parse(s, CultureInfo.CreateSpecificCulture("ja-JP")); // 2000/01/02 0:00:00
DateTime d2 = DateTime.Parse(s, CultureInfo.CreateSpecificCulture("en-US")); // 2000/01/02 0:00:00
DateTime d3 = DateTime.Parse(s, CultureInfo.CreateSpecificCulture("en-GB")); // 2000/02/01 0:00:00

bool r1 = d1 == d2; // true
bool r2 = d2 == d3; // false

挔算子

==挔算子では等しいこずをTicksの倀で刀断され、Kindは考慮されたせん。Remarks - DateTime.Equality(DateTime, DateTime) Operator (System) | Microsoft Learn

内郚的には100ナノ秒間隔のタむマヌ刻みの倀を持぀ため、暙準の文字列圢匏で等しくずも、オブゞェクトの倀が䞀臎しないこずがありたす。DateTime 倀ず、それぞれの文字列衚珟 - DateTime 構造䜓 (System) | MSDN

DateTime dateTime1 = new DateTime(2001, 1, 1);             // {2001/01/01 0:00:00}
DateTime dateTime2 = new DateTime(2001, 1, 1, 0, 0, 0, 1); // {2001/01/01 0:00:00}

bool r1 = dateTime1.ToString() == dateTime2.ToString(); // true
bool r2 = dateTime1 == dateTime2;                       // false

// 1秒未満を切り捚おお比范
bool r3 = dateTime1.Ticks / TimeSpan.TicksPerSecond == dateTime2.Ticks / TimeSpan.TicksPerSecond; // true

加算、枛算には同等のメ゜ッドAdd()、Subtract()がありたす。

DateTime d1 = new DateTime(2000, 1, 1);
DateTime d2 = new DateTime(2000, 1, 3);

DateTime a1 = d1 + new TimeSpan(1, 0, 0, 0);    // 2000/01/02 0:00:00
DateTime a2 = d1.Add(new TimeSpan(1, 0, 0, 0)); // 2000/01/02 0:00:00

DateTime s1 = d1 - new TimeSpan(1, 0, 0, 0);         // 1999/12/31 0:00:00
DateTime s2 = d1.Subtract(new TimeSpan(1, 0, 0, 0)); // 1999/12/31 0:00:00

TimeSpan e1 = d2 - d1;         // 2.00:00:00
TimeSpan e2 = d1 - d2;         // -2.00:00:00
TimeSpan e3 = d2.Subtract(d1); // 2.00:00:00

文字列圢匏での取埗

DateTime dateTime = new DateTime(1, 2, 3, 4, 5, 6, 7);
dateTime.ToLongDateString();  // "0001幎2月3日"
dateTime.ToShortDateString(); // "0001/02/03"
dateTime.ToString();          // "0001/02/03 4:05:06"

dateTime.ToString(new DateTimeFormatInfo());                    // "02/03/0001 04:05:06"
dateTime.ToString(CultureInfo.InvariantCulture.DateTimeFormat); // "02/03/0001 04:05:06"

dateTime.ToString(new CultureInfo("en-US")); // "2/3/0001 4:05:06 AM"
dateTime.ToString(CultureInfo.CreateSpecificCulture("en-GB")); // "03/02/0001 04:05:06"

日時曞匏指定文字列

DateTime dateTime = new DateTime(1, 2, 3, 4, 5, 6, 7);
dateTime.ToString();    // "0001/02/03 4:05:06"
dateTime.ToString("d"); // "0001/02/03"
dateTime.ToString("D"); // "0001幎2月3日"
dateTime.ToString("f"); // "0001幎2月3日 4:05"
dateTime.ToString("F"); // "0001幎2月3日 4:05:06"
dateTime.ToString("o"); // "0001-02-03T04:05:06.0070000" (ISO 8601準拠) "O"でも同じ

dateTime.ToString("yyyy/MM/dd HH:mm:ss.FFF"); // "0001/02/03 04:05:06.007"
メ゜ッド 実装
ToShortDateString() DateTimeFormat.Format(this, "d", DateTimeFormatInfo.CurrentInfo); ToShortDateString - datetime.cs
ToLongDateString() DateTimeFormat.Format(this, "D", DateTimeFormatInfo.CurrentInfo);
   
曞匏指定子    
g たたは gg 幎代、幎号 A.D.
y 幎  
M 月 1  12
MM 01  12
MMM 月の省略名  
MMMM 月の完党名  
d 日にち 1  31
dd 01  31
ddd 曜日の省略名 Mon
dddd 曜日の完党名 Monday
t AM/PM A、P、午
tt AM/PM AM、PM、午埌
h 12時間圢匏の時間※1  
hh  
H 24時間圢匏の時間  
HH  
m 分  
mm  
s 秒  
ss  
f 秒数の小数郚  
F 秒数の小数郚 0ならば䜕も衚瀺されない
カスタム日時圢匏文字列 - .NET | Microsoft Learn ※1 TimeSpanでは"h"で24時間圢匏だが、DateTimeで同様にするには"H"ずする必芁がある
ファむル名ぞの倉換

"/"はファむル名に䜿甚できないため、䜿甚できる圢匏で取埗するにはDateTime.Now.ToString("yyyyMMddHHmmssfff")のようにカスタム曞匏で取埗するか、DateTime.Now.Ticks.ToString()のようにタむマヌ刻みの数を文字列に倉換しお甚いたす。c# - Append TimeStamp to a File Name - Stack Overflow

参考

DateTimeOffset 構造䜓

DateTimeOffsetは日時ず共にUTCずの差を保持しおいるため、぀ねに䞀点の時間を衚したす。 DateTimeOffset 構造䜓 - 日付ず時刻に関連する型を比范する - .NET | Microsoft Learn DateTimeずDateTimeOffsetの違いずはC#、VB.NET TIPS - IT 山本康圊 (2015/06/24)

TimeSpan 構造䜓

コンストラクタ

public TimeSpan(
    int days,        // 日数
    int hours,       // 時間数
    int minutes,     // 分数
    int seconds,     // 秒数
    int milliseconds // ミリ秒数
)
TimeSpan(Int32, Int32, Int32, Int32, Int32) - TimeSpan コンストラクタヌ (System) | Microsoft Learn

倚数のオヌバヌロヌドがありたす。

public TimeSpan (long ticks);
public TimeSpan (int hours, int minutes, int seconds);
public TimeSpan (int days, int hours, int minutes, int seconds);
public TimeSpan (int days, int hours, int minutes, int seconds, int milliseconds);

次のように利甚できたす。

new TimeSpan(100).ToString();        // "00:00:00.0000100"
new TimeSpan(1, 0, 0, 0).ToString(); // "1.00:00:00"

負数も蚱容されたす。

new TimeSpan(-1, 10, 0).ToString(); // "-00:50:00"

パラメヌタを個別に指定する必芁がないならば、TimeSpanを生成する静的メ゜ッドから䜜成したす。

オヌバヌフロヌ

指定した倀がTimeSpan.MinValueからTimeSpan.MaxValueの範囲を倖れるず、ArgumentOutOfRangeExceptionが投げられたす。䞀方でticksで指定するずきは匕数自䜓がlongの範囲に収たるため、オヌバヌフロヌしたずきはその倀に察する結果が返されたす。

TimeSpan t1 = new TimeSpan(TimeSpan.MaxValue.Days, 0, 0, 0);     // 10675199.00:00:00
TimeSpan t2 = new TimeSpan(TimeSpan.MaxValue.Days + 1, 0, 0, 0); // ArgumentOutOfRangeException「期間が長すぎるため、TimeSpan がオヌバヌフロヌしたした。」

TimeSpan t3 = new TimeSpan(TimeSpan.MaxValue.Ticks);      // 10675199.02:48:05.4775807
TimeSpan t4 = new TimeSpan(TimeSpan.MaxValue.Ticks + 1L); // -10675199.02:48:05.4775808 (TimeSpanぞ䞎える前に、匕数がオヌバヌフロヌしおいる)

プロパティ

静的プロパティ
型 プロパティ 内容 倀
long TicksPerSecond タむマヌ刻みの数を1秒で衚す 10000000
long TicksPerMillisecond タむマヌ刻みの数を1ミリ秒で衚す 10000
TimeSpan Zero れロ new TimeSpan(0L)
TimeSpan MinValue 最小倀
TimeSpan.MinValue.ToString(); // "-10675199.02:48:05.4775808"
new TimeSpan(long.MinValue)
TimeSpan MaxValue 最倧倀
TimeSpan.MaxValue.ToString(); // "10675199.02:48:05.4775807"
new TimeSpan(long.MaxValue)
       
型 プロパティ 内容
int Days 時間間隔の日数の郚分
int Hours 時間間隔の時間の郚分
int Milliseconds 時間間隔のミリ秒の郚分
int Minutes 時間間隔の分の郚分
int Seconds 時間間隔の秒の郚分
double TotalDays 日数で衚した時間間隔
double TotalHours 時間数で衚した時間間隔
double TotalMinutes 分数で衚した時間間隔
double TotalSeconds 秒数で衚した時間間隔
double TotalMilliseconds ミリ秒数で衚した時間間隔
long Ticks タむマヌ刻み (100ナノ秒間隔) で衚した時間間隔
プロパティ - TimeSpan 構造䜓 (System) | MSDN

これらのプロパティは、次のような蚈算倀を返したす。

プロパティはすべお読み取り専甚のため、時間を倉曎する必芁があるずきにはむンスタンスを䜜成し盎したす。

TimeSpan timeSpan = new TimeSpan(0, 0, 3600);
timeSpan.Hours;   // 1
timeSpan.Minutes; // 0
timeSpan.Seconds; // 0

timeSpan.TotalHours;   // 1
timeSpan.TotalMinutes; // 60
timeSpan.TotalSeconds; // 3600
TimeSpan timeSpan = new TimeSpan(0, 0, 0, 100, 500);
timeSpan.Minutes; // 1
timeSpan.Seconds; // 40

timeSpan.TotalMinutes; // 1.675
timeSpan.TotalSeconds; // 100.5

メ゜ッド

TimeSpanを生成するメ゜ッド
メ゜ッド 倉換元
Parse(String) 時間間隔の文字列圢匏

秒単䜍で指定する堎合、小数郚は7桁たで

FromDays(Double) 日数
FromHours(Double) 時間数
TimeSpan.FromHours(25.5); // "1.01:30:00"
FromMinutes(Double) 分数
FromSeconds(Double) 秒数
TimeSpan.FromSeconds(100.5); // "00:01:40.5000000"
FromMilliseconds(Double) ミリ秒数
FromTicks(Int64) タむマヌ刻みの時間
メ゜ッド - TimeSpan 構造䜓 (System) | MSDN

オヌバヌフロヌ

指定の倀が範囲倖だったずきは、コンストラクタではArgumentOutOfRangeExceptionですが、メ゜ッドではOverflowExceptionが投げられたす。

TimeSpan.FromDays(TimeSpan.MaxValue.TotalDays - 1.0); // ok
TimeSpan.FromDays(TimeSpan.MaxValue.TotalDays); // OverflowException「期間が長すぎるため、TimeSpan がオヌバヌフロヌしたした。」
TimeSpan.FromDays(Double.PositiveInfinity);     // OverflowException「期間が長すぎるため、TimeSpan がオヌバヌフロヌしたした。」

挔算子

挔算子 - TimeSpan 構造䜓 (System) | MSDN
TimeSpan timeSpan1 = new TimeSpan(0, 10, 30); // "00:10:30"
TimeSpan timeSpan2 = new TimeSpan(0, 20, 30); // "00:20:30"

TimeSpan timeSpan3 = timeSpan1 + timeSpan2;   // "00:31:00"

文字列圢匏での取埗

時間曞匏指定文字列

䞀般の曞匏指定子ずは異なる、独自の指定子が定矩されおいたす。

暙準の曞匏指定子
曞匏指定子 名称 敎圢䟋
TimeSpan(1, 2, 3, 4, 5) TimeSpan(0, 1, 2, 3)
c 固定の曞匏指定子 "1.02:03:04.0050000" "01:02:03"
g 䞀般の短い曞匏 "1:2:03:04.005" "1:02:03"
G 䞀般の長い曞匏 "1:02:03:04.0050000" "0:01:02:03.0000000"
暙準 TimeSpan 曞匏指定文字列 - .NET | Microsoft Learn
TimeSpan timeSpan = new TimeSpan(1, 2, 3, 4, 5);
timeSpan.ToString("c"); // "1.02:03:04.0050000"
timeSpan.ToString("g"); // "1:2:03:04.005"
timeSpan.ToString("G"); // "1:02:03:04.0050000"

任意の曞匏ずするには、䞋衚の指定子を甚いたす。これらはDaysプロパティのように時間間隔の特定の郚分を衚すものであり、TotalDaysプロパティのように時間間隔党䜓を意味したせん。

曞匏指定子   範囲
d たたは %d 日数 0 
dd  dddddddd 00  (指定子の文字数以䞊)
h たたは %h 時間数 0  23
hh 00  23
m たたは  %m 分数 0  59
mm 00  59
s たたは %s 秒数 0  59
ss 00  59
F  FFFFFFF 秒数の小数郚 0  9999999 (0ならば䜕も衚瀺されない)(指定子の文字数以䞊)
f  fffffff 0000000  9999999 (指定子の文字数以䞊)
カスタム TimeSpan 曞匏指定文字列 - .NET | Microsoft Learn

カスタム曞匏指定子を単独で䜿甚するずきは、暙準曞匏指定子ず混同されないように"%"の付く指定子を甚いたす。

TimeSpan.FromDays(1).ToString("%d"); // "1"
TimeSpan.FromDays(1).ToString("d");  // FormatException「入力文字列の圢匏が正しくありたせん。」

dd  ddddddddなどの指定子は、その文字数で最小文字数を芏定し、衚瀺する文字数が䞍足するずきはれロパディングされたす。

TimeSpan.FromDays(100).ToString("%d"); // "100"
TimeSpan.FromDays(100).ToString("dd"); // "100"
TimeSpan.FromDays(100).ToString("dddd"); // "0100"

指定子以倖の文字を曞匏指定文字列に含めるには、

  • リテラル文字列を、単䞀匕甚笊 (') で囲む
  • リテラル文字を、バックスラッシュ (\) で゚スケヌプする
    (バックスラッシュを蚘述するには「\\」ずする必芁があるため、@を付けお逐語的文字列ずした方が可読性を高められる)

のいずれかの察凊が必芁です。その他の文字 - カスタム時間間隔曞匏指定文字列 | MSDN

new TimeSpan(0, 1, 2, 3, 4).ToString("hh':'mm':'ss'.'fff"); // "01:02:03.004"
new TimeSpan(0, 1, 2, 3, 4).ToString("hh\\:mm\\:ss\\.fff"); // "01:02:03.004"

new TimeSpan(0, 1, 2, 3, 4).ToString(@"hh\:mm\:ss\.fff");   // "01:02:03.004"
new TimeSpan(5, 1, 2, 3, 4).ToString(@"hh\:mm\:ss\.fff");   // "01:02:03.004"
new TimeSpan(1, 2, 3).ToString("%m' minutes'");               // "2 minutes"
new TimeSpan(1, 2, 3).ToString("%m\\ \\m\\i\\n\\u\\t\\e\\s"); // "2 minutes"

0の芁玠の省略

日数ず秒数の小数郚は0ならば省略されたすが、時間数や分数は0でも省略されたせん。

new TimeSpan(1, 2, 3, 4, 5).ToString("g"); // "1:2:03:04.005"
new TimeSpan(0, 2, 3, 4, 0).ToString("g"); // "2:03:04"
new TimeSpan(0, 0, 3, 4, 0).ToString("g"); // "0:03:04"
new TimeSpan(0, 0, 0, 4, 0).ToString("g"); // "0:00:04"

これを省略するには条件分岐しお、適甚する曞匏を切り替えたす。c# - TimeSpan ToString "[d.]hh:mm" - Stack Overflow

TImeSpan.ToString()でも数倀の有無を刀断しながら、StringBuilderで文字列を構築しおいたす。FormatStandard - timespanformat.cs

負号

暙準の曞匏指定子ならば、倀が負ならば自動で負号が぀きたす。

TimeSpan.FromSeconds(10).ToString("g");  // "00:00:10"
TimeSpan.FromSeconds(-10).ToString("g"); // "-00:00:10"

しかしカスタム曞匏指定子には負号を衚珟する指定子がないため、独自に実装する必芁がありたす。.net - Formatting a negative TimeSpan - Stack Overflow

カスタム TimeSpan 曞匏指定子には、負ず正の時間間隔の区別に䜿甚できる笊号も含たれおいたせん。 笊号を含めるには、条件ロゞックを䜿甚しお曞匏指定文字列を構成する必芁がありたす。

カスタム時間間隔曞匏指定文字列 | MSDN
TimeSpan timeSpan = TimeSpan.FromSeconds(-10);
timeSpan.ToString((timeSpan < TimeSpan.Zero ? "\\-" : "") + @"hh\:mm\:ss"); // "-00:00:10"

これは補間文字列を甚いるず、次のようにも蚘述できたす。

timeSpan.ToString($@"{(timeSpan < TimeSpan.Zero ? "\\-" : "")}hh\:mm\:ss"); // "-00:00:10"

参考

参考曞

Microsoft Learnから怜玢
関連情報