java - 如何制作日期格式以将字符串日期解析为指定的时区

标签 java calendar timezone date-format simpledateformat

我有一个“yyyyMMdd”的字符串日期“20160104”,它属于 GMT-12 时区。

一直在尝试将其解析为 Java 中的 Date 对象。预期结果是

FastTime = 1451908800000. Monday, January 4, 2016 12:00:00 PM GMT

尝试过类似的事情

DateFormat gmtMinus12 = new SimpleDateFormat("yyyyMMdd");
gmtMinus12.setTimeZone(TimeZone.getTimeZone("Etc/GMT-12"));
// gmtMinus12.getCalendar().setTimeZone(TimeZone.getTimeZone("Etc/GMT-12"));
gmtMinus12
    .setCalendar(Calendar.getInstance(TimeZone.getTimeZone("Etc/GMT-12")));

try {
  Date date = gmtMinus12.parse("20160104");

} catch (ParseException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
}

但是解析的输出是

FastTime = 1451822400000 . Sunday, January 3, 2016 12:00:00 PM GMT

如何使 DateFormat 采用与其分配的时区相同的时区。

非常感谢任何帮助。

提前致谢。

最佳答案

java.time

您正在使用麻烦的旧日期时间类,现在已被 java.time 类取代。

LocalDate类表示仅日期值,没有日期时间和时区。

DateTimeFormatter f = DateTimeFormatter.ofPattern ( "uuuuMMdd" );
LocalDate ld = LocalDate.parse ( "20160104" , f );

现在指定一天中的时间和 offset-from-UTC交付 OffsetDateTime对象。

ZoneOffset offset = ZoneOffset.ofHours ( -12 );
LocalTime lt = LocalTime.MIN;  // 00:00
OffsetTime ot = OffsetTime.of ( lt , offset );
OffsetDateTime odt = ot.atDate ( ld );

odt.toString(): 2016-01-04T00:00-12:00

UTC 中看到同一时刻,提取一个Instant

Instant instant = odt.toInstant();

instant.toString(): 2016-01-04T12:00:00Z

正如您所料,一天中的时间是 UTC 时间 4 日中午。

时区

您应该知道 GMT-12 不是时区。这是一个offset-from-UTC .

一个time zone是一个偏移量加上一组用于处理夏令时 (DST) 等异常的规则。

如果您知道预期的时区,则应该应用它而不仅仅是偏移量。指定proper time zone name格式为大陆/地区。切勿使用 3-4 个字母的缩写,例如 ESTIST,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。

ZoneId z = ZoneId.of( "Asia/Kamchatka" );
ZonedDateTime zdt = odt.atZoneSameInstant( z );

zdt.toString(): 2016-01-05T00:00+12:00[Asia/Kamchatka]

关于java.time

java.time框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧类 legacy日期时间类,例如 java.util.Date , .Calendar , & java.text.SimpleDateFormat .

Joda-Time项目,现在位于 maintenance mode ,建议迁移到 java.time。

要了解更多信息,请参阅 Oracle Tutorial 。并在 Stack Overflow 上搜索许多示例和解释。规范为JSR 310 .

从哪里获取java.time类?

ThreeTen-Extra项目通过附加类扩展了 java.time。该项目是 java.time future 可能添加的内容的试验场。您可能会在这里找到一些有用的类,例如 Interval , YearWeek , YearQuarter ,和more .

关于java - 如何制作日期格式以将字符串日期解析为指定的时区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40088009/

相关文章:

java - 为什么终端不提示再次输入此 JAVA 代码?

java - 通过字符串搜索数组列表

Java 或 SQL 在数组中添加缺失的月份

calendar - EWS : Access shared calendars

javascript - 基于时区重定向用户

java - Apache/mod_jk 与 Spring Security

java - jni- 释放对象数组

c# - 更改日历控件中某些假期日期的背景

c# - 应用程序在重新启动之前看不到系统时区更改

spring-boot - Thymeleaf Temporals 和日期与时区