4

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

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

UTC 日期:20050329174411

我使用此代码(我检测到“模式”,如下所示):

DateFormat dateFormat = new SimpleDateFormat(pattern);
Date date = dateFormat.parse(utcDate);
calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT-5"));
calendar.setTime(date);

然后我像这样打印时间:

日历.getTime()

我得到了这个结果:

GMT 日期:2005 年 3 月 29 日星期二 17:44:11 EST

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

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:如何在 Java 中以 UTC 或 GMT 形式获取当前日期和时间?

参考 2:如何使用 Java 处理日历时区?

4

2 回答 2

5

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

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

于 2012-12-17T22:17:14.423 回答
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]

Trail: Date Time了解更多关于java.time现代日期时间 API *的信息。

如果你需要一个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 工作level 仍然不符合 Java-8,请检查Java 8+ APIs available through desugaringHow to use ThreeTenABP in Android Project

于 2021-05-16T15:39:41.010 回答