web-dev-qa-db-ja.com

UTC日付を他のタイムゾーンに変換する

この方法を使用して、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

私は何を間違えていますか?

33
Hadi Eskandari

コードはほとんど正しいことがわかりましたが、私が考慮しなかったのは、最初に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);
68
Hadi Eskandari

「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;
}
14
QBLive

要件に応じて日付形式とタイムゾーンを解析できます。このコードスニペットをお試しください。お役に立てば幸いです。

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;
}
3
Rehan Sarwar

次のコードは、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;
}
3
Santhosh

夏時間を考慮する必要があります。これを行うには、オフセット(UTCから)をミリ秒単位で計算します。このような何かが動作するはずです。

_int currentOffsetFromUTC = tz.getRawOffset() + (tz.inDaylightTime(parsed) ? tz.getDSTSavings() : 0);
String result = format.format(parsed.getTime() + currentOffsetFromUTC);
_

inDayLightTime(...)メソッドはブール値を返し、その 'date'がDST期間中の日付を表すかどうかを決定するために、Dateオブジェクトを渡す必要があります。

2
Squonk