非法日期格式Java
我正在尝试向一个API发送一个参数,该参数需要一个日期时间,如非法日期格式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。。。我错过了什么?我该怎么做才能得
=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()