C# – RFC2822形式と一般的な形式の時間表記を相互変換

様々な場面で利用される時間表記「RFC2822」いわゆる世界標準形式といえます。日付及び時間を本形式で記述しておけば、世界中のありとあらゆる場所で、現地時間に変換して表示することが出来ます。

概要

  • 世界標準の時間表記「RFC2822」の表記と一般的な時間表示で相互変換を行う。
  • GMT標準時は日本時間+9時間となるので、それも考慮する。

実装例

using System;
using System.Globalization;

namespace rfc2822_test
{
    class Program
    {
        static void Main(string[] args)
        {
            // 住んでる場所で表示されている時間取得
            DateTime myDT = DateTime.Now;
            // 「一般の日付と時刻のパターン」表記に変換
            string basic_time = myDT.ToString("G");
            // 「一般の日付と時刻のパターン」で表示
            Console.WriteLine("現在時間 (日本・一般的な形式で表示)     : {0}", basic_time);
            //---------------------------------------------------------
            // 現在時間(世界標準時)取得 その1
            DateTime myUtcDT1 = DateTime.UtcNow;
            // RFC2822表記に変換
            string rfc2822_time1 = myUtcDT1.ToString("R");
            // RFC2822表記で表示
            Console.WriteLine("現在時間 (世界・RFC2822形式で表示 1)    : {0}", rfc2822_time1);
            //---------------------------------------------------------
            // 現在時間(世界標準時)取得 その2 (DateTimeを変換)
            DateTime myUtcDT2 = myDT.ToUniversalTime();
            // RFC2822表記に変換
            string rfc2822_time2 = myUtcDT2.ToString("R");
            // RFC2822表記で表示
            Console.WriteLine("現在時間 (世界・RFC2822形式で表示 2)    : {0}", rfc2822_time2);
            //---------------------------------------------------------
            // 世界標準時(RFC2822表記)からDetaTime型に変換
            string[] expectedFormats =
                { "d", "D", "f", "F", "g", "G", "m", "r", "s", "t", "T", "u", "U", "y" };
            DateTime myUtcDT3 = System.DateTime.ParseExact(
                rfc2822_time2,
                expectedFormats,
                DateTimeFormatInfo.InvariantInfo,
                DateTimeStyles.None
            );
            // DetaTime型に変換した世界標準時をローカル時間に変換
            DateTime myDT2 = myUtcDT2.ToLocalTime();
            // ローカル時間を表示
            string basic_time2 = myDT2.ToString("G");
            Console.WriteLine("現在時間 (世界・RFC2822形式から変換)    : {0}", basic_time2);
            //---------------------------------------------------------
            // 日本カレンダー設定(「平成~」表示になる)
            DateTimeFormatInfo myDTFI_JP = new CultureInfo("ja-JP", true).DateTimeFormat;
            myDTFI_JP.Calendar = new JapaneseCalendar();
            // 日本でよくある形式で表示
            string jp_time = myDT2.ToString("ggyy年M月d日 (ddd) tt hh時mm分ss秒", myDTFI_JP);
            Console.WriteLine("現在時間 (おまけ・日本的な表示)        : {0}", jp_time);
            //---------------------------------------------------------
            // グレゴリオカレンダー設定 (「A.D.~」表示になる)
            DateTimeFormatInfo myDTFI_GR = new CultureInfo("en-US", true).DateTimeFormat;
            myDTFI_GR.Calendar = new GregorianCalendar();
            // いわゆるあちら風の形式で表示
            string gr_time = myDT2.ToString("ggyyyy/M/d (ddd) tt hh:mm:ss", myDTFI_GR);
            Console.WriteLine("現在時間 (おまけ・あちら的な表示)      : {0}", gr_time);
            Console.Read();
        }
    }
}

説明

(11行目) 単純に「DateTime.Now」とすれば、実行している環境でのいわゆる「ローカル時間」を取得できます。

(20行目) 「DateTime.Now」の代わりに「DateTime.UtcNow」を使用しています。これで日本時間-9時間のいわゆる「世界標準時」を取得できます。

(29行目) 「DateTime.UtcNow」では現在時間に対してしか適用できません。既にある時間に対して「世界標準時」に変換するには、「ToUniversalTime()」メソッドを使用します。

(38~45行目) 「RFC2822」から「DataTime」型への変換は「DataTime」構造体が持つ「ParseExact」メソッドを使用します。「expectedFormats」は「RFC2822」以外にも様々な形式からの変換を行う為の設定です。これだけ指定しておけばほぼ間違いないでしょう^^;

(48行目) 世界標準時間からローカル時間への変換には「DataTime」構造体が持つ「ToLocalTime()」メソッドを使用します。特に問題ないでしょう。

(57行目~) 以降はおまけとして、日本的な表示をしてみました。注目して欲しい場所は48行目と58行目の時間形式指定の部分です。 ほとんど同じ表記をしていますが、いずれもその前にある「DateTimeFormatInfo」クラスの「Calendar」プロパティの設定値により、出力結果が変化します。つまり、現地に合った表記になるわけです。

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

現在時間 (日本・一般的な形式で表示)     : 2007/05/04 2:13:21
現在時間 (世界・RFC2822形式で表示 1)    : Thu, 03 May 2007 17:13:21 GMT
現在時間 (世界・RFC2822形式で表示 2)    : Thu, 03 May 2007 17:13:21 GMT
現在時間 (世界・RFC2822形式から変換)    : 2007/05/04 2:13:21
現在時間 (おまけ・日本的な表示)        : 平成19年5月4日 (金) 午前 02時13分21秒
現在時間 (おまけ・あちら的な表示)      : A.D.2007/5/4 (Fri) AM 02:13:21