DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

日時(DateTimeオブジェクト)を文字列に変換する

ここではDateTimeオブジェクトを書式化された文字列に変換する方法を紹介します。DateTimeだけでなく、DateTimeOffsetやTimeSpanに関する説明も若干含まれています。

メソッドを使用する

DateTimeオブジェクトを文字列に変換するには、ToStringメソッドを使います。DateTimeではToStringの他に、ToShortDateString、ToLongDateString、ToShortTimeString、ToLongTimeStringメソッドで文字列に変換することもできます。

これらのメソッドの違いを以下に示します。

メソッド 説明
ToString 日付と時刻の一般的な書式 2002/05/12 20:30:15
ToShortDateString 短い形式の日付 2002/05/12
ToLongDateString 長い形式の日付 2002年5月12日
ToShortTimeString 短い形式の時刻 20:30
ToLongTimeString 長い形式の時刻 20:30:15
VB.NET
コードを隠すコードを選択
Dim dt As DateTime = New DateTime(2002, 5, 12, 20, 30, 15, 123)

Console.WriteLine("ToString :{0}", dt.ToString())
'2002/05/12 20:30:15
Console.WriteLine("ToShortDateString :{0}", dt.ToShortDateString())
'2002/05/12
Console.WriteLine("ToLongDateString :{0}", dt.ToLongDateString())
'2002年5月12日
Console.WriteLine("ToShortTimeString :{0}", dt.ToShortTimeString())
'20:30
Console.WriteLine("ToLongTimeString :{0}", dt.ToLongTimeString())
'20:30:15
C#
コードを隠すコードを選択
DateTime dt = new DateTime(2002, 5, 12, 20, 30, 15, 123);

Console.WriteLine("ToString :{0}", dt.ToString());
//2002/05/12 20:30:15
Console.WriteLine("ToShortDateString :{0}", dt.ToShortDateString());
//2002/05/12
Console.WriteLine("ToLongDateString :{0}", dt.ToLongDateString());
//2002年5月12日
Console.WriteLine("ToShortTimeString :{0}", dt.ToShortTimeString());
//20:30
Console.WriteLine("ToLongTimeString :{0}", dt.ToLongTimeString());
//20:30:15

書式を指定して日時を文字列に変換する

さらに、書式を指定してDateTimeオブジェクトを文字列に変換することもできます。書式を指定するには、ToStringメソッドのパラメータに書式を文字列で渡します。

日時を文字列に変換する時に使用できる書式の文字列は、「日時書式指定文字列」と呼びます。また、日時書式指定文字列は、「標準の日時書式指定文字列」と「カスタム日時書式指定文字列」に分けることができます。

標準の日時書式指定文字列は、アルファベット1文字で表され、すでに定義されている決まった書式に従って文字列に変換します。例えば、"F"という書式を使うと、ToLongDateStringとToLongTimeStringメソッドが返す文字列を空白文字で繋げたような文字列に変換されます。

カスタム日時書式指定文字列は、複数の書式指定子(特別な意味のある文字)を組み合わせて作ることができます。よって、カスタム日時書式指定文字列はより複雑な書式を記述できます。

日時書式指定文字列を使用してDataTimeオブジェクトを文字列に変換する簡単な例を示します。

VB.NET
コードを隠すコードを選択
Dim dt As New DateTime(2000, 5, 12, 20, 30, 15, 123)

Console.WriteLine(dt.ToString("F"))
'2000年5月12日 20:30:15
Console.WriteLine(dt.ToString("gyyyy年MM月dd日(dddd)"))
'西暦2000年05月12日(金曜日)
Console.WriteLine(dt.ToString("tthh時mm分ss秒fffミリ秒"))
'午後08時30分15秒123ミリ秒
C#
コードを隠すコードを選択
DateTime dt = new DateTime(2000, 5, 12, 20, 30, 15, 123);

Console.WriteLine(dt.ToString("F"));
//2000年5月12日 20:30:15
Console.WriteLine(dt.ToString("gyyyy年MM月dd日(dddd)"));
//西暦2000年05月12日(金曜日)
Console.WriteLine(dt.ToString("tthh時mm分ss秒fffミリ秒"));
//午後08時30分15秒123ミリ秒

日時書式指定文字列については下でさらに詳しく説明しますが、MSDNでは以下のページで説明されていますので、そちらも参考にしてください。

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

以下に、標準の日時書式指定文字列で使用できる書式指定子を表にまとめます。

