NDW

アプリ開発やトラブルシューティング等のノウハウ、キャンプや登山の紹介や体験談など。

.NET Core 1. システムエンジニアリング 実装技術

.NET Core(C#): DateTimeの使い方サンプル

投稿日:2021年7月10日 更新日:

はじめに

  • サンプルは.NET Core 3.1(Windows 10)で動作確認しています。
  • 型が分かりやすいよう変数宣言ではvarを使用していません。実装時はvarを使用することをおすすめします。
  • 完全なソースコードはこちらで公開しています。

DateTimeの基本

// システム日時の取得
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時刻の取得

// ローカルゾーン情報
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()の引数では標準タイムゾーン名を指定します。指定可能なタイムゾーン名の一覧はこちらをご覧ください。

日付・時刻文字列の変換

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.

月末・月初の算出

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()等を使用して月末・月初の日時を生成できます。

日時の差分、経過時間の算出

// 日時の差分
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)を算出しているためです。

経過時間の取得(秒、ミリ秒、マイクロ秒、ナノ秒)

こちらで紹介しています。







-.NET Core, 1. システムエンジニアリング, 実装技術

関連記事

技術検証

LinuxでGoogle Driveを操作(rcloneの使い方)

概要 RHEL8.3にて、rcloneを使用してGoogle Driveに接続する方法を説明します。 rclone.org  1 Tweet 168 Users 3189 PocketsRc …

ExcelからPowerPointへの図表貼り付けVBA

パフォーマンスモニタの監視データ(blg)に基づいてPowerPointで報告用のレポートを作成する必要がありました。パフォーマンスログのデータをCSVに変換してExcelに取り込んでグラフを作成し、 …

リモートからのwarデプロイの自動化

JavaEEベースのツールを公開しているが、デプロイの都度、warファイルをサーバにコピーしてwildflyにデプロイするのが面倒なので、mavenで自動化しました。 前提 mavenのプラグインと後 …

DB操作フレームワーク はJPA or mybatis?

開発に向けた準備で、開発標準を準備するフレームワーク(FW)チーム、それらを使って実装を行う業務チームが集まって、「DB操作を行うためのFWは何を使うか?」という協議になった。 FWチームは、FW・J …

ASP.NET Core: IHttpClientFactoryの単純サンプル

IHttpClientの使い方やサンプルの記事を書きましたが、後から見るとちょっと量が多いと感じました。 とりあえず動かしてみたい、概略を知りたい、急いでいる等の人向けに、もっと単純なサンプルを用意し …