この方法を使用して、UTC時間を別のタイムゾーンに変換しています。
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date parsed = format.parse("2011-03-01 15:10:37");
TimeZone tz = TimeZone.getTimeZone("America/Chicago");
format.setTimeZone(tz);
String result = format.format(parsed);
したがって、入力は2011-03-01 15:10:37
が、これの出力(結果の値)は2011-03-01 05:40:37
。オフのように見えますが、 このリンク によれば、2011-03-01 09:10:37
。
私は何を間違えていますか?
コードはほとんど正しいことがわかりましたが、私が考慮しなかったのは、最初にString
オブジェクトを取得するためにDate
を解析するときに、デフォルトのシステムTimeZone
を使用することです、したがって、ソースの日付は予想どおりUTCではありませんでした。
トリックは、日付をUTCに解析するときにタイムゾーンを設定し、それを宛先TimeZone
に設定することでした。このようなもの:
SimpleDateFormat sourceFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
sourceFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
Date parsed = sourceFormat.parse("2011-03-01 15:10:37"); // => Date is in UTC now
TimeZone tz = TimeZone.getTimeZone("America/Chicago");
SimpleDateFormat destFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
destFormat.setTimeZone(tz);
String result = destFormat.format(parsed);
「2011-06-23T15:11:32」形式の日付文字列をタイムゾーンに変換します。
private String getDate(String dateString) {
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
formatter.setTimeZone(TimeZone.getTimeZone("UTC"));
Date value = null;
try {
value = formatter.parse(dateString);
} catch (ParseException e) {
e.printStackTrace();
}
SimpleDateFormat dateFormatter = new SimpleDateFormat("dd/MM/yyyy hh:mmaa");
dateFormatter.setTimeZone(TimeZone.getDefault());
String dt = dateFormatter.format(value);
return dt;
}
要件に応じて日付形式とタイムゾーンを解析できます。このコードスニペットをお試しください。お役に立てば幸いです。
private String getFormattedDate(String OurDate) {
try {
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); // According to your Server TimeStamp
formatter.setTimeZone(TimeZone.getTimeZone("UTC")); //your Server Time Zone
Date value = formatter.parse(OurDate); // Parse your date
SimpleDateFormat dateFormatter = new SimpleDateFormat("MM-dd-yyyy"); //this format changeable according to your choice
dateFormatter.setTimeZone(TimeZone.getDefault());
OurDate = dateFormatter.format(value);
} catch (Exception e) {
OurDate = "00-00-0000 00:00";
}
return OurDate;
}
次のコードは、1つのtzから別のtzに日付を変更するのにうまく機能します。 DayLightSavingも考慮します。
public static Calendar changeTimezoneOfDate(Date date, TimeZone fromTZ, TimeZone toTZ) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
long millis = calendar.getTimeInMillis();
long fromOffset = fromTZ.getOffset(millis);
long toOffset = toTZ.getOffset(millis);
long convertedTime = millis - (fromOffset - toOffset);
Calendar c = Calendar.getInstance();
c.setTimeInMillis(convertedTime);
return c;
}
夏時間を考慮する必要があります。これを行うには、オフセット(UTCから)をミリ秒単位で計算します。このような何かが動作するはずです。
_int currentOffsetFromUTC = tz.getRawOffset() + (tz.inDaylightTime(parsed) ? tz.getDSTSavings() : 0);
String result = format.format(parsed.getTime() + currentOffsetFromUTC);
_
inDayLightTime(...)
メソッドはブール値を返し、その 'date'がDST期間中の日付を表すかどうかを決定するために、Dateオブジェクトを渡す必要があります。