書式指定子 名前 説明 例 (ja-JP) 例 (en-US)
d 短い形式の日付パターン ToShortDateStringメソッドと同じ 2002/05/12 5/12/2002
D 長い形式の日付パターン ToLongDateStringメソッドと同じ 2002年5月12日 Friday, May 12, 2002
t 短い形式の時刻パターン ToShortTimeStringメソッドと同じ 20:30 8:30 PM
T 長い形式の時刻パターン ToLongTimeStringメソッドと同じ 20:30:15 8:30:15 PM
f 完全な日付と時刻のパターン (短い形式の時刻) D と t を空白で区切って組み合わせる 2002年5月12日 20:30 Friday, May 12, 2002 8:30 PM
F 完全な日付と時刻のパターン (長い形式の時刻) D と T を空白で区切って組み合わせる 2002年5月12日 20:30:15 Friday, May 12, 2002 8:30:15 PM
g 一般の日付と時刻のパターン (短い形式の時刻) d と t を空白で区切って組み合わせる 2002/05/12 20:30 5/12/2002 8:30 PM
G 一般の日付と時刻のパターン (長い形式の時刻) d と T を空白で区切って組み合わせる 2002/05/12 20:30:15 5/12/2002 8:30:15 PM
Y または y 年月パターン 2002年5月 May, 2002
m または M 月日パターン 5月12日 May 12
r または R RFC1123 パターン RFC1123に準拠しており、カルチャに依存しない Sun, 12 May 2002 20:30:15 GMT Sun, 12 May 2002 20:30:15 GMT
O または o ラウンド トリップする日付と時刻のパターン ISO 8601に準拠しており、カルチャに依存しない
.NET Framework 2.0以降でサポート
2002-05-12T20:30:15.1230000 2002-05-12T20:30:15.1230000
s 並べ替え可能な日付と時刻のパターン (ISO 8601 準拠) ISO 8601に準拠しており、カルチャに依存しない 2002-05-12T20:30:15 2002-05-12T20:30:15
u 並べ替え可能な日付と時刻のパターン (世界時刻) カルチャに依存しない
ToUniversalTimeメソッドなどで世界協定時刻 (UTC) に変換してからこの書式を使う
2002-05-12 20:30:15Z 2002-05-12 20:30:15Z
U 完全な日付と時刻のパターン (世界時刻) F と同じ書式だが、こちらは UTC 変換される
DateTimeOffset 型ではサポートしない
2002年5月12日 11:30:15 Sunday, May 12, 2002 11:30:15 AM
その他の 1 文字 (未定義の指定子) FormatException をスローする
補足:標準の日時書式指定文字列は、以下に紹介するカスタム日時書式指定文字列のエイリアスです。つまり、標準の日時書式指定文字列を使うということは、そのエイリアスのカスタム日時書式指定文字列を使うことと同じです。どのようなカスタム日時書式指定文字列が使われるかは、カルチャによって変わる場合と変わらない場合があります。カルチャによって変わる場合は、エイリアスとなるカスタム日時書式指定文字列はCultureInfo.DateTimeFormatプロパティに定義されています。具体的には、「標準の日付と時刻の書式指定文字列」をご覧ください。

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

以下に、カスタム日時書式指定文字列で使用できる書式指定子を表にまとめます。

