如何在Java中将UTC时间格式转换为Date



我必须调用一个web服务,该服务需要一个日期字段,但他们希望它采用以下格式YYYY-MM-DDThh:MM:ss.sssZ。我该怎么做?

我尝试了以下

OffsetDateTime transactionTime = OffsetDateTime.now(ZoneOffset.UTC);
Date.from(transactionTime.toInstant());

但这并没有奏效。transactionTime为2021-06-01T15:11:09.94843400Z,但Date.from将其转换为美国东部时间2021年6月1日星期二11:11:09。

顺便说一句,我正在使用Java 11

Instant.now().toString()

请在IdeOne.com上查看实时运行的代码。

2021-06-01T15:21:16.778779Z

该格式在ISO 8601标准中定义。结束时的Z表示从UTC偏移0小时分秒。发音为"祖鲁"。

使用java.time.Instant表示以UTC表示的时刻。

走向另一个方向,从文本到对象。

Instant.parse( "2021-06-01T15:21:16.783779Z" ) 

如果只需要毫秒,可以通过截断来截断任何微秒和纳秒。

Instant.now().truncatedTo( ChronoUnit.MILLIS ) ;

永远不要使用传统的Date类。仅使用java.time类。

使用DateTimeFormatter格式化日期-时间对象

import java.time.OffsetDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
public class Main {
public static void main(String[] args) {
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSSXXX", Locale.ENGLISH);
OffsetDateTime transactionTime = OffsetDateTime.now(ZoneOffset.UTC);
String formatted = transactionTime.format(dtf);
System.out.println(formatted);
}
}

输出:

2021-06-01T15:49:45.198Z

跟踪:日期时间了解有关现代日期时间API的更多信息。

如果我想使用java.util.Date怎么办

无论出于何种原因,如果您需要将OffsetDateTime的此对象转换为java.util.Date的对象,您可以按如下方式执行:

Date date = Date.from(transactionTime.toInstant());

注意,java.util.Date对象不是像现代日期时间类型那样的真实日期时间对象;而是表示自称为"0"的标准基准时间以来的毫秒数;"纪元";,即CCD_ 9(或UTC(。由于Date没有时区信息,因此它应用JVM的时区以返回Date#toString的值,EEE MMM dd HH:mm:ss z yyyy的格式是根据该毫秒值计算得出的。如果您需要以不同的格式和时区打印日期时间,则需要使用具有所需格式和时区设置为适用格式的SimpleDateFormat,例如

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX", Locale.ENGLISH);
sdf.setTimeZone(TimeZone.getTimeZone("Etc/UTC"));
String strDate = sdf.format(date);
System.out.println(strDate);

输出:

2021-06-01T15:49:45.198Z

其他一些重要注意事项:

  1. java.util日期-时间API及其格式API、SimpleDateFormat已过时且存在错误。建议完全停止使用它们,并切换到现代日期时间API*
  2. 您在YYYY-MM-DDThh:mm:ss.sssZ中使用的大多数符号都是错误的。检查DateTimeFormatterSimpleDateFormat文档页面中的符号说明

*出于任何原因,如果您必须坚持使用Java 6或Java 7,您可以使用ThreeTen BackportJava.time的大部分功能向后移植到Java 6&7.如果您正在为Android项目工作,并且您的Android API级别仍然不符合Java-8,请检查通过desugaring和如何在Android项目中使用ThreeTenABP提供的Java 8+API

相关内容

  • 没有找到相关文章

最新更新