目次
はじめに
- サンプルは.NET Core 3.1(Windows 10)で動作確認しています。
- 型が分かりやすいよう変数宣言ではvarを使用していません。実装時はvarを使用することをおすすめします。
- 完全なソースコードはこちらで公開しています。
リンク
DateTimeの基本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
// システム日時の取得 Console.WriteLine(DateTime.Now); // "2021/07/08 21:30:06" Console.WriteLine(DateTime.Today); // "2021/07/08 0:00:00" Console.WriteLine(DateTime.UtcNow); // "2021/07/08 12:30:06" // 特定日時の生成 DateTime dt = new DateTime(2001, 2, 3, 4, 5, 6, 987); Console.WriteLine(dt); // "2001/02/03 4:05:06" // 最小・最大 Console.WriteLine(DateTime.MinValue.ToString("O")); // "0001-01-01T00:00:00.0000000" Console.WriteLine(DateTime.MaxValue.ToString("O")); // "9999-12-31T23:59:59.9999999" // 年/月/日/時/分/秒の取得 Console.WriteLine(dt.Date); // "2001/02/03 0:00:00" Console.WriteLine(dt.Year); // 2001 Console.WriteLine(dt.Month); // 2 Console.WriteLine(dt.Day); // 3 Console.WriteLine(dt.Hour); // 4 Console.WriteLine(dt.Minute); // 5 Console.WriteLine(dt.Second); // 6 Console.WriteLine(dt.Millisecond); // 987 // 曜日 Console.WriteLine(dt.DayOfWeek); // "Saturday"(DayOfWeek列挙体) Console.WriteLine((int)dt.DayOfWeek); // 6 (cf. Sunday = 0) |
- 日付・時刻を使用する場合はDateTime構造体を使用します。
- DateTime型では0001/01/01~9999/12/31まで日時を指定できます。
- なお、日本時間はUTCより9時間進んでいるので、UTC形式の日時は-9時間した値になります。
- 曜日はDayOfWeek列挙体で保持されています。
ゾーン情報とUTC時刻の取得
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
// ローカルゾーン情報 TimeZoneInfo zoneInfo = TimeZoneInfo.Local; Console.WriteLine(zoneInfo.Id); // "Tokyo Standard Time" Console.WriteLine(zoneInfo.DisplayName); // "(UTC+09:00) 大阪、札幌、東京" Console.WriteLine(zoneInfo.StandardName); // "東京 (標準時)" // ローカルゾーン・UTC時刻変換 DateTime local = new DateTime(2023, 4, 5, 13, 34, 56, 987); DateTime utc = local.ToUniversalTime(); Console.WriteLine(local); // "2023/04/05 13:34:56" (UTC+9:00) Console.WriteLine(utc); // "2023/04/05 4:34:56" (UTC+0:00) // 任意のタイムゾーンの日時に変換 TimeZoneInfo zone1 = TimeZoneInfo.FindSystemTimeZoneById("Russian Standard Time"); DateTime zone1dt = TimeZoneInfo.ConvertTime(local, zone1); Console.WriteLine(zone1dt); // "2023/04/05 7:34:56" (UTC+3:00) |
- 既定では実行環境のタイムゾーンが使用されます。
- DateTime型のプロパティ・メソッドを使用してUTC日時に変換することもできます。
任意のタイムゾーンの日時に変換する場合、TimeZoneInfo.FindSystemTimeZoneById()を使用して該当するタイムゾーン情報を取得し、TimeZoneInfo.ConvertTime()で日時を変換できます。 - FindSystemTimeZoneById()の引数では標準タイムゾーン名を指定します。指定可能なタイムゾーン名の一覧はこちらをご覧ください。
日付・時刻文字列の変換
1 2 3 4 5 6 7 8 9 10 |
DateTime dt = new DateTime(2023, 4, 5, 13, 34, 56, 987); Console.WriteLine(dt.ToString()); // "2023/04/05 13:34:56" Console.WriteLine(dt.ToString("O")); // "2023-04-05T13:34:56.9870000" (ISO8601) Console.WriteLine(dt.ToString("yyyyMMdd")); // "20230405" Console.WriteLine(dt.ToString("yyyyMMddHHmmssfff")); // "20230405133456987" Console.WriteLine(dt.ToShortDateString()); // "2023/04/05" Console.WriteLine(dt.ToLongDateString()); // "2023年4月5日" var p1 = DateTime.ParseExact("12340506", "yyyyMMdd", null); Console.WriteLine(p1); // "1234/05/06 0:00:00" |
- DateTime型の日時を文字列に変換する場合はDateTime.ToString()を使用します。
- 引数で指定可能な書式は、大きく分けて「標準日時書式」「カスタム日時書式」があります。
- 標準日時書式: 例えばISO 8601形式, RFC1123形式等のように一般的・標準的な日時書式を使用する場合に使用します。”O”, “R”等のように1文字で表現されます。
- カスタム日時書式: “20210709”等のように独自の書式を指定する場合に使用します。”yyyy”, “HH”等のように日時の構成部分を表現する多様なパターンを指定できます。
なお、MM/mm、HH/hh等のように大・小文字の違いで意味が大きく異なる場合があるので注意が必要です。MMは「月」でmmは「分」、HHは24時間表記の「時」でhhは12時間表記の「時」です。
- 文字列から日付を使用する場合はDateTime.Parse(), DateTime.ParseExact()を使用できます。
- 意図しない文字列の取り込み防止、仕様の単純化、性能改善のために、ParseExact()の使用をおすすめします。
カルチャを意識しない場合は第3引数はnullで問題ありません。If provider is null, the CultureInfo object that corresponds to the current culture is used.
月末・月初の算出
1 2 3 4 5 6 7 |
DateTime dt = new DateTime(2023, 4, 5); DateTime firstDateOfMonth = new DateTime(dt.Year, dt.Month, 1); DateTime lastDateOfMonth = new DateTime(dt.Year, dt.Month, 1).AddMonths(1).AddDays(-1); Console.WriteLine(firstDateOfMonth); // "2023/04/01 0:00:00" Console.WriteLine(lastDateOfMonth); // "2023/04/30 0:00:00" |
- DateTimeコンストラクタやAddMonths(), AddDays()等を使用して月末・月初の日時を生成できます。
日時の差分、経過時間の算出
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
// 日時の差分 DateTime dt1a = new DateTime(2023, 4, 5, 21, 34, 46, 789); DateTime dt1b = new DateTime(2023, 4, 6, 23, 37, 50, 900); TimeSpan interval = dt1b - dt1a; Console.WriteLine(interval.TotalDays); // 1.0854642476851852 Console.WriteLine(interval.TotalHours); // 26.051141944444446 Console.WriteLine(interval.TotalMinutes); // 1563.0685166666667 Console.WriteLine(interval.TotalSeconds); // 93784.111 Console.WriteLine(interval.TotalMilliseconds); // 93784111 Console.WriteLine(interval.Days); // 1 Console.WriteLine(interval.Hours); // 2 Console.WriteLine(interval.Minutes); // 3 Console.WriteLine(interval.Seconds); // 4 Console.WriteLine(interval.Milliseconds); // 111 |
- DateTime型では演算子(演算子オーバーロード)が定義されているため、+-を使った日時演算や、>=<等を使った日時の大小比較が可能になっています。
- 日時の差分はTimeSpan構造体で表現され、日/時/分/秒/ミリ秒を単位とする差分を保持します。
2つの日時の差(日数や時間)を取得する場合は、基本的にTotalDays, TotalHours等のTotalが付くプロパティを使用します。Totalが付かないDays, Hours等は2つの日時の日や時間だけを見た場合の差分を返却します。
例えば、下記サンプルにおける2つの日付の差分(時間)は約26時間程です。TotalHoursは約26になっており期待する値になっていますが、Hoursは2時間になっており期待する結果と大きく異なります。Hoursは単純に2つの日付の「時」部分の差(23-21)を算出しているためです。
経過時間の取得(秒、ミリ秒、マイクロ秒、ナノ秒)
こちらで紹介しています。
NDW
目次 1 はじめに2 経過時間測定のサンプル3 ElapsedTicksを使った経過時間の算出方法 はじめに 次の環境を…
リンク