将UTC日期转换为其他时区

Had*_*ari 33 timezone datetime android

我正在使用此方法将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);
Run Code Online (Sandbox Code Playgroud)

所以输入是2011-03-01 15:10:37这个(结果的值)的输出2011-03-01 05:40:37.虽然它似乎是关闭,并根据这个链接,它应该是2011-03-01 09:10:37.

我究竟做错了什么?

Had*_*ari 69

事实证明代码几乎是正确的,我没有考虑的是,在解析最初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);
Run Code Online (Sandbox Code Playgroud)

  • 不要忘记在`sourceFormat.parse()`周围的`try {} catch(ParseException e){}`.另外,要获取手机所在的本地时区,请使用`TimeZone.getDefault()`,以便将UTC转换为本地时区 (2认同)

QBL*_*ive 14

将日期字符串格式为"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;
}
Run Code Online (Sandbox Code Playgroud)


San*_*osh 9

以下代码对我来说可以很好地将日期从一个 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;
}
Run Code Online (Sandbox Code Playgroud)