Java的:你如何转换UTC时间戳为本地时间?(Java: How do you convert a

2019-06-18 05:32发布

我有一个时间戳是在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]

Answer 1:

Date在UTC没有时区和内部商店。 只有当日期的格式是时区修正适用。 当使用DateFormat ,默认为它在运行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。 如果你只是去Z那么输出将是2012-08-15T15:56:02.038-0700



Answer 2:

使用流行的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,例如,可能意味着Philppine标准时间,太平洋标准时间或皮特凯恩标准时间(尽管S IN的缩写常常是夏令时间(指DST))。 如果您打算太平洋标准时间,这甚至不是一个时区,因为在夏天(在您的样本时间戳下降)太平洋夏令时来代替。 取而代之的是缩写的使用时区ID的格式区域/城市在我的代码。
  • 时间戳一般情况下最好的处理Instant对象。 转换为ZonedDateTime只有当你有需要,像演讲。

问:我可以使用现代化的API与我的Java版本?

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

  • 在Java 8及更高版本的新的API来自内置。
  • 在Java 6和7获得的ThreeTen反向移植 ,新类的反向移植(这是ThreeTen对JSR-310,其中首次定义了现代API)。
  • 在Android上,使用ThreeTen反向移植了Android版本。 这就是所谓的ThreeTenABP,我认为有一个美妙的解释了这个问题:如何在Android的项目中使用ThreeTenABP 。


Answer 3:

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

    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();
    }


文章来源: Java: How do you convert a UTC timestamp to local time?