DOBON.NET

日時(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/125/12/2002
D長い形式の日付パターンToLongDateStringメソッドと同じ2002年5月12日Friday, May 12, 2002
t短い形式の時刻パターンToShortTimeStringメソッドと同じ20:308:30 PM
T長い形式の時刻パターンToLongTimeStringメソッドと同じ20:30:158:30:15 PM
f完全な日付と時刻のパターン (短い形式の時刻)D と t を空白で区切って組み合わせる2002年5月12日 20:30Friday, May 12, 2002 8:30 PM
F完全な日付と時刻のパターン (長い形式の時刻)D と T を空白で区切って組み合わせる2002年5月12日 20:30:15Friday, May 12, 2002 8:30:15 PM
g一般の日付と時刻のパターン (短い形式の時刻)d と t を空白で区切って組み合わせる2002/05/12 20:305/12/2002 8:30 PM
G一般の日付と時刻のパターン (長い形式の時刻)d と T を空白で区切って組み合わせる2002/05/12 20:30:155/12/2002 8:30:15 PM
Y または y年月パターン2002年5月May, 2002
m または M月日パターン5月12日May 12
r または RRFC1123 パターンRFC1123に準拠しており、カルチャに依存しないSun, 12 May 2002 20:30:15 GMTSun, 12 May 2002 20:30:15 GMT
O または oラウンド トリップする日付と時刻のパターンISO 8601に準拠しており、カルチャに依存しない
.NET Framework 2.0以降でサポート
2002-05-12T20:30:15.12300002002-05-12T20:30:15.1230000
s並べ替え可能な日付と時刻のパターン (ISO 8601 準拠)ISO 8601に準拠しており、カルチャに依存しない2002-05-12T20:30:152002-05-12T20:30:15
u並べ替え可能な日付と時刻のパターン (世界時刻)カルチャに依存しない
ToUniversalTimeメソッドなどで世界協定時刻 (UTC) に変換してからこの書式を使う
2002-05-12 20:30:15Z2002-05-12 20:30:15Z
U完全な日付と時刻のパターン (世界時刻)F と同じ書式だが、こちらは UTC 変換される
DateTimeOffset 型ではサポートしない
2002年5月12日 11:30:15Sunday, 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が入らない22
yy年の下2桁 (00~99)1桁の時は左側に0が入る0202
yyy年の下3桁以上3桁未満の時は左側に0が入る
.NET Framework 2.0以降でサポート
20022002
yyyy年の下4桁4桁未満の時は左側に0が入る20022002
yyyyy (任意の数の y 指定子を追加可能)年の下5桁5桁未満の時は左側に0が入る
.NET Framework 2.0以降でサポート
0200202002
M月 (1~12)1桁の時でも左側に0が入らない55
MM月 (01~12)1桁の時は左側に0が入る0505
MMM月の省略名5May
MMMM月の完全な名前5月May
d日にち (1~31)1桁の日にちでも左側に0が入らない1212
dd日にち (01~31)1桁の時は左側に0が入る1212
ddd曜日の省略名Sun
dddd (任意の数の d 指定子を追加可能)曜日の完全な名前日曜日Sunday
tAM/PMの最初の文字カルチャが"ja-JP"の時は午前も午後も「午」になるため、役に立たないP
tt, tt (任意の数の t 指定子を追加可能)AM/PM午後PM
H時間 (0~23)1桁の時でも左側に0が入らない2020
HH, HH (任意の数の H 指定子を追加可能)時間 (00~23)1桁の時は左側に0が入る2020
h時間 (1~12)午前と午後は区別できない
1桁の時でも左側に0が入らない
88
hh, hh (任意の数の h 指定子を追加可能)時間 (01~12)午前と午後は区別できない
1桁の時は左側に0が入る
0808
m分 (0~59)1桁の時でも左側に0が入らない3030
mm, mm (任意の数の m 指定子を追加可能)分 (00~59)1桁の時は左側に0が入る3030
s秒 (0~59)1桁の時でも左側に0が入らない1515
ss, ss (任意の数の s 指定子を追加可能)秒 (00~59)1桁の時は左側に0が入る1515
f1/10秒0 の時は"0"となる(以下の ff... も f の数だけ 0 を表示)11
ff1/100秒1212
fff1/1000秒123123
ffff1/10000秒12301230
fffff1/100000秒1230012300
ffffff1/1000000秒123000123000
fffffff1/10000000秒12300001230000
F1/10秒0 の時は何も表示しない(以下の FF... も同じ)11
FF1/100秒右側に 0 があっても表示しない(以下の FFF... も同じ)1212
FFF1/1000秒123123
FFFF1/10000秒123123
FFFFF1/100000秒123123
FFFFFF1/1000000秒123123
FFFFFFF1/10000000秒123123
Kタイム ゾーン情報DateTimeの場合は、Kindプロパティの値によって定義が異なる。Localなら「zzz」に相当。Utcなら「Z」。Unspecifiedなら空文字。
DateTimeOffsetの場合は、「zz」に相当。
.NET Framework 2.0以降でサポート
zUTCを基準とするオフセット(時間単位)DateTimeの場合は、OSのローカルタイムゾーンのUTCを基準とした符号付きオフセット(時間単位)
DateTimeOffsetの場合は、DateTimeOffset値の、UTCを基準とするオフセット(時間単位)
1桁の時でも左側に0が入らない
+9+9
zzUTCを基準とするオフセット(時間単位)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をご利用いただく際は、注意事項をお守りください。
共有する

この記事への評価

この記事へのコメント

この記事に関するコメントを投稿するには、下のボタンをクリックしてください。投稿フォームへ移動します。通常のご質問、ご意見等は掲示板へご投稿ください。