2010年03月06日

メールの日付ヘッダの相互変換

メールの送受信プログラムを作る時、メール日付の変換に苦労した。
ヘッダの日付情報は文字列であり、それをDate(DateTime)型に変換するにはどうすれば良いのか。また現在日時(Date型)をヘッダ書式に変換するにはどうすれば良いのか。
以下にまとめておく。

'//// メール形式の日付を日付型(ローカル時間)に変換 ////
Public Function DateHeader_ToDate(ByVal strdate As String) As Date
'-----------------------------------------------------
' 引数:strdate メールヘッダの日付文字列
'(書式:曜日, 日 月 年 時:分:秒 TimeZone)
'-----------------------------------------------------
Dim wkArray() As String 'ヘッダの文字列の配列
Dim in_date As Date 'ヘッダの日時
Dim interval_hour As Single 'ヘッダのローカル(日本)時間との時差
'半角スペースが2個つながる部分は1つにする
strdate = Replace(strdate, Chr(32) & Chr(32), Chr(32))
'改行以降は削除
If InStr(strdate, Chr(10)) > 0 Then
strdate = Left(strdate, InStr(strdate, Chr(10)))
End If
'半角スペースをキーに配列に保存
wkarray = Split(strdate, Chr(32))
'ヘッダ日時を取得
Dim utcOffset As TimeSpan = TimeZone.CurrentTimeZone.GetUtcOffset(Now)
Select Case wkarray.Length
Case 6, 7 '曜日を含んだ日付文字列の場合
If InStr(wkarray(0), ",") > 0 Then
in_date = Format(wkarray(1) & "-" & _
wkarray(2) & "-" & _
wkarray(3) & " " & _
wkarray(4))
'ローカル(日本)時間との時差を取得
interval_hour = utcOffset.TotalHours - CInt(wkarray(5)) * 0.01
End If
Case 5 '曜日が無い日付文字列の場合
If InStr(wkarray(0), ",") = 0 Then
in_date = Format(wkarray(0) & "-" & _
wkarray(1) & "-" & _
wkarray(2) & " " & _
wkarray(3))
'ローカル(日本)時間との時差を取得
interval_hour = utcOffset.TotalHours - CInt(wkarray(4)) * 0.01
End If
End Select
'ローカル時間に修正
Return DateAdd(DateInterval.Hour, interval_hour, in_date)
End Function
 
'//// 日付型データをメール形式に変換 ///////
Public Function Date_ToDateHeader(ByVal d As Date) As String
'd : 対象日時
'-------------
'UTC(世界協定時刻)とのオフセットを求める
Dim utcOffset As TimeSpan = TimeZone.CurrentTimeZone.GetUtcOffset(Now)
'オフセットを分数に変更
Dim Jisa As Long = utcOffset.TotalMinutes
'オフセット時間は以下のようにしても求められる
'Dim Jisa As Long = DateDiff(DateInterval.Minute, d.ToUniversalTime, d)
'オフセットを「+0900」書式に変換
Dim strJisa As String = IIf(Math.Sign(Jisa) >= 0, " +", " -") & _
(Math.Abs(Jisa) \ 60).ToString("00") & _
(Math.Abs(Jisa) Mod 60).ToString("00")
'メール日付に整形(英語表記のためカルチャーを変更)
Dim cultureUS As New System.Globalization.CultureInfo("en-us")
Return d.ToString("ddd, dd MMM yyyy HH:mm:ss", cultureUS) & strJisa
End Function
posted by なっちゃん at 10:58| 静岡 ☁| Comment(0) | TrackBack(0) | VB.NET Tips | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。

この記事へのトラックバック
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。