C# Programming

Image

日時のフォーマット

開発環境: Visual Studio 2003

1.目次

2.目的

日付のフォーマットについて説明します。

3.参考書

(1) MSDN
(2) カルチャ名(ex: ja-JP)

4.書式指定で日時を出力する。

例えば、フルフォーマットでプリントする場合には、次のように {0:f} でフォーマット付で呼び出します。
Console.WriteLine("{0:f}", time1);

あるいは、

string str = System.DateTime.Now.ToString("D");
Console.WriteLine( "str" );

というように出力できます。
注意
このフォーマットは、コントロールパネル→地域と言語のオプション→地域オプションに依存しています。
下図の【長い形式】のところを見ると、2002年xxxもしくは平成xxxxというように表示されていると思いますが、ここでPCのロケールがセットされており、このロケールによって 結果が異なってきます。

Image

Image

次の表に、デフォルトの西暦表示の場合と、和暦を指定した場合の表示の違いについて示しています。
フォーマットも、上の図の短い形式、長い形式のフォーマットの選択によって、異なってきます。
また、西暦(英語)と、西暦(日本語)でも異なってきますので、注意が必要です。
フォーマットとロケールと表示の関係を下図で見てください。赤字が、表示が異なってくるものです。
FormatsFormat
Character
西暦(日本語)設定西暦(英語)設定和暦設定
Short date pattern.
d  
2002/04/012002/04/0114/04/01
dd 01 01 01
dddMon
dddd月曜日Monday月曜日
Long date pattern. D西暦 02年04月01日 月曜日A.D. 2年4月1日 Monday平成 14年4月1日 月曜日
Full (long date + short time).f西暦 02年04月01日 月曜日 13:23A.D. 2年4月1日 Monday 13:23平成 14年4月1日 月曜日 13:23
ff000000
fff000000000
ffff000000000000
fffff000000000000000
ffffff000000000000000000
fffffff000000000000000000000
hour in a 12-hour clock
at 2002/4/1 13:02:56
hh 010101
hour in a 24-hour clock
at 2002/4/1 13:02:56
HH 131313
mm232323
hhmm012301230123
hhmmss 012345012345012345
Full date/time pattern
(long date + long time).
F 西暦 02年04月01日 月曜日 13:23:45A.D. 2年4月1日 Monday 13:23:45平成 14年4月1日 月曜日 13:23:45
General (short date + short time)..g2002/04/01 13:232002/04/01 13:2314/04/01 13:23
gg西暦A.D.平成
gggg西暦A.D.平成
General (short date + long time). G2002/04/01 13:23:452002/04/01 13:23:4514/04/01 13:23:45
Full date/time pattern
(long date + long time).
m4月1日April 014月1日
Month day pattern.M4月1日April 014月1日
MM04 0404
MMM4 Apr4
MMMM4月April4月
RFC1123 pattern.rMon, 01 Apr 2002 13:23:45 GMTMon, 01 Apr 2002 13:23:45 GMTMon, 01 Apr 2002 13:23:45 GMT
Sortable date/time pattern;
conforms to ISO 8601.
s2002-04-01T13:23:452002-04-01T13:23:452002-04-01T13:23:45
ss454545
sss454545
Short time pattern.t13:2313:2313:23
Long time pattern.T13:23:4513:23:4513:23:45
Universal sortable date patternu2002-04-01 13:23:45Z2002-04-01 13:23:45Z2002-04-01 13:23:45Z
Universal sortable date/time patternU西暦 02年04月01日 月曜日 4:23:45A.D. 2年4月1日 Monday 4:23:45西暦 2年4月1日 月曜日 4:23:45
timezone offset (hour only).y2002年4月April, 2002平成 14年4月
yy020214
yyy2002200214
yyyy2002200214
yyyyy020020200214
yyyyyy00200200200214
Year month pattern.z+92 +92 +914
zz+09+09+09
zzz+09:00+09:00+09:00
Year month pattern.Y2002年4月April, 2002平成 14年4月
Separators./ and :02/04/01 01:23:4502/04/01 01:23:4514/04/01 01:23:45
Quoted string.' 2002/04月の01日よーん 01:23:452002/04月の01日よーん 01:23:4514/04月の01日よーん 01:23:45
" 2002/04月の01日よーん 01:23:452002/04月の01日よーん 01:23:4514/04月の01日よーん 01:23:45

5.地域と言語の設定によらない日時表示の方法

地域と言語の設定によって、日時表示が自動的に変わる場合は上記の方法でよいでしょう。
しかし、例えば自動車免許のように必ず元号表示しなければならない場合には、どうすればよいでしょうか。

まずは、現在のカルチャー情報を調べて見ましょう。
次のコードを実行してみてください。

