18

のようなメール ヘッダーの文字列がありますDate: Mon, 27 Oct 2008 08:33:29 -0700。必要なのは、同じ瞬間を表す GregorianCalendar のインスタンスです。それと同じくらい簡単です - どうすればいいですか?

そして最速のものについては、これは正しく動作しません:

SimpleDateFormat format = ... // whatever you want
Date date = format.parse(myString)
GregorianCalendar calendar = new GregorianCalendar();
calendar.setTime(date)

タイムゾーンを UTC (または Java のバージョンによってはローカル マシン時間) に正規化するためです。必要なのは、 calendar.getTimeZone().getRawOffset() を返すこと-7 * milisInAnHourです。

4

3 に答える 3

15

可能であれば、Joda Time ライブラリを調べることをお勧めします。コアプラットフォームが同様の機能を提供する場合、私は通常、サードパーティのライブラリを使用することに反対しますが、Joda Time の作成者も JSR310 の背後にあり、Joda Time は基本的に最終的に Java 7 に組み込まれる予定であるため、これを例外にしました。

http://joda-time.sourceforge.net/

とにかく、Joda Time がオプションである場合、次のようなものが機能するはずです。

DateTimeFormatter formatter =
    DateTimeFormat.forPattern("your pattern").withOffsetParsed();
DateTime dateTime = formatter.parseDateTime("your input");
GregorianCalendar cal = dateTime.toGregorianCalendar();

これが役立つことを願っています。

于 2008-10-27T16:43:50.627 に答える
6

そして最速のものの場合-これは正しく機能しません...タイムゾーンをUTC(またはJavaバージョンによってはローカルマシンの時間)に正規化するためです。必要なのは、-7 * milisInAnHourを返すcalendar.getTimeZone()。getRawOffset()です。

技術的にはこれは機能します。これは、TimeZoneが現在のシステムTimeZoneに等しいオブジェクトを返す一方で、オフセットを考慮して時間が変更されるためです。

このコード:

String dateString = "Mon, 27 Oct 2008 08:33:29 -0700";
DateFormat df = new SimpleDateFormat("E, dd MMM yyyy hh:mm:ss Z");
Date parsed = df.parse(dateString);
System.out.println("parsed date: " + parsed);

Calendar newCalendar = Calendar.getInstance();
newCalendar.setTime(parsed);

出力:

解析日:Mon Oct 27 11:33:29 EDT 2008

私のシステムのタイムゾーンはEDT/UTCから4時間マイナス(これはあなたのシステムより3時間進んでいます)なので、これは技術的に正しいです。1970年1月1日00:00:00GMT(Dateオブジェクトが日付/時刻を格納する方法)からのミリ秒数として時間を表す場合、これらの日付/時刻は等しく、異なるのはTimeZoneだけです。

あなたの問題は本当に日付/カレンダーを自分のタイムゾーンに変換するにはどうすればよいですか?そのために、前の質問に対する私の回答を見てください。Javaを使用してカレンダーのタイムゾーンを処理する方法は?

于 2008-10-27T17:29:20.440 に答える