我必须调用一个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
其他一些重要注意事项:
java.util
日期-时间API及其格式API、SimpleDateFormat
已过时且存在错误。建议完全停止使用它们,并切换到现代日期时间API*- 您在
YYYY-MM-DDThh:mm:ss.sssZ
中使用的大多数符号都是错误的。检查DateTimeFormatter
和SimpleDateFormat
文档页面中的符号说明
*出于任何原因,如果您必须坚持使用Java 6或Java 7,您可以使用ThreeTen Backport将Java.time的大部分功能向后移植到Java 6&7.如果您正在为Android项目工作,并且您的Android API级别仍然不符合Java-8,请检查通过desugaring和如何在Android项目中使用ThreeTenABP提供的Java 8+API