書式指定子 説明 補足 例 (ja-JP) 例 (en-US)
g, gg (任意の数の g 指定子を追加可能) 年代または紀元 西暦 A.D.
y 年の下1桁または2桁 (0〜99) 1桁の時でも左側に0が入らない 2 2
yy 年の下2桁 (00〜99) 1桁の時は左側に0が入る 02 02
yyy 年の下3桁以上 3桁未満の時は左側に0が入る
.NET Framework 2.0以降でサポート
2002 2002
yyyy 年の下4桁 4桁未満の時は左側に0が入る 2002 2002
yyyyy (任意の数の y 指定子を追加可能) 年の下5桁 5桁未満の時は左側に0が入る
.NET Framework 2.0以降でサポート
02002 02002
M 月 (1〜12) 1桁の時でも左側に0が入らない 5 5
MM 月 (01〜12) 1桁の時は左側に0が入る 05 05
MMM 月の省略名 5 May
MMMM 月の完全な名前 5月 May
d 日にち (1〜31) 1桁の日にちでも左側に0が入らない 12 12
dd 日にち (01〜31) 1桁の時は左側に0が入る 12 12
ddd 曜日の省略名 Sun
dddd (任意の数の d 指定子を追加可能) 曜日の完全な名前 日曜日 Sunday
t AM/PMの最初の文字 カルチャが"ja-JP"の時は午前も午後も「午」になるため、役に立たない P
tt, tt (任意の数の t 指定子を追加可能) AM/PM 午後 PM
H 時間 (0〜23) 1桁の時でも左側に0が入らない 20 20
HH, HH (任意の数の H 指定子を追加可能) 時間 (00〜23) 1桁の時は左側に0が入る 20 20
h 時間 (1〜12) 午前と午後は区別できない
1桁の時でも左側に0が入らない
8 8
hh, hh (任意の数の h 指定子を追加可能) 時間 (01〜12) 午前と午後は区別できない
1桁の時は左側に0が入る
08 08
m 分 (0〜59) 1桁の時でも左側に0が入らない 30 30
mm, mm (任意の数の m 指定子を追加可能) 分 (00〜59) 1桁の時は左側に0が入る 30 30
s 秒 (0〜59) 1桁の時でも左側に0が入らない 15 15
ss, ss (任意の数の s 指定子を追加可能) 秒 (00〜59) 1桁の時は左側に0が入る 15 15
f 1/10秒 0 の時は"0"となる(以下の ff... も f の数だけ 0 を表示) 1 1
ff 1/100秒 12 12
fff 1/1000秒 123 123
ffff 1/10000秒 1230 1230
fffff 1/100000秒 12300 12300
ffffff 1/1000000秒 123000 123000
fffffff 1/10000000秒 1230000 1230000
F 1/10秒 0 の時は何も表示しない(以下の FF... も同じ) 1 1
FF 1/100秒 右側に 0 があっても表示しない(以下の FFF... も同じ) 12 12
FFF 1/1000秒 123 123
FFFF 1/10000秒 123 123
FFFFF 1/100000秒 123 123
FFFFFF 1/1000000秒 123 123
FFFFFFF 1/10000000秒 123 123
K タイム ゾーン情報 DateTimeの場合は、Kindプロパティの値によって定義が異なる。Localなら「zzz」に相当。Utcなら「Z」。Unspecifiedなら空文字。
DateTimeOffsetの場合は、「zz」に相当。
.NET Framework 2.0以降でサポート
z UTCを基準とするオフセット(時間単位) DateTimeの場合は、OSのローカルタイムゾーンのUTCを基準とした符号付きオフセット(時間単位)
DateTimeOffsetの場合は、DateTimeOffset値の、UTCを基準とするオフセット(時間単位)
1桁の時でも左側に0が入らない
+9 +9
zz UTCを基準とするオフセット(時間単位) z と同じだが、1桁の時は左側に0が入る +09 +09
zzz, zzz (任意の数の z 指定子を追加可能) UTCを基準とするオフセット(時間および分単位) zz と同じだが、時間および分単位 +09:00 +09:00
:
/
区切り記号 カルチャによって変わる : :
'string'
"string"
文字列リテラル シングルクォートまたはダブルクオートで囲まれた文字列はそのまま表示される
%c カスタム書式指定子を単独で使用する カスタム日時書式指定文字列を単独で使っても標準の日時書式指定文字列とならないようにする
例えば、"%d"とすれば日にちの書式となる
\c エスケープ文字 書式指定子をエスケープする
その他の文字 その他の文字はそのまま表示される

カルチャを指定する

日時を文字列に変換する時、その結果は現在のカルチャによって変わります。さらに詳しく言えば、日時をどのような文字列に変換するかという定義は、現在のカルチャのCultureInfo.DateTimeFormatプロパティで決まります。

ToStringメソッドで文字列を変換する場合はパラメータにIFormatProviderを指定することができるため、現在のカルチャを変更しなくても、指定したカルチャを使って変換できます。

カルチャを en-US にしてDataTimeを文字列に変換する例を以下に示します。

VB.NET
コードを隠すコードを選択
Dim dt As New DateTime(2000, 5, 12, 20, 30, 15, 123)

'カルチャを en-US にしてDataTimeを文字列に変換する
Dim ci As New System.Globalization.CultureInfo("en-US")
Console.WriteLine(dt.ToString("F", ci))
'Friday, May 12, 2000 8:30:15 PM
C#
コードを隠すコードを選択
DateTime dt = new DateTime(2000, 5, 12, 20, 30, 15, 123);

