様々な場面で利用される時間表記「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