6

メールの送信元のタイムゾーンを保存する必要があります。電子メールの「日付:」ヘッダー(RFC822日付)からそれを抽出するための最良の方法はどれですか?そして、それをデータベースに保存するための推奨フォーマットは何ですか(私は休止状態を使用しています)?

4

5 に答える 5

1

JodaTimeはISO8601をサポートしているため、おそらく最も簡単に解析できます。JodaTimeを使用したJavaでの日付と時刻の解析とフォーマットを参照してください。

DateTimeFormatter parser2 = ISODateTimeFormat.dateTimeNoMillis();
System.out.println(parser2.parseDateTime(your_date_string));

時間は常にタイムゾーンとともにUTC(GMT)で保存する必要があります。つまり、解析後にタイムゾーンからGMTに変換し、夏時間のオフセットを削除して元のタイムゾーンを保存します。

UTCに変換した後、タイムゾーンとともに日付を保存する必要があります。

タイムゾーンを削除したり処理しなかったりすると、別のタイムゾーンからのデータを処理するときに問題が発生します。

于 2008-09-20T14:05:11.273 に答える
1

Mime4Jを使用することをお勧めします。

このライブラリは、あらゆる種類の電子メールのがらくたを解析するように設計されています。日付を解析するには、そのDateTimeParserを使用します。

int zone = new DateTimeParser(new StringReader("Fri, 27 Jul 2012 09:13:15 -0400")).zone();

その後、通常、日時をJoda の DateTimeに変換します。RFC822 のすべてのケースをカバーしないため、SimpleDateFormatter は使用しないでください。

以下は、Java の TZ より優れたJoda TimeZone (上記の int ゾーンから) を取得します。

// Stupid hack in case the zone is not in [-+]zzzz format
final int hours;
final int minutes;
if (zone > 24 || zone < -24 ) {
    hours = zone / 100;
    minutes = minutes = Math.abs(zone % 100);
}
else {
    hours = zone;
    minutes = 0;
}
DateTimeZone.forOffsetHoursMinutes(hours, minutes);

唯一の問題は、取得するタイム ゾーンが常に数値のタイム ゾーンであり、メールを送信するユーザーの正しいタイム ゾーンではない可能性があることです (メール アプリが UTC だけでなく TZ をユーザーに送信したと仮定します)。

たとえば、-0400 は夏時間が考慮されていないため、EDT (America/New_York) ではありません。

于 2012-07-27T13:51:05.023 に答える
0

ある種の部分文字列または正規表現を使用して、ヘッダーからデータを抽出します。SimpleDateFormatterを使用して日付を解析し、Dateオブジェクトを作成します。

于 2008-09-20T13:59:12.877 に答える
0

電子メールのタイムゾーンには、送信されたタイムゾーンは表示されません。一部のプログラムは、UTCまたはGMTを使用します。もちろん、タイムゾーンは日時値の一部であり、解析する必要もあります。

なぜあなたはそれを知りたいのですか。-タイムスタンプを正規化しますか?次に、DateFormatを使用して解析します。-メールを送信したユーザーのタイムゾーンを検出しますか?これは正しく機能しません。

于 2008-09-20T14:16:32.633 に答える
0

コメントの1つですでにこれについて言及しているようですが、それがあなたの最良の答えだと思います。JavaMail ライブラリには、RFC822 Date ヘッダー解析コードが含まれていjavax.mail.internet.MailDateFormatます。残念ながら、TimeZone の解析を直接公開していないため、必要なコードを から直接コピーする必要がありますが、javax.mail.internet.MailDateParserすでに行われた慎重な作業を利用する価値があります。

保存に関しては、パーサーは日付をオフセットとして提供するため、適切に保存できるはずですint(Hibernate がそれをデータベースに変換します)。

于 2008-09-20T15:10:05.890 に答える