//カルチャを en-US にしてDataTimeを文字列に変換する
System.Globalization.CultureInfo ci =
    new System.Globalization.CultureInfo("en-US");
Console.WriteLine(dt.ToString("F", ci));
//Friday, May 12, 2000 8:30:15 PM

和暦で表示する(年号を表示する)

「昭和62年」のように年号を使った和暦で表示するには、カルチャを日本語(ja-JP)にします。設定によってはこれだけで和暦表示されることもありますが、大抵はそうなりません(詳しくは後述)。DateTimeFormatInfo.CalendarプロパティJapaneseCalendarオブジェクトを設定すれば、設定に関わらず和暦表示できます。

VB.NET
コードを隠すコードを選択
'和暦でDataTimeを文字列に変換する
Dim ci As New System.Globalization.CultureInfo("ja-JP", False)
ci.DateTimeFormat.Calendar = New System.Globalization.JapaneseCalendar()

Console.WriteLine(dt.ToString("gy年MM月dd日(dddd)", ci))
'平成12年05月12日(金曜日)

Console.WriteLine(dt.ToString("D", ci))
'平成 12年5月12日

Console.WriteLine(dt.ToString("d", ci))
'平成 12/5/12

Console.WriteLine(dt.ToString("Y", ci))
'平成 12年5月
C#
コードを隠すコードを選択
DateTime dt = new DateTime(2000, 5, 12, 20, 30, 15, 123);

//和暦でDataTimeを文字列に変換する
System.Globalization.CultureInfo ci =
    new System.Globalization.CultureInfo("ja-JP", false);
ci.DateTimeFormat.Calendar = new System.Globalization.JapaneseCalendar();

Console.WriteLine(dt.ToString("gy年MM月dd日(dddd)", ci));
//平成12年05月12日(金曜日)

Console.WriteLine(dt.ToString("D", ci));
//平成 12年5月12日

Console.WriteLine(dt.ToString("d", ci));
//平成 12/5/12

Console.WriteLine(dt.ToString("Y", ci));
//平成 12年5月

この例のように、「g」という書式指定文字列で年号(元号)を、「y」という書式指定文字列で和暦の年を表示できます(「g」や「y」の数が違っても結果は同じようでした)。また、書式指定文字列「D」「d」「Y」などで表示される日付パターンも和暦で表示されます。これは、JapaneseCalendarを指定したことにより、DateTimeFormatInfo.LongDatePatternプロパティが「gg y'年'M'月'd'日'」に、ShortDatePatternプロパティが「gg y/M/d」に、YearMonthPatternプロパティが「gg y'年'M'月'」に変わったためです。

上の例ではCultureInfoのコンストラクタの2番目のパラメータに「false」を指定していますが、このようにするとCultureInfoのUseUserOverrideプロパティがfalseに設定されます。指定しない時は、trueになります。CultureInfoのUseUserOverrideプロパティがtrueで、OSの現在のカルチャと互換性がある場合は、ユーザーが「コントロールパネル」で設定した値の一部を使用してCultureInfoを作成します。falseの場合はユーザーの設定を使用しません。

この例ではDateTimeFormatInfo.Calendarプロパティに直接JapaneseCalendarを設定しているため、UseUserOverrideがtrueでもfalseでも和暦で表示できます。ちなみにコントロールパネルの設定で和暦を使用するようにしている時は、UseUserOverrideをtrueにすると、JapaneseCalendarを指定しなくても和暦で表示できます。

「ja-JP」以外のカルチャでもJapaneseCalendarを指定できるかというと、たぶんダメです。カルチャに指定できるCalendarは決まっており、CultureInfo.OptionalCalendarsプロパティで返される配列に含まれるCalendarだけです。ちなみに「ja-JP」の場合は、GregorianCalendarとJapaneseCalendarだけです。

JapaneseCalendarがサポートしている最も古い時刻は「1868/09/08 0:00:00」ですので、それ以前の時刻には対応していません。

  • 履歴:
  • 2007/1/19 表を追加。
  • 2010/12/10 全面的に書き換える。
  • 2011/10/31 「和暦で表示する」を追加。表の例にen-USを追加。
  • 2012/5/16 「カスタム日時書式指定文字列」の「FF」の説明で、「左側に 0 があっても...」を「右側に 0 があっても...」に修正(コメントでご指摘いただいました)。

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • .NET Tipsをご利用いただく際は、注意事項をお守りください。