Home > C# > C# 学び直し > 日付と時刻

C#で、日付と時刻を扱うには

新規作成日 2017-11-01
最終更新日

日付と時刻は、プログラムで扱う際、いろいろな場面で必要になります。自分で、実装するのは大変ですが、C#では、DateTime構造体が存在するので、これを使うことで解決できます。

DateTime 構造体

日付と時刻をコンピューターで扱うことは、プログラミングや天文学、暦に詳しくなければ簡単そうに思えます。 しかし、背後に、月と地球と太陽の位置関係の問題が隠れています。結果として、基本的に、面倒なことが多く潜んでいると考えて下さい。 今では、懐かしい世界中で大騒ぎした2000年問題やうるう年、やうるう秒、月ごとの日数が、30日や31日などと違う問題。 そして、住んでいる地域ごとに現地時間が異なる問題、日付や時刻の表記法や表記順序、いろいろな表記の文字列から時間の値を取得する方法など、様々な面倒なことが複雑に絡み合っています。

C#では、呼吸するように自然にプログラミングする方が綿密に考えた日付と時刻を扱うDateTime値型を、私たちは、利用できます。 特にこだわりがない場合は、DateTime値型を使用して、日付と時刻を扱うことで、日付と時刻に関するほとんどの面倒を避けることができます。また、DateTime値型で対応できない場合でも、DateTime値型を活用して独自クラスを作成したほうが効率的です。 何はともあれ、C#でプログラミングを行う際、日付と時刻を扱うためには、DateTime値型の使い方を知っておく必要があります。

DateTime値型は、西暦0001(一般的な年代)、1月1日、00:00:00(真夜中)から、西暦(C.E.)9999年12月31日午後11時59分59秒まで、グレゴリオ暦で、日付と時刻を値の範囲で表現します。 時間値は、ticksと呼ばれる100ナノ秒の単位で測定されます。 個々の日付は、グレゴリオ暦カレンダーで、A.D. (C.E.)0001年、1月1日、12:00の真夜中からのticksの積算の数です。

日付と時刻には、地域設定に影響されます。地域設定は、カルチャやロケーションとも呼ばれます。Windowsでは、地域と時刻の設定で変更します。

DateTime構造体は、カレンダーに関係するデータの取得、日付と時刻が1つの値として扱えることなど多くの機能が用意されています。 DateTime構造体は、ほとんどの場面では、無駄に高機能です。そこで、必要に応じて、必要な部分だけを理解していく方向で考えていきましょう。

何故か必要になる西暦の略号の知識

DateTime 構造体で、C#における日付と時刻の扱いを調べる際には、西暦の略号をきちんと確認しておかないと混乱します。

略号 意味
紀元前 B.C. 「Before Christ」 キリスト以前
B.C.E. 「Before Common Era」 大衆の時代以前
紀元前 A.D. 「Anno Domini 」 主の年、つまり、キリストの生まれた年
C.E. 「Common Era」 大衆の時代 「Vulgar Era」 と同義、ヨハネスケブラーが提唱

なんでもヨハネスケブラーが、イエスが生まれた時に出現したとされるベツレヘムの星が出現した年代を紀元前7年頃だと計算した史実から、英語圏では、BC/AD の代わりに、CEとBCEを使うようにする議論が行われが行われたそうです。 2002年には、イギリスとウェールズの学校でBCE/CE表記システムの導入され。2011年にはイギリスのBBC放送が番組やウェブサイトで使うことをアナウンスされました。

このような経緯で、現在は、英語では、BC/ADではなく、BCE/CE表記が一般的なようです。日本語では、どちらも紀元前/紀元後で一緒なのですが。

参考:AD/BCと、CE/BCE

日付を指定しないで時刻を指定した場合の基準年は、COMシステムでは、紀元後1899年12月31日です。そして、.NET Frameworkでは、紀元後0001年1月1日です。使用環境によって日付が異なることに注意して下さい。

多国語対応する際は、ロケールに注意

日付と時刻は、多国語対応するアプリケーションでは、ロケールに注意する必要があります。OSで提供される多言語対応機能で、表示が自動で切り替わることを覚えておく必要があります。アプリケーションの多国語対応する際は、内部データは、標準時で管理し、表示値を現地時間に変換して使用する方が無難です。曜日の表記が変化するのはもちろんのこと、年、月、日、時間の並びもロケール設定により変化することに注意が必要です。

基本的な使い方

日付と時刻をC#でプログラミングする際、表面的にさらっと使いたいときに必要にな使い方を確認しましょう。

