ローカルのタイムゾーンオフセット以外のタイムゾーンオフセットを示すようにカレンダー文字列をフォーマットしようとしています。簡単な書式設定文字列を作成し、Calendar.get(int)
メソッドを使用してすべての値を入力できることは承知していますが、これは正しい方法とは思えません。
JavaにはDateFormat
、具体的にはを使用しようとしていSimpleDateFormat
ます。問題は、これらのクラスのメソッドがオブジェクトformat()
を予期していることです。Date
私は主にCalendar
オブジェクトを扱っています。なぜなら、それらはJavaで推奨される構造であると信じているからです。したがって、結果時間をフォーマットするときに、オブジェクトに渡すことができるオブジェクトをCalendar.getTime()
返すを呼び出します。Date
SimpleDateFormat
これまでは完全に簡単だと思っていましたが、ここで問題が発生します。
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にカレンダーを受け入れさせる方法、またはローカルタイムゾーンにない日付を取得する方法はありますか、それともこのフォーマットに完全に使用する必要がある別のクラスがありますか?