CultureInfo currentCulture = Thread.CurrentThread.CurrentCulture;
Console.WriteLine("CurrentCulture.Name = {0}", currentCulture.Name);
Console.WriteLine("CurrentCulture.DisplayName = {0}", currentCulture.DisplayName);
Console.WriteLine("CurrentCulture.DateTimeFormat.LongDatePattern = {0}", currentCulture.DateTimeFormat.LongDatePattern.ToString());
Console.WriteLine("CurrentCulture.DateTimeFormat.Calendar = {0}", currentCulture.DateTimeFormat.Calendar.ToString());

西暦(日本語)、西暦(英語)、和暦で、次のように異なっています。
カレンダーカレンダータイプ
西暦(日本語)System.Globalization.GregorianCalendarLocalized
西暦(英語)System.Globalization.GregorianCalendarUSEnglish
和暦System.Globalization.JapaneseCalendar-
したがって、強制的にカレンダーの表示を変えるには、カルチャーのカレンダー情報を適切に変える必要があります。
ただし、カレントスレッドのカルチャー自体は変えられないので、DateTime.ToString(string, IFormatProvider);
で、カルチャーを指定して、文字列に変更します。
このために、CultureInfo のクローンを作って、(多分、new より早い)、そこにカレンダーをセットします。
具体的には、以下のコードを見たほうが早いでしょう。
西暦(日本語)表示
CultureInfo culture = null;
DateTime now = System.DateTime.Now;

// カルチャーのクローンを作る。new より早い。
culture = (CultureInfo)(Thread.CurrentThread.CurrentCulture.Clone());

// 西暦(日本語)表示にする。
GregorianCalendar gregLocalCal = new System.Globalization.GregorianCalendar();
gregLocalCal.CalendarType = GregorianCalendarTypes.Localized;
culture.DateTimeFormat.Calendar = gregLocalCal;
Console.WriteLine("西暦(日本語)表示: " + now.ToString("F", culture));
西暦(英語)表示
CultureInfo culture = null;
DateTime now = System.DateTime.Now;

// カルチャーのクローンを作る。new より早い。
culture = (CultureInfo)(Thread.CurrentThread.CurrentCulture.Clone());

// 西暦(英語)表示にする。
GregorianCalendar gregUSCal = new System.Globalization.GregorianCalendar();
gregUSCal.CalendarType = GregorianCalendarTypes.USEnglish;
culture.DateTimeFormat.Calendar = gregUSCal;
Console.WriteLine("西暦(英語)表示 : " + now.ToString("F", culture));
西暦(日本語)表示
CultureInfo culture = null;
DateTime now = System.DateTime.Now;

// カルチャーのクローンを作る。new より早い。
culture = (CultureInfo)(Thread.CurrentThread.CurrentCulture.Clone());

// 和暦表示にする。
Calendar jpCal = new System.Globalization.JapaneseCalendar();
culture.DateTimeFormat.Calendar = jpCal;
Console.WriteLine("和暦表示 : " + now.ToString("F", culture));
台湾暦表示
CultureInfo culture = null;
DateTime now = System.DateTime.Now;

// カルチャーのクローンを作る。new より早い。
culture = (CultureInfo)(Thread.CurrentThread.CurrentCulture.Clone());

// 台湾暦
TaiwanCalendar twCal = new System.Globalization.TaiwanCalendar();
culture = new System.Globalization.CultureInfo("zh-TW");
culture.DateTimeFormat.Calendar = twCal;
Console.WriteLine(culture.NativeName + " : " + now.ToString("F", culture));

実行結果は次のようになります。

無指定 : 2002年12月26日 2:48:31
西暦(日本語)表示: 2002年12月26日 2:48:31
西暦(英語)表示 : Thursday, December 26, 2002 2:48:31
和暦表示 : 平成 14年12月26日 2:48:31
中文(繁體) (台灣) : 91年12月26日 上午 02:48:31

6.文字列から DateTime へ変換する。


西暦文字列→DateTime
DateTime time1 = System.DateTime.Parse("2002/4/1 13:23:45");
Console.WriteLine("『2002/4/1 13:23:45』→DateTime : " + time1.ToString("F"));
和暦文字列→DateTime
Calendar jpCal = new System.Globalization.JapaneseCalendar();
CultureInfo culture = new CultureInfo("ja-JP");
culture.DateTimeFormat.Calendar = jpCal;
DateTime time2 = System.DateTime.Parse("平成 14年4月1日 月曜日 13:23:45");
Console.WriteLine("『平成 14年4月1日 月曜日 13:23:45』→DateTime : " + time2.ToString("F"));
注意: この例では、CultureInfo を "ja-JP"から作成しています。
RFC 1766 標準の "<languagecode2>-<country/regioncode2>" という形式に準拠しています。
たとえば、米国の英語は "en-US" となります。

7.テストコード

using System;
using System.Globalization;
using System.Threading;

