日付や時刻を文字列に変換するには?:.NET TIPS
DateTime構造体を介して得られる日付や時刻を、標準書式指定/カスタム書式指定文字列を使用して文字列に変更する方法を解説する(C# 6.0/VB 14対応)。
本稿は2004/08/27に初版公開、2004/09/02に改訂された記事を再改訂し、C# 6.0/Visual Basic 14(以下、VB 14)の補完文字列についての記述を追加したものです。また、本稿のコードは全てC# 6.0/VB 14で動作を確認しました。
.NET Frameworkのクラスライブラリでは、日付や時刻の情報は、DateTime構造体(System名前空間)を使って扱うことができる。本稿では、このDateTimeオブジェクトを指定した形式の文字列に変換するための基本的な方法について示す。
また、C# 6.0/VB 14では、「補間文字列」(interpolated string)という機能を使うことで、同じ内容のコードをより簡潔に記述することも可能だ。補間文字列を使用したコードを知りたい方はこちらを参照してほしい。
標準書式指定とカスタム書式指定
DateTime構造体には、日付や時刻の情報を文字列に変換するために、大きく次の三つの方法がある。
(1) ToLongDateString、ToLongTimeString、ToShortDateString、ToShortTimeStringなどのメソッドを呼び出す
(2) 標準書式指定文字列(d、D、t、T、f、F、g、Gなど)をパラメーターに指定して、ToStringメソッドを呼び出す
(3) カスタム書式指定文字列(後述)をパラメーターに指定して、ToStringメソッドを呼び出す
(1)に挙げたメソッドは、(2)の方法によるToString("D")、ToString("T")、ToString("d")、ToString("t")などの呼び出しを置き換えたにすぎない(標準書式指定文字列については、MSDNの「標準の日時書式指定文字列」を参照)。いずれにせよ、(1)と(2)の方法はカルチャ情報に依存した文字列が出力される。つまり、例えば、以下のコードを実行すると、その結果が日本語環境では「2004年8月24日 20:23:06」などになるが、英語環境では、これは「Tuesday, August 24, 2004 8:23:06 PM」といった値となる。
DateTime.Now.ToString("F")
カルチャ情報に依存した文字列表記は、単純に日時を画面に表示したい場合などには便利であるが、日時を文字列に変換してデータ項目の一つとして利用したいような場合(例えば、ファイル名として使用するために「20040824202306」という文字列を得たい場合)などには使えない。このような場合には、(3)のカスタム書式指定文字列による文字列変換を利用すると、その出力形式を自由に指定できる。
カスタム書式指定文字列による変換
カスタム書式指定文字列では、書式指定子の組み合わせにより、独自の出力形式でDateTimeオブジェクトを文字列に変換できる。例えば次の例では、その結果が「20040824202306」などとなる。
DateTime.Now.ToString("yyyyMMddHHmmss")
利用頻度が高いと思われる書式指定子を次にまとめた。
書式指定子 | 説明 | 出力例 |
---|---|---|
yyyy | 4けたの年 | 2004 |
yy | 0埋め2けたの年 | 04 |
MM | 0埋め2けたの月 | 08 |
dd | 0埋め2けたの日 | 24 |
ddd | 曜日の省略名(カルチャに依存) | 火 |
dddd | 曜日の完全名(カルチャに依存) | 火曜日 |
HH | 0埋め2けたの時間(24時間表記) | 20 |
hh | 0埋め2けたの時間(12時間表記) | 08 |
mm | 0埋め2けたの分 | 23 |
ss | 0埋め2けたの秒 | 06 |
利用頻度が高いと思われる書式指定子 |
ここでは固定幅で出力可能な書式指定子のみを挙げている(書式指定子の完全な一覧は、MSDNの「カスタム日時書式指定文字列」などを参照)。
上表の中では、月が「MM」、分が「mm」と、どちらも同じ「エム」であることに注意が必要だ。
なお、曜日に置き換わる「ddd」および「dddd」の二つはカルチャ情報に依存している。例えば「火曜日」は、英語環境では「Tue」および「Tuesday」となる。
カスタム書式指定文字列を使用したサンプルプログラム
上記の書式指定子を使用してDateTimeオブジェクトを文字列に変換している簡単なサンプルプログラムを次に示す。
// customdate.cs
using System;
public class CustomDateTime {
static void Main() {
DateTime now = DateTime.Now;
Console.WriteLine(now); // 出力例:2004/08/24 20:23:06
Console.WriteLine(now.ToString("yyyy/MM/dd HH:mm:ss"));
Console.WriteLine(now.ToString("yyyyMMddHHmmss"));
Console.WriteLine(now.ToString("yy年MM月dd日(ddd)"));
Console.WriteLine(now.ToString("hh時mm分ss秒"));
// 出力例:
// 2004/08/24 20:23:06
// 20040824202306
// 04年08月24日(火)
// 08時23分06秒
Console.WriteLine("{0:yyyy/MM/dd HH:mm:ss}", now);
Console.WriteLine("{0:yyyyMMddHHmmss}", now);
Console.WriteLine(
"{0:yy年MM月dd日(dddd)} {0:hh時mm分ss秒}", now);
// 出力例:
// 2004/08/24 20:23:06
// 20040824202306
// 04年08月24日(火曜日) 08時23分06秒
}
}
// コンパイル方法:csc customdate.cs
customdate.csファイルのダウンロードはこちらから。
' customdate.vb
Imports System
Public Class CustomDateTime
Shared Sub Main()
Dim now As DateTime = DateTime.Now
Console.WriteLine(now) ' 出力例:2004/08/24 20:23:06
Console.WriteLine(now.ToString("yyyy/MM/dd HH:mm:ss"))
Console.WriteLine(now.ToString("yyyyMMddHHmmss"))
Console.WriteLine(now.ToString("yy年MM月dd日(ddd)"))
Console.WriteLine(now.ToString("hh時mm分ss秒"))
' 出力例:
' 2004/08/24 20:23:06
' 20040824202306
' 04年08月24日(火)
' 08時23分06秒
Console.WriteLine("{0:yyyy/MM/dd HH:mm:ss}", now)
Console.WriteLine("{0:yyyyMMddHHmmss}", now)
Console.WriteLine( _
"{0: yy年MM月dd日(dddd)} {0:hh時mm分ss秒}", now)
' 出力例:
' 2004/08/24 20:23:06
' 20040824202306
' 04年08月24日(火曜日) 08時23分06秒
End Sub
End Class
' コンパイル方法:vbc customdate.vb
customdate.vbファイルのダウンロードはこちらから。
各サンプルプログラムの後半は、書式指定項目(インデックス付きのプレースホルダー)を使用した例である(書式指定項目についての詳細はMSDNの「複合書式指定」を参照)。
なお、独自形式により出力された日時文字列をDateTimeオブジェクトに変換する方法については「.NET TIPS:日付や時刻の文字列をDateTimeオブジェクトに変換するには?」で示している。
C# 6.0/VB 14で追加された補間文字列機能を使用する
C# 6.0/VB 14では「補間文字列」を使用することで、より簡潔な記述で、DateTime構造体を文字列に変換できる。
補間文字列は先の例の後半で使用している複合書式指定における書式指定項目のインデックス(「{0}」「{1}」における「0」「1」など)の部分に直接、変数や式などを記述するものだと考えると分かりやすい。また、文字列の先頭には「$」記号を付加する。
$"字面通りに表示されるテキスト { 補間式, 文字列の幅:書式指定子} ……"
「字面通りに表示されるテキスト」「文字列の幅」「書式指定子」は省略可能。補間式に指定した要素が評価され、その結果が文字列に埋め込まれる。
「,文字列の幅」には文字列の幅を、「:書式指定子」には上で見た標準書式指定文字列あるいはカスタム書式指定文字列を指定できる(「文字列の幅」「書式指定子」のいずれも省略可能)。
例えば標準書式指定文字列の「F」(完全な日付と時刻のパターン。長い形式の時刻)を使用して、現在の時刻をコンソールに表示するには次のようにする。
var now = DateTime.Now;
Console.WriteLine($"{now:F}");
Dim now = DateTime.Now
Console.WriteLine($"{now:F}")
カスタム書式指定文字列を指定した場合の例は次のようになる。
var now = DateTime.Now;
Console.WriteLine($"{now:yyyyMMddHHmmss}");
Dim now = DateTime.Now
Console.WriteLine($"{now:yyyyMMddHHmmss}")
これは「カスタム書式指定文字列による変換」の冒頭で見た書式指定子をそのまま使っている。
よって、上のサンプルプログラムは次のように書き換えられる(なお、補間文字列を使用した場合、ToStringメソッドは不要になるので、上のサンプルプログラムと全く同じわけではないことに注意。書式指定文字列が異なるものだけをピックアップしてある)。
// interpolateddate.cs
using System;
public class CustomDateTime {
static void Main() {
DateTime now = DateTime.Now;
Console.WriteLine(now); // 出力例:2004/08/24 20:23:06
Console.WriteLine(now.ToString($"{now:yyyy/MM/dd HH:mm:ss}"));
Console.WriteLine(now.ToString($"{now:yyyyMMddHHmmss}"));
Console.WriteLine(now.ToString($"{now:yy年MM月dd日(ddd)}"));
Console.WriteLine(now.ToString($"{now:hh時mm分ss秒}"));
Console.WriteLine(
$"{now:yy年MM月dd日(dddd)} {now:hh時mm分ss秒}");
// 出力例:
// 2004/08/24 20:23:06
// 20040824202306
// 04年08月24日(火)
// 08時23分06秒
// 04年08月24日(火曜日) 08時23分06秒
}
}
// コンパイル方法:csc interpolateddate.cs
' interpolateddate.vb
Imports System
Public Class CustomDateTime
Shared Sub Main()
Dim now As DateTime = DateTime.Now
Console.WriteLine(now) ' 出力例:2004/08/24 20:23:06
Console.WriteLine(now.ToString($"{now:yyyy/MM/dd HH:mm:ss}"))
Console.WriteLine(now.ToString($"{now:yyyyMMddHHmmss}"))
Console.WriteLine(now.ToString($"{now:yy年MM月dd日(ddd)}"))
Console.WriteLine(now.ToString($"{now:hh時mm分ss秒}"))
Console.WriteLine( _
$"{now:yy年MM月dd日(dddd)} {now:hh時mm分ss秒}")
' 出力例:
' 2004/08/24 20:23:06
' 20040824202306
' 04年08月24日(火)
' 08時23分06秒
' 04年08月24日(火曜日) 08時23分06秒
End Sub
End Class
' コンパイル方法:vbc interpolateddate.vb
余談だが、上記のコードで変数nowに現在時刻を入れているが、補間文字列の補間式には次のように任意の式を記述してもよい(ただし、時間の扱いを厳密にするのであれば、上のサンプルコードのように一度変数に現在時刻を保存しておくべきである)。ここではコード例はC#のみとする。
Console.WriteLine($"{DateTime.Now:yyyy/MM/dd HH:mm:ss}");
カテゴリ:クラス・ライブラリ 処理対象:文字列
カテゴリ:クラス・ライブラリ 処理対象:日付と時刻
使用ライブラリ:DateTime構造体(System名前空間)
関連TIPS:日付や時刻の文字列をDateTimeオブジェクトに変換するには?
■更新履歴
【2015/11/24】C# 6.0/VB(Visual Basic) 14の補間文字列に対応した記述を追加しました。
【2004/09/02】関連TIPSとして「TIPS:日付や時刻の文字列をDateTimeオブジェクトに変換するには?」についての記述を追加しました。
【2004/08/27】初版公開。
Copyright© Digital Advantage Corp. All Rights Reserved.