web-dev-qa-db-ja.com

文字列をGregorianCalendarに変換します

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

そして最速のものの場合-これはnot正しく動作します:

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

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

17
Marcin

オプションの場合は、JodaTimeライブラリを調べることをお勧めします。コアプラットフォームが同様の機能を提供する場合、私は通常、サードパーティのライブラリを使用することに反対していますが、Joda Timeの作成者もJSR310の背後にいて、JodaTimeは基本的にJava最終的に7。

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

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

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

これがお役に立てば幸いです。

15
Jack Leow

そして最速のものの場合-これは正しく機能しません...タイムゾーンを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を使用してカレンダーのタイムゾーンを処理する方法は?

6
matt b