ここでは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 |
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
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オブジェクトを文字列に変換する簡単な例を示します。
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ミリ秒
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を文字列に変換する例を以下に示します。
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
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オブジェクトを設定すれば、設定に関わらず和暦表示できます。
'和暦で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月
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」ですので、それ以前の時刻には対応していません。
注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。