1

ローカルのタイムゾーンオフセット以外のタイムゾーンオフセットを示すようにカレンダー文字列をフォーマットしようとしています。簡単な書式設定文字列を作成し、Calendar.get(int)メソッドを使用してすべての値を入力できることは承知していますが、これは正しい方法とは思えません。

JavaにはDateFormat、具体的にはを使用しようとしていSimpleDateFormatます。問題は、これらのクラスのメソッドがオブジェクトformat()を予期していることです。Date

私は主にCalendarオブジェクトを扱っています。なぜなら、それらはJavaで推奨される構造であると信じているからです。したがって、結果時間をフォーマットするときに、オブジェクトに渡すことができるオブジェクトをCalendar.getTime()返すを呼び出します。DateSimpleDateFormat

これまでは完全に簡単だと思っていましたが、ここで問題が発生します。

Calendar.getTime()メソッドを呼び出すと、Dateのタイムゾーンに関係なく、返されるのは常にローカルタイムゾーンになりCalendarます。

そのため、時間を自分に渡すと、常にローカルタイムゾーンで時刻が印刷されますがSimpleDateFormat、これは私が望んでいることではありません。私がこれまでに行ったすべての調査では、それは不可能であると述べており、私が見たすべての例では、このCalendar.get(int)方法を使用していくつかの空白を埋めています。これはひどいようですが、それがそれほど役に立たないのであれば、なぜDateFormatクラスがあるのでしょうか。

これが私が何を意味するかを理解できるようにいくつかのサンプルコードです、これをあなたの好きなテストクラスに貼り付けてください:

private static final SimpleDateFormat parser = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
private static final SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");

public static void main(String[] args)
{
    try
    {
        Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("EST"));
        cal.setTimeInMillis(parser.parse("2012-10-09T22:01:49.108-0700").getTime());
        System.out.println(formatter.format(cal.getTime()));
    }
    catch(ParseException e)
    {
        e.printStackTrace();
    }
}

生成された出力(中部標準時で実行しているため):2012-10-10T00:01:49-0500
期待される出力(実行元のタイムゾーンは関係ありません):2012-10-10T01:01:49-0400

質問を要約すると、JavaでDateFormatにカレンダーを受け入れさせる方法、またはローカルタイムゾーンにない日付を取得する方法はありますか、それともこのフォーマットに完全に使用する必要がある別のクラスがありますか?

4

3 に答える 3

3

Calendar.getTime()メソッドを呼び出すと、カレンダーのタイムゾーンに関係なく、返される日付は常にローカルタイムゾーンになります。

いいえ、ちがいます。タイムゾーンDateありません。これは、Unixエポックからのミリ秒数です。そのメソッドそれをローカルタイムゾーンに変換しますが、それはオブジェクトの情報の一部ではありません。toString()Date

フォーマッタのタイムゾーンをカレンダーのタイムゾーンと同じに設定するだけです。

formatter.setTimeZone(calendar.getTimeZone());

...または、カレンダーを完全に使用するように設定します。

formatter.setCalendar(calendar);

(後者のアプローチがカレンダーの価値を失う可能性があるかどうかはすぐにはわかりません...基本的に、Javaクラスは「カレンダーシステム」、「タイムゾーン」、「カレンダー内の価値」を1つのタイプに混合します。非常に残念です。)

ただし、Joda Timeがはるかに快適なAPIであるという点で、Ianに同意します。

于 2012-10-18T22:30:33.263 に答える
0

これには組み込みのJavaの日付と時刻のクラスをあきらめ、代わりにjodatimeを使用します。ISO8601形式の文字列を適切に処理するように設計されており、タイムゾーンで正しい動作をします。

于 2012-10-18T22:23:20.003 に答える
0

日付にはTimeZoneがありません。これは、エポック時間からのミリ秒数であり、人間が読める形式で表されます。「DateFormat」クラスを使用できます。

 TimeZone tz = TimeZone.getTimeZone("America/Buenos_Aires");
 Calendar cal = Calendar.getInstance(tz);
 Date d = cal.getTime();
 DateFormat df = new SimpleDateFormat("dd-MM-yyyy HH:mm aaa");
 df.setTimeZone(tz);
 String s = df.format(cal.getTime());
 System.out.println(s);
于 2012-12-20T17:42:51.593 に答える