更新
我从您那里了解到,您使用的 API 如下:
apiClient.getJSON().setOffsetDateTimeFormat(DateTimeFormatter);
并且您没有传递时区信息的参数。在这种情况下,您可以使用DateTimeFormatter#withZone
如下所示:
import java.time.OffsetDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
public class Main {
public static void main(String[] args) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuuMMddHHmmss", Locale.ENGLISH)
.withZone(ZoneOffset.UTC);
OffsetDateTime odt = OffsetDateTime.parse("20210817132649", formatter);
System.out.println(odt);
}
}
输出:
2021-08-17T13:26:49Z
ONLINE DEMO
即现在,您的电话将是:
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuuMMddHHmmss", Locale.ENGLISH)
.withZone(ZoneOffset.UTC);
apiClient.getJSON().setOffsetDateTimeFormat(formatter);
原始答案
您的日期时间字符串没有时区偏移量。将其解析为 a LocalDateTime
,然后对其应用偏移量。
演示:
import java.time.LocalDateTime;
import java.time.OffsetDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
public class Main {
public static void main(String[] args) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuuMMddHHmmss", Locale.ENGLISH);
OffsetDateTime odt = LocalDateTime.parse("20210817132649", formatter)
.atOffset(ZoneOffset.UTC);
System.out.println(odt);
}
}
输出:
2021-08-17T13:26:49Z
ONLINE DEMO
Z
输出中的 是零时区偏移的时区指示符。它代表 Zulu 并指定Etc/UTC
时区(时区偏移量为+00:00
小时)。您可以根据您的要求指定不同的时区偏移量(例如ZoneOffset.of("+05:30")
)。
如果你ZoneId
有空
如果您ZoneId
有空,您应该将给定的日期时间字符串解析为 a LocalDateTime
,然后将ZoneId
其应用以获取 a ZonedDateTime
,您始终可以从中获取OffsetDateTime
. a 最好的一点ZonedDateTime
是它被设计为自动调整时区偏移量,而 anOffsetDateTime
用于表示固定的时区偏移量。
演示:
import java.time.LocalDateTime;
import java.time.OffsetDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
public class Main {
public static void main(String[] args) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuuMMddHHmmss", Locale.ENGLISH);
ZonedDateTime zdt = LocalDateTime.parse("20210817132649", formatter)
.atZone(ZoneId.of("Etc/UTC"));
OffsetDateTime odt = zdt.toOffsetDateTime();
System.out.println(odt);
}
}
输出:
2021-08-17T13:26:49Z
ONLINE DEMO
您可以根据您的要求指定不同的ZoneId
(例如)。ZoneId.of("Asia/Kolkata")
从Trail: Date Time了解有关现代日期时间 API *的更多信息。
* 如果您正在为一个 Android 项目工作,并且您的 Android API 级别仍然不符合 Java-8,请通过 desugaring 检查可用的 Java 8+ API。请注意,Android 8.0 Oreo 已经提供对java.time
.