namespace JapaneseCalendar
{
    /// <summary>
    /// Class1 の概要の説明です。
    /// </summary>
    class Class1
    {
        /// <summary>
        /// アプリケーションのメイン エントリ ポイントです。
        /// </summary>
        [STAThread]
        static void Main(string[] args)
        {
            //  
            TestFormat();
            // 
            TestCulture();
            // 
            ForceCulture();
            //
            ToDateTime();
            //
            Console.ReadLine();
        }

        static private void TestFormat()
        {
            Console.WriteLine("------------------------------------------------");
            Console.WriteLine("DateFormatを調べる");
            // Date Format
            // System.DateTime time1 = System.DateTime.Now;
            System.DateTime time1 = System.DateTime.Parse("2002/04/01 13:23:45");   // 西暦のテスト用
            // System.DateTime time1 = System.DateTime.Parse("14/04/01 13:23:45");  // 和暦のテスト用
            
            Console.WriteLine("\nShort date pattern.");
            Console.WriteLine("d\t = {0:d}", time1);
            Console.WriteLine("dd\t = {0:dd}", time1);
            Console.WriteLine("ddd\t = {0:ddd}", time1);
            Console.WriteLine("dddd\t = {0:dddd}", time1);

            Console.WriteLine("\nLong date pattern.");
            Console.WriteLine("D\t{0:D}", time1);

            Console.WriteLine("\nFull (long date + short time).");

            Console.WriteLine("f\t{0:f}", time1);
            Console.WriteLine("ff\t{0:ff}", time1);
            Console.WriteLine("fff\t{0:fff}", time1);
            Console.WriteLine("ffff\t{0:ffff}", time1);
            Console.WriteLine("fffff\t{0:fffff}", time1);
            Console.WriteLine("ffffff\t{0:ffffff}", time1);
            Console.WriteLine("ffffffff\t{0:fffffff}", time1);

            Console.WriteLine("\nhour in a 12-hour clock");
            Console.WriteLine("hh\t{0:hh}", time1);
            Console.WriteLine("\nhour in a 24-hour clock");
            Console.WriteLine("HH\t{0:HH}", time1);
            Console.WriteLine("mm\t{0:mm}", time1);
            Console.WriteLine("hhmm\t{0:hhmm}", time1);
            Console.WriteLine("hhmmss\t{0:hhmmss}", time1);

            Console.WriteLine("\nFull date/time pattern (long date + long time).");
            Console.WriteLine("F\t{0:F}", time1);

            Console.WriteLine("\nGeneral (short date + short time).");
            Console.WriteLine("g\t{0:g}", time1);
            Console.WriteLine("gg\t{0:gg}", time1);
            Console.WriteLine("ggggg\t{0:ggggg}", time1);

            Console.WriteLine("\nFull date/time pattern (long date + long time).");

            Console.WriteLine("\nGeneral (short date + long time).");
            Console.WriteLine("G\t{0:G}", time1);

            Console.WriteLine("\nFull date/time pattern (long date + long time).");
            Console.WriteLine("m\t{0:m}", time1);

            Console.WriteLine("\nMonth day pattern.");
            Console.WriteLine("M\t{0:M}", time1);
            Console.WriteLine("MM\t{0:MM}", time1);
            Console.WriteLine("MMM\t{0:MMM}", time1);

            Console.WriteLine("MMMM\t{0:MMMM}", time1);

            Console.WriteLine("\nRFC1123 pattern.");
            Console.WriteLine("r/R\t{0:r}", time1);
                                
            Console.WriteLine("\nSortable date/time pattern; conforms to ISO 8601.");
            Console.WriteLine("s\t{0:s}", time1);
            Console.WriteLine("ss\t{0:ss}", time1);
            Console.WriteLine("sss\t{0:sss}", time1);
                        
            Console.WriteLine("\nShort time pattern.");
            Console.WriteLine("t\t{0:t}", time1);

            Console.WriteLine("\nLong time pattern.");
            Console.WriteLine("T\t{0:T}", time1);
                        
            Console.WriteLine("\nUniversal sortable date pattern");
            Console.WriteLine("u\t{0:u}", time1);
                        
            Console.WriteLine("\nUniversal sortable date/time pattern");
            Console.WriteLine("U\t{0:U}", time1);
                        
            Console.WriteLine("\ntimezone offset (hour only). ");
            Console.WriteLine("y\t{0:y}", time1);
            Console.WriteLine("yy\t{0:yy}", time1);
            Console.WriteLine("yyy\t{0:yyy}", time1);
            Console.WriteLine("yyyy\t{0:yyyy}", time1);
            Console.WriteLine("yyyyy\t{0:yyyyy}", time1);
            Console.WriteLine("yyyyyy\t{0:yyyyyy}", time1);
                        
            Console.WriteLine("\nYear month pattern.");
            Console.WriteLine("z\t{0:zy}", time1);
            Console.WriteLine("zz\t{0:zz}", time1);
            Console.WriteLine("zzz\t{0:zzz}", time1);

            Console.WriteLine("\nYear month pattern.");
            Console.WriteLine("Y\t{0:Y}", time1);
                        
            Console.WriteLine("\nSeparators.");
            Console.WriteLine("/ and :\t{0:yy/MM/dd hh:mm:ss}", time1);

            Console.WriteLine("\nQuoted string.");
            string str = time1.ToString("yyyy/MM'月の'dd'日よーん' hh:mm:ss ");
            Console.WriteLine( "\'\t" + str );
            str = time1.ToString("yyyy/MM\"月の\"dd\"日よーん\" hh:mm:ss ");
            Console.WriteLine( "\"\t" + str );
        }