初期値を設定してDateTime オブジェクトのインスタンス化を作成する

DateTime オブジェクトの内容をコードの中で指定する(ハードコード)する場合には、インスタンスを作成する際に初期値を設定します。

日付だけを指定すると、時間は、0時、0分、0秒になります。

            // 初期値を設定してDateTime オブジェクトのインスタンス化を作成します。
            // 日付と時刻を設定
            DateTime date1 = new DateTime(2017, 10, 31, 16, 30, 52);
            // 日付のみを設定
            DateTime date2 = new DateTime(2017, 10, 31);

            Console.WriteLine(date1);
            Console.WriteLine(date2);

実行結果

2017/10/31 16:30:52l
2017/10/31 0:00:00

現在の日付と時刻を取得する

現在の時刻を設定する場合、DateTime.Now プロパティを使用します。

DateTime.Now プロパティ

現在の日付を設定する場合、DateTime.Today プロパティを使用します。

DateTime.Today プロパティ

            // 現在の日付と時刻を設定する
            // 現在の時間を設定する
            DateTime now = DateTime.Now;
            // 現在の時刻を設定する
            DateTime today = DateTime.Today;

            Console.WriteLine(now);
            Console.WriteLine(today);

日付形式の文字列をDateTimeオブジェクトに変更する

文字列を数値として取り出すのは、多少面倒なのですが、C#では、あらかじめDateTime.TryParse メソッドが用意されています。 実際に変換して取り込む日付形式の文字列で、確認は必要ですが、読み込めれば、自分で対応する必要はなくなります。

DateTime.Parse メソッドを使って、日付形式の文字列をDateTimeオブジェクトに変更する

DateTime.Parse メソッド

            // 日付形式の文字列をDateTimeオブジェクトに変更する
            String dateString = "2017年10月25日";

            DateTime convertedDate = DateTime.Parse(dateString);
            
            Console.WriteLine(convertedDate);

実行結果

2017/10/25 0:00:00

DateTime.Parse メソッドは、変換に失敗すると例外が投げられます。

DateTime.Parse メソッドを使って、日付形式の文字列をDateTimeオブジェクトに変更する

コードに、文字列をDateTimeオブジェクトに変換できたかどうか確認する処理を書き加える場合、DateTime.TryParse メソッドを使用します。

DateTime.TryParse メソッド (String, DateTime)

日付形式の文字列は、間違いが含まれていると想定した方が良いので、変換できたか確認するコードを使用することをお勧めします。

            // 変換の成功を確認して、日付形式の文字列をDateTimeオブジェクトに変更する

            DateTime dateValue;
            string[] dateStrings = { "2017年10月26日", "2017年10月32日" };

            foreach (string dateString in dateStrings)
            {
                if (DateTime.TryParse(dateString01, out dateValue))
                Console.WriteLine("  Converted '{0}' to {1}.", dateString, dateValue);
            else
                Console.WriteLine("  Unable to parse '{0}'.", dateString);
            }

DateTime構造体から、必要な部分の値を取り出す

DateTime構造体から、必要な部分の値を取り出すには、それぞれのプロパティを使用します。 分解能は、パソコンの能力によりますが、15ミリ秒ほどと言われていますで、ミリ秒単位の時間については、あまり気にしない方がいいようです。

            // 日付と時刻を設定
            DateTime date1 = new DateTime(2017, 10, 31, 16, 30, 52);

            // DateTimeオブジェクトから、部分的にデータを取り出す。

            Console.WriteLine("{0}:年", date1.Year);
            Console.WriteLine("{0}:月", date1.Month);
            Console.WriteLine("{0}:日", date1.Day);
            Console.WriteLine("{0}:時", date1.Hour);
            Console.WriteLine("{0}:分", date1.Minute);
            Console.WriteLine("{0}:秒", date1.Second);
            Console.WriteLine("{0}:1/1000秒", date1.Millisecond);

実行結果

2017:年
10:月
31:日
16:時
30:分
52:秒
0:1/1000秒

特定の形状の日付と時刻を表すためには、日時書式指定文字列を使用します。

標準の日時書式指定文字列

カスタム日時書式指定文字列

日付をプログラムから使用する場合は、日付や時刻の中の1部分を取り出して扱う必要があることが多いです。

このエントリーをはてなブックマークに追加

Home PC C# Illustration

Copyright (C) 2011 Horio Kazuhiko(kukekko) All Rights Reserved.
kukekko@gmail.com
ご連絡の際は、お問い合わせページのURLの明記をお願いします。
「掲載内容は私自身の見解であり、所属する組織を代表するものではありません。」