如何将UTC格式的字符串转换为特定时区的日历?

时间:2012-12-17 22:09:20

标签: java date timezone utc gmt

我正在尝试将一些UTC时间的字符串转换为应设置为GMT-5的java Calendar对象。

我当前的UTC字符串输入是:

  

UTC日期:20050329174411

我使用此代码(我检测到'pattern'如下所示):

DateFormat dateFormat = new SimpleDateFormat(pattern);
Date date = dateFormat.parse(utcDate);
calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT-5"));
calendar.setTime(date);
然后我打印出这样的时间:

  

calendar.getTime()

我得到了这个结果:

  

GMT日期:3月29日星期二美国东部时间2005年17:44:11

我需要支持这些日期/时间字符串模式:

FORMAT_UTC4 = "yyyy";           
FORMAT_UTC6 = "yyyyMM";         
FORMAT_UTC8 = "yyyyMMdd";       
FORMAT_UTC10 = "yyyyMMddHH";    
FORMAT_UTC12 = "yyyyMMddHHmm";  
FORMAT_UTC14 = "yyyyMMddHHmmss";

我希望时间设置为“12:44:11”。我已经阅读了几个例子,我发现日期时间处理非常令人困惑。对我来说,它总是一样的,我得到一些字符串格式化的UTC,我把它转换为GMT-5。我觉得这应该很容易!

参考1:How can I get the current date and time in UTC or GMT in Java?

参考2:How to handle calendar TimeZones using Java?

2 个答案:

答案 0 :(得分:5)

在解析日期之前,您必须将SimpleDateFormat的时区设置为UTC。否则,它使用您的默认时区。

要在“GMT-5”时区中显示日期,您应该使用另一个DateFormat,时区设置为GMT-5,并使用此DateFormat格式化日期。 Date的toString()方法使用您的默认时区将日期转换为可读的内容。

答案 1 :(得分:0)

java.time

请注意,GMT-5-05:00 小时的时区偏移量是一个固定偏移量,即独立于 DST 并且表示具有时区偏移量的日期时间的类型为 OffsetDateTime .

演示:

import java.time.Instant;
import java.time.OffsetDateTime;
import java.time.ZoneOffset;

public class Main {
    public static void main(String[] args) {
        Instant instant = Instant.ofEpochMilli(20050329174411L);
        OffsetDateTime odt = instant.atOffset(ZoneOffset.of("-05:00"));
        // Alternatively
        // OffsetDateTime.ofInstant(instant, ZoneOffset.of("-05:00"));
        System.out.println(odt);
    }
}

输出:

2605-05-15T18:52:54.411-05:00

如果您要根据 DST 自动调整时区偏移,请使用 ZonedDateTime

演示:

import java.time.Instant;
import java.time.ZoneId;
import java.time.ZonedDateTime;

public class Main {
    public static void main(String[] args) {
        Instant instant = Instant.ofEpochMilli(20050329174411L);
        ZonedDateTime zdt = instant.atZone(ZoneId.of("America/Chicago"));
        // Alternatively
        // ZonedDateTime.ofInstant(instant, ZoneId.of("America/Chicago"));
        System.out.println(zdt);
    }
}

输出:

2605-05-15T18:52:54.411-05:00[America/Chicago]

modern date-time API 中详细了解 java.timeTrail: Date Time*

如果您需要从 java.util.Calendar 的这个对象中获得 ZonedDateTime 的对象,您可以这样做:

Calendar calendar = Calendar.getInstance();
calendar.setTime(Date.from(zdt.toInstant()));

* 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用 ThreeTen-Backport,它将大部分 java.time 功能向后移植到 Java 6 & 7. 如果您正在为 Android 项目工作并且您的 Android API 级别仍然不符合 Java-8,请检查 Java 8+ APIs available through desugaringHow to use ThreeTenABP in Android Project