非法日期格式Java

非法日期格式Java,java,api,date,datetime-format,Java,Api,Date,Datetime Format,我正在尝试向一个API发送一个参数,该参数需要一个日期时间,如=2014-01-02T08:12:32Z(来自文档) 要使用这种格式,据我所知,我必须使用如下内容: new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssX").format(when) 但是我从API得到一个错误,说日期无效 生成的日期如下所示: 2021-05-21T20:08:14+02 就我所见,唯一的格式差异是我认为是时区的尾随Z。。。我错过了什么?我该怎么做才能得

我正在尝试向一个API发送一个参数,该参数需要一个日期时间,如
=2014-01-02T08:12:32Z
(来自文档)

要使用这种格式,据我所知,我必须使用如下内容:

new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssX").format(when)
但是我从API得到一个错误,说日期无效

生成的日期如下所示:

2021-05-21T20:08:14+02
就我所见,唯一的格式差异是我认为是时区的尾随Z。。。我错过了什么?我该怎么做才能得到尾随的“Z”?

tl;博士 2021-05-25T01:05:03Z

细节 避免遗留日期时间类 您正在使用可怕的日期时间类,这些类在几年前被现代java.time类所取代

java.time 要捕获UTC中的当前时刻,请使用

因此:

…这就是你所需要的

看这个

2021-05-25T01:05:03.208937Z

末尾的
Z
表示与UTC的偏差为零小时分秒。发音为“祖鲁”。相当于
+00:00

截断 如果你只想要整秒,把小数秒去掉

2021-05-25T01:05:03Z


你可以在这里看到一个例子

import java.text.simpleDataFormat;
导入java.util.Date;
公共类JavaDateValidations
{
公共静态最终字符串时间戳\u模式
=“yyyy-MM-ddTHH:MM:ss”;
公共静态void main(字符串[]args)
{
SimpleDataFormat sdf=新的SimpleDataFormat(时间戳_模式);
日期=新日期();
字符串formattedDate=sdf.format(日期);
System.out.println(formattedDate);//2020-05-09T00:32:28
}
}
Z
是时区,但可能收件人只支持
Z
。这并非闻所未闻

要调整时间,只需在格式化程序中指定所需的时区

//模拟问题的时区
TimeZone.setDefault(TimeZone.getTimeZone(“GMT+02”);
//设置'when',并显示以供证明
Date when=Date.from(OffsetDateTime.parse(“2021-05-21T20:08:14+02”).toInstant();
System.out.println(何时);
//输出:5月21日星期五20:08:14 GMT+2021年2:00
//请参见问题代码生成相同的输出
System.out.println(新的SimpleDataFormat(“yyyy-MM-dd'T'HH:MM:ssX”).format(when));
//输出:2021-05-21T20:08:14+02
//将所需时区添加到格式化程序
SimpleDataFormat fmt=新的SimpleDataFormat(“yyyy-MM-dd'T:HH:MM:ssX”);
fmt.setTimeZone(TimeZone.getTimeZone(“UTC”));
System.out.println(fmt.format(when));
//输出:2021-05-21T18:08:14Z(注意小时是如何从20变为18的)

不过,我建议您开始使用Java8中添加的时间API

//设置'when',并显示以供证明
OffsetDateTime when=OffsetDateTime.parse(“2021-05-21T20:08:14+02”);
System.out.println(何时);
//输出:2021-05-21T20:08:14+02:00
//查看与问题相同的输出
System.out.println(when.format(模式的DateTimeFormatter.of(“yyyy-MM-dd'T'HH:MM:ssX”));
//输出:2021-05-21T20:08:14+02
//选项1:将所需时区添加到格式化程序
DateTimeFormatter fmt=模式的DateTimeFormatter.(“yyyy-MM-dd'T'HH:MM:ssX”)
.withZone(ZoneOffset.UTC);
System.out.println(fmt.format(when));
//输出:2021-05-21T18:08:14Z
//选项2:更改值的时区
OffsetDateTime whenUTC=when.atZoneSameInstant(ZoneOffset.UTC).toOffsetDateTime();
系统输出打印项次(whenUTC);
//输出:2021-05-21T18:08:14Z

因此,由于我在+2时区,他们希望日期为Z,因此我应该在调试器中看到URL包含when-2 hours?@Berto99 Unknown,如果这是服务器想要的。这是我们应该想要的,但有些人不理解
Z
的意思,只是忽略了它,在这种情况下,你不希望调整时间。这个答案涵盖了它应该如何工作如果服务器有缺陷,并且希望小时保持不变(例如20,而不是18),那么只需将问题代码中的
X
替换为
'Z'
(需要引号)。这不是一个真正有用的答案。OP显然是在询问时区的问题,因此让他们得到包含时区的答案一定很重要。我建议您不要使用
SimpleDateFormat
。那门课是出了名的麻烦和过时。而是使用
Instant
from及其
toString
方法。见巴兹尔·布尔克的答案。类似:。还有:是最好的,而且。
java.time.Instant         // Represent a moment as seen with an offset-from-UTC of zero hours-minutes-seconds.
.now()                    // Capture the current moment.
.truncatedTo(             // Lop off any fractional second.
    ChronoUnit.SECONDS    // An enum specifying the granularity of truncation.
)                         // Returns another `Instant` object rather than altering the original, per immutable-objects pattern.
.toString()               // Generate text representing the content of this object, using standard ISO 8601 format.
Instant.now().toString()
  Instant.now().truncatedTo( ChronoUnit.SECONDS ).toString()