日付や時刻はDateTimeを使用して扱うことができます。
このDateTimeに関して、以下の2点を紹介していきます。
- 文字列に変換する
- 文字列からDateTimeに変換する
文字列に変換の場合は、書式指定子によって色んな表示の仕方ができます。参考にしてみてください。
日付・時刻(DateTime)を文字列に変換する|DateTimeのプロパティを使用
例えば、以下のようにDateTimeのプロパティを使ってどんな文字列に変換できるか、デバッグ出力しながら確認してみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | DateTime now = DateTime.Now; string t; t = DateTime.Now.ToString(); Debug.WriteLine(t); t = DateTime.Now.ToLongDateString(); Debug.WriteLine(t); t = DateTime.Now.ToLongTimeString(); Debug.WriteLine(t); t = DateTime.Now.ToShortDateString(); Debug.WriteLine(t); |
動作確認結果は以下の通りです。
DateTime.Now.ToString()
→ 2019/07/10 8:40:12
DateTime.Now.ToLongDateString()
→ 2019年7月10日
DateTime.Now.ToLongTimeString
→ 8:40:12
DateTime.Now.ToShortDateString
→ 2019/07/10
そのままToStringで出力してみると、年月日時分秒で出力されるのがわかります。
この時の表示は「/(スラッシュ)」で区切られているのがわかります。
また、次のToLongDateStringで出力してみると、今度は年月日が出力されます。Dateなので日付部分のみが出力されてます。
この時の表示は、先ほどとは異なり、漢字で「年月日」と区切られています。
というように、DateTimeのプロパティを使用すると、決まった形式で文字列に変換できるのがわかりました。
でも、実際の場面では、
- 2019年を2桁表示の19年で出力したい
- 2019.07.10 と「ドット(.)」で区切って表示したい
- 2019-07-10 と「ハイフン(-)」で区切って表示したい
など、いろんな場面で出力したい形式が変わってくると思います。
次項では、そんな自由な形式で日付・時間を文字列に出力する方法を紹介します。
色んな形式で日付・時刻(DateTime)を文字列に変換する|yyyymmdd
string.Formatで書式指定子を使って、文字列に変換します。
DateTimeの書式指定子は少し数が多いですが、暗記する必要はありません。
とても便利なので、こんな事ができるんだー、と頭に入れておけばOKです。わからなくなったらもう一度このページを参照しにきてください!
とりあえず1つサンプルコードを載せてみます。
1 2 3 4 5 | DateTime timeNow = DateTime.Now; string t; t = string.Format("{0:yyyy/MM/dd HH:mm:ss}", timeNow); Debug.WriteLine(t); |
この時の出力は、以下の通りです。
2019/07/10 19:56:54
yyyyは年、MMは月、ddは日にち、HH mm ssで時分秒を出力する、といった感じです。
もう少し、いくつかサンプルを載せておきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | DateTime timeNow = DateTime.Now; string t; t = string.Format("{0:yyyy-MM-dd HH:mm:ss}", timeNow); Debug.WriteLine(t); t = string.Format("{0:yy/MM/dd(ddd) HH:mm:ss}", timeNow); Debug.WriteLine(t); t = string.Format("{0:yy/MM/dd(dddd) HH:mm:ss}", timeNow); Debug.WriteLine(t); t = string.Format("{0:y.M.dd(dddd) hh:mm:ss.fff}", timeNow); Debug.WriteLine(t); |
この時の出力は以下のような感じです。
t = string.Format("{0:yyyy-MM-dd HH:mm:ss}", timeNow);
→ 2019-07-10 19:56:54
t = string.Format("{0:yy/MM/dd(ddd) HH:mm:ss}", timeNow);
→ 19/07/10(水) 19:56:54
t = string.Format("{0:yy/MM/dd(dddd) HH:mm:ss}", timeNow);
→ 19/07/10(水曜日) 19:56:54
t = string.Format("{0:y.M.dd(dddd) hh:mm:ss.fff}", timeNow);
→ 19.7.10(水曜日) 07:56:54.340
yyyy MMの間を「ハイフン」や「ドット」で区切ることも可能です。
またyyyyをyyとすると2桁で年(2019 → 19)を表示することも可能です(Mとかdも同じです)。
dddやddddで曜日を出力することも可能です。fffでミリ秒を出力することも可能です。
とても便利ですね!
参考までに、よく使いそうな書式指定子を表で掲載しておきます。
書式指定子 | 説明 | 使用例 | |
y | 年 | 0~99で表示 | 19 |
yy | 00~99で表示 | 19 | |
yyyy | 0000~9999で表示 | 2019 | |
M | 月 | 1~12で表示 | 7 |
MM | 01~12で表示 | 07 | |
d | 日 | 1~31で表示 | 9 |
dd | 01~31で表示 | 09 | |
ddd | 曜日の省略名で表示 | 火 | |
dddd | 曜日の完全名で表示 | 火曜日 | |
h | 時 | 1~12で表示 | 7 |
hh | 01~12で表示 | 07 | |
H | 0~23で表示 | 13 | |
HH | 00~23で表示 | 07 | |
m | 分 | 0~59で表示 | 5 |
mm | 00~59で表示 | 05 | |
s | 秒 | 0~59で表示 | 7 |
ss | 00~59で表示 | 07 | |
f | ミリ秒 | 0~9で表示 | 1 |
ff | 00~99で表示 | 12 | |
fff | 000~999で表示 | 123 |
表がみにくい場合は、同じものを画像にしましたのでこちらを参照してみてください。
日付・時間文字列をDateTimeオブジェクトに変換する方法|DateTime.Parse、DateTime.ParseExact
DateTimeを文字列に変換する方法は分かったと思います。
今度はその逆、文字列をDateTimeオブジェクトに変換する方法を紹介します。
DateTime.Parse、DateTime.ParseExactを使用します。
ソースコードは以下の通り。
ここでは、2019年7月9日12時00分12秒という文字列「2019_07_09_120012」をDateTimeオブジェクトに変換しています。
※アンダーバーで区切っている。
1 2 3 4 5 6 | string text = "2019_07_09_120012"; string format = "yyyy_MM_dd_HHmmss"; DateTime time = DateTime.ParseExact(text, format, null); Debug.WriteLine(time.ToString()); |
この時のDebug文の出力は以下の通り。
2019/07/09 12:00:12
ちゃんと変換されているのがわかります。
ここで注意なのですが、変換元の日付時間文字列と、変換したいフォーマットの形式があっていないと例外が発生する、という点。
ここでは、アンダーバーとハイフンでわざと形式を違うようにしてみました。
DateTimeへの変換ができずに、FormatExceptionという例外が発生しています。
こんな時は、TryParseExactを使用するとよいです。
使い方は以下。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | string text = "2019_07_09_120012"; string format = "yyyy_MM_dd_HHmmss"; DateTime time = new DateTime(); if (DateTime.TryParseExact(text, format, null, System.Globalization.DateTimeStyles.None, out time)) { // 変換OK Debug.WriteLine(time.ToString()); } else { // 変換NG Debug.WriteLine("NG"); } |
TryParseExactの戻り値がbool型になっていて、変換できる場合はtrue、できない場合はfalseが返る仕様となっています。
そのため、変換できなくても例外が発生することなく処理できます。
基本的にはこのTryParseExactを使用するのが安全だと思います。
※ちなみに、2019/07/09 12:00:12のように通常形式の場合はTryParseやParseを使用してもDateTimeオブジェクトに変換することができます。
まとめ
- 日付・時間のDateTimeを文字列に変換するには書式指定子を使う!
- 文字列をDateTimeに変換するには、TryParseEactを使う!