Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java中将UTC时间格式转换为日期_Java_Date_Utc - Fatal编程技术网

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

如何在Java中将UTC时间格式转换为日期,java,date,utc,Java,Date,Utc,我必须调用一个web服务,该服务需要一个日期字段,但他们希望它的格式为YYYY MM DDThh:MM:ss.sssZ。我该怎么做 我尝试了以下方法 OffsetDateTime transactionTime = OffsetDateTime.now(ZoneOffset.UTC); Date.from(transactionTime.toInstant()); 但这不起作用。交易时间为2021-06-01T15:11:09.942843400Z,但Date.from将其转换为美国东部夏令

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

我尝试了以下方法

OffsetDateTime transactionTime = OffsetDateTime.now(ZoneOffset.UTC);

Date.from(transactionTime.toInstant());

但这不起作用。交易时间为2021-06-01T15:11:09.942843400Z,但Date.from将其转换为美国东部夏令时2021年6月1日星期二11:11:09

顺便说一句,我使用的是Java11

Instant.now().toString()
看到那个密码了吗

2021-06-01T15:21:16.783779Z

该格式在标准中定义。末端的
Z
表示与UTC的偏移量为零小时分秒。发音为“祖鲁”

用于表示UTC中的某个时刻

从文本到对象的另一个方向

Instant.parse( "2021-06-01T15:21:16.783779Z" ) 
如果您只需要毫秒,您可以通过删除任何微秒和纳秒

切勿使用旧版
Date
类。仅使用java.time类。

使用
DateTimeFormatter
格式化日期时间对象 输出:

2021-06-01T15:49:45.198Z
2021-06-01T15:49:45.198Z
了解有关现代日期时间API的更多信息

如果我想使用
java.util.Date
,该怎么办? 出于任何原因,如果需要将此
OffsetDateTime
对象转换为
java.util.Date
对象,可以按如下操作:

Date date = Date.from(transactionTime.toInstant());
请注意,
java.util.Date
对象不像;相反,它表示自称为“历元”的标准基准时间(即1970年1月1日00:00:00 GMT)起的毫秒数。由于
Date
没有时区信息,它应用JVM的时区返回
Date#toString
的值,格式为
EEE MMM dd HH:mm:ss z yyyyy
,根据该毫秒值计算得出。如果需要以不同的格式和时区打印日期时间,则需要使用
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
2021-06-01T15:49:45.198Z
其他一些重要注意事项:

2021-06-01T15:49:45.198Z
2021-06-01T15:49:45.198Z
  • java.util
    Date-Time API及其格式化API
    SimpleDataFormat
    已经过时,并且容易出错。建议完全停止使用,并切换到*
  • 您在
    YYYY-MM-DDThh:MM:ss.sssZ
    中使用的大多数符号都是错误的。检查和的文档页中的符号说明

  • *无论出于何种原因,如果您必须坚持使用Java6或Java7,您可以使用哪个backport将大部分Java.time功能移植到Java6&7。如果您正在为Android项目工作,并且您的Android API级别仍然不符合Java-8,请检查并确认。

    2021-06-01T15:11:09.942843400Z(祖鲁,格林威治时间)是美国东部夏令时2021-06-01T11:11:09.942843400。在不同的时区,它是同一个瞬间。“Date.from将其转换为Tue Jun 01 11:11:09 EDT 2021”-否,
    Date。from
    将其转换为
    Date
    对象,该对象不是字符串。如果您需要以特定的方式格式化
    日期
    对象,有多种方法(例如
    SimpleDataFormat
    )。
    java.util.Date
    没有时区的概念。字符串,
    Tue Jun 01 11:11:09 EDT 2021
    表示时区中的日期时间。由于
    Date
    没有时区信息,它应用JVM的时区返回
    Date#toString
    的值。
    Date
    也不能有格式。是什么让你认为你想要
    日期
    ?该类设计拙劣且过时很久,而且web服务不直接使用
    Date
    对象,所以您不应该想要一个。最好坚持使用您的
    OffsetDateTime