45

我有一个 UTC 时间戳,我想在不使用 API 调用的情况下将其转换为本地时间TimeZone.getTimeZone("PST")。你到底应该怎么做?我一直在使用以下代码,但没有取得多大成功:

private static final SimpleDateFormat mSegmentStartTimeFormatter = new        SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS");

Calendar calendar = Calendar.getInstance();

    try {
        calendar.setTime(mSegmentStartTimeFormatter.parse(startTime));
    }
    catch (ParseException e) {
        e.printStackTrace();
    }

    return calendar.getTimeInMillis();

样本输入值:[2012-08-15T22:56:02.038Z]

应该返回相当于[2012-08-15T15:56:02.038Z]

4

3 回答 3

73

Date没有时区,内部存储为 UTC。只有当日期被格式化时,时区更正才适用。使用 aDateFormat时,它默认为其运行所在的 JVM 的时区。setTimeZone根据需要使用来更改它。

DateFormat utcFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
utcFormat.setTimeZone(TimeZone.getTimeZone("UTC"));

Date date = utcFormat.parse("2012-08-15T22:56:02.038Z");

DateFormat pstFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS");
pstFormat.setTimeZone(TimeZone.getTimeZone("PST"));

System.out.println(pstFormat.format(date));

这打印2012-08-15T15:56:02.038

请注意,我省略了'Z'PST 格式的 UTC,因为它表示 UTC。如果你只是去,Z那么输出将是2012-08-15T15:56:02.038-0700

于 2012-09-19T01:12:56.190 回答
22

使用现代 Java 日期和时间 API,这很简单:

    String inputValue = "2012-08-15T22:56:02.038Z";
    Instant timestamp = Instant.parse(inputValue);
    ZonedDateTime losAngelesTime = timestamp.atZone(ZoneId.of("America/Los_Angeles"));
    System.out.println(losAngelesTime);

这打印

2012-08-15T15:56:02.038-07:00[America/Los_Angeles]

注意事项:

  • 你的期望有一个小错误。您的Z时间戳中的 表示 UTC,也称为祖鲁时间。因此,在您的本地时间值中,Z不应该存在。相反,您需要一个返回值,例如2012-08-15T15:56:02.038-07:00,因为偏移量现在是 -7 小时而不是 Z。
  • 避免使用三个字母的时区缩写。它们不是标准化的,因此通常是模棱两可的。例如,PST 可能表示菲律宾标准时间、太平洋标准时间或皮特凯恩标准时间(尽管缩写中的 S 通常表示夏令时(表示 DST))。如果您打算使用太平洋标准时间,那甚至不是时区,因为在夏季(您的示例时间戳所在的位置)使用的是太平洋夏令时间。在我的代码中,使用区域/城市格式的时区 ID 而不是缩写。
  • 时间戳通常最好作为Instant对象处理。ZonedDateTime仅在需要时转换为,例如用于演示。

问:我可以在我的 Java 版本中使用现代 API 吗?

如果至少使用 Java 6,则可以。

于 2017-09-02T06:33:36.253 回答
-1

这是一个简单的修改解决方案

    public String convertToCurrentTimeZone(String Date) {
            String converted_date = "";
            try {

                DateFormat utcFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                utcFormat.setTimeZone(TimeZone.getTimeZone("UTC"));

                Date date = utcFormat.parse(Date);

                DateFormat currentTFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                currentTFormat.setTimeZone(TimeZone.getTimeZone(getCurrentTimeZone()));

                converted_date =  currentTFormat.format(date);
            }catch (Exception e){ e.printStackTrace();}

            return converted_date;
    }


    //get the current time zone

    public String getCurrentTimeZone(){
            TimeZone tz = Calendar.getInstance().getTimeZone();
            System.out.println(tz.getDisplayName());
            return tz.getID();
    }
于 2017-05-08T06:05:50.213 回答