        static private void TestCulture()
        {
            Console.WriteLine("------------------------------------------------");
            Console.WriteLine("カレントスレッドのカレントカルチャー情報を調べる");
            CultureInfo currentCulture = Thread.CurrentThread.CurrentCulture;
            Console.WriteLine("CurrentCulture.Name = {0}", currentCulture.Name);
            Console.WriteLine("CurrentCulture.DisplayName = {0}", currentCulture.DisplayName);

            Console.WriteLine("DateTimeFormat.FullDateTimePattern = {0}", 
                currentCulture.DateTimeFormat.FullDateTimePattern.ToString());
            Console.WriteLine("Calendar = {0}", currentCulture.DateTimeFormat.Calendar.ToString());
            // グレゴリー暦の場合のカレンダータイプ
            if (currentCulture.DateTimeFormat.Calendar.GetType() == typeof(GregorianCalendar))
                Console.WriteLine("CalendarType = {0}", 
                    ((GregorianCalendar)(currentCulture.DateTimeFormat.Calendar)).CalendarType.ToString());
        }
         
        static private void ForceCulture()
        {
            Console.WriteLine("------------------------------------------------");
            Console.WriteLine("カレンダーの種類を指定して日時を表示する。");

            CultureInfo culture = null;
            DateTime now = System.DateTime.Now;

            // そのまま、DateTime.Now を表示すると、コントロールパネルで設定している
            // カレンダーの種類(和暦、西暦(英語)、西暦(日本語))で表示される。
            Console.WriteLine("無指定           : " + System.DateTime.Now.ToString("F"));
            
            // カルチャーのクローンを作る。new より早い。
            culture = (CultureInfo)(Thread.CurrentThread.CurrentCulture.Clone());

            // 西暦(日本語)表示にする。
            GregorianCalendar gregLocalCal = new System.Globalization.GregorianCalendar();
            gregLocalCal.CalendarType = GregorianCalendarTypes.Localized;
            culture.DateTimeFormat.Calendar = gregLocalCal;
            Console.WriteLine("西暦(日本語)表示: " + now.ToString("F", culture));
            
            // 西暦(英語)表示にする。
            GregorianCalendar gregUSCal = new System.Globalization.GregorianCalendar();
            gregUSCal.CalendarType = GregorianCalendarTypes.USEnglish;
            culture.DateTimeFormat.Calendar = gregUSCal;
            Console.WriteLine("西暦(英語)表示  : " + now.ToString("F", culture));

            // 和暦表示にする。
            Calendar jpCal = new System.Globalization.JapaneseCalendar();
            culture.DateTimeFormat.Calendar = jpCal;
            Console.WriteLine("和暦表示         : " + now.ToString("F", culture));

            // 台湾暦
            TaiwanCalendar twCal = new System.Globalization.TaiwanCalendar();
            culture = new System.Globalization.CultureInfo("zh-TW");
            culture.DateTimeFormat.Calendar = twCal;
            Console.WriteLine(culture.NativeName + " : " + now.ToString("F", culture));
        }

        static private void ToDateTime()
        {
            Console.WriteLine("------------------------------------------------");
            Console.WriteLine("文字列から DateTime へ");
            // 西暦文字列→DateTime
            DateTime time1 = System.DateTime.Parse("2002/4/1 13:23:45");
            Console.WriteLine("『2002/4/1 13:23:45』→DateTime : " + time1.ToString("F"));

            // 和暦文字列→DateTime
            Calendar jpCal = new System.Globalization.JapaneseCalendar();
            CultureInfo culture = new CultureInfo("ja-JP");
            culture.DateTimeFormat.Calendar = jpCal;
            DateTime time2 = System.DateTime.Parse("平成 14年4月1日 月曜日 13:23:45");
            Console.WriteLine("『平成 14年4月1日 月曜日 13:23:45』→DateTime : " + time2.ToString("F"));
        }
    }
}

8.改訂履歴

2002/3/20   初版作成
2002/12/26 全面改訂