我正在尝试将一些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?
答案 0 :(得分:5)
在解析日期之前,您必须将SimpleDateFormat的时区设置为UTC。否则,它使用您的默认时区。
要在“GMT-5”时区中显示日期,您应该使用另一个DateFormat,时区设置为GMT-5,并使用此DateFormat格式化日期。 Date的toString()
方法使用您的默认时区将日期转换为可读的内容。
答案 1 :(得分:0)
请注意,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.time
,Trail: 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 desugaring 和 How to use ThreeTenABP in Android Project。