Java中是否可以使用冒号格式化UTC时区?

3

我正在尝试使用冒号格式化日期时间戳,包括时区。我进行了几次实验以获得结果。以下是我发现的内容。

Date date = new Date();
String zonedDateTimeFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX";
SimpleDateFormat sdf = new SimpleDateFormat(zonedDateTimeFormat);
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
System.out.println(sdf.format(new Date(date.getTime())));

如果我将时区设置为UTC,我将获得这样的时间戳:2020-11-03T21:14:07.449Z。但如果时区不是UTC
Date date = new Date();
String zonedDateTimeFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX";
SimpleDateFormat sdf = new SimpleDateFormat(zonedDateTimeFormat);
System.out.println(sdf.format(new Date(date.getTime())));

时间戳应该像这样:2020-11-03T22:19:43.804+01:00 我在想是否有可能获取一个以UTC时间为准的时间戳,例如:2020-11-03T21:14:07.449+00:00,而不是以大写字母Z结尾的时间戳?

sdf.format(new Date(date.getTime())).replace("Z", "+00:00") - Rob Evans
可以使用RFC 822时区。因此,您可以使用以下格式:yyyy-MM-dd'T'HH:mm:ss.SSSZ。唯一的缺点是冒号丢失了。 - flaxel
我建议您不要使用SimpleDateFormatDate。那些类设计得很糟糕,已经过时很久了,前者尤其是臭名昭著的麻烦。相反,使用来自Java.time,现代Java日期和时间APIOffsetDateTimeDateTimeFormatter - Ole V.V.
1个回答

4
你可以使用受Joda Time库影响很大的Java 8日期/时间API,但在某些方面有所不同。与Joda Time不同的是,Java 8日期/时间API是Java原生支持的。请注意,Java 8日期/时间API与Joda Time存在一些重叠的开发工作DateTimeFormatter类有以下模式字母:
X       zone-offset 'Z' for zero    offset-X          Z; -08; -0830; -08:30; -083015; -08:30:15;
x       zone-offset                 offset-x          +0000; -08; -0830; -08:30; -083015; -08:30:15;
Z       zone-offset                 offset-Z          +0000; -0800; -08:00

在您的情况下,小写字母 x 应该给出您想要的结果。
示例代码:
import java.time.format.DateTimeFormatter;
import java.time.LocalDateTime;
import java.time.ZonedDateTime;
import java.time.ZoneId;

DateTimeFormatter f = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSxxx");
ZoneId zone = ZoneId.of("UTC");
ZonedDateTime d = ZonedDateTime.now(zone);
System.out.println(d.format(f));

输出:

2020-11-03T22:31:10.928+00:00

值得一读的是Java 8日期和时间API的包描述,以了解该API的总体理念,这与java.util Date和Calendar对象有些不同。

简而言之,主要思想是此API中的所有日期和时间对象都是不可变的,并且如果您想修改或创建日期,则应使用工厂方法(例如of)或函数(例如with)创建其他日期和时间对象,返回具有指定字段更改的日期时间对象的副本。

一些重要的类:

  • Instant - 时间戳
  • LocalDate - 日期,没有时间,也没有偏移量或时区的参考
  • LocalTime - 时间,没有日期,也没有偏移量或时区的参考
  • LocalDateTime - 合并了日期和时间,但仍然没有任何偏移量或时区
  • ZonedDateTime - 带有时区和从UTC /格林威治解析出的偏移量的“完整”日期时间
  • ZoneId - 表示时区

要将java.util.Date对象转换为Java 8日期/时间API中相应的对象,请参见:将java.util.Date转换为java.time.LocalDate


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接