gpt4 book ai didi

Java XMLGregorianCalendar 格式

转载 作者:行者123 更新时间:2023-12-01 19:56:20 26 4
gpt4 key购买 nike

我目前遇到了 XMLGregorianCalendar 格式化问题,想向 Java 专家寻求帮助。通过来自其他系统的函数调用,我在网页上显示了一个数据对象,其中包含“SUBMIT_DATE”:1516032000000和“SUBMIT_TIME”:36895000(两者都具有返回类型XMLGregorianCalendar)。在这种情况下,我如何知道正确的人类可读日期和时间?

感谢您的时间和帮助。

最佳答案

澄清后更新

    // We first need to check that the fields we need are defined
if (submitDate.getTimezone() == DatatypeConstants.FIELD_UNDEFINED) {
throw new IllegalStateException("No time zone defined in submit date " + submitDate);
}
if (submitDate.getYear() == DatatypeConstants.FIELD_UNDEFINED
|| submitDate.getMonth() == DatatypeConstants.FIELD_UNDEFINED
|| submitDate.getDay() == DatatypeConstants.FIELD_UNDEFINED) {
throw new IllegalStateException("Date not defined in submit date " + submitDate);
}
if (submitTime.getHour() == DatatypeConstants.FIELD_UNDEFINED
|| submitTime.getMinute() == DatatypeConstants.FIELD_UNDEFINED
|| submitTime.getSecond() == DatatypeConstants.FIELD_UNDEFINED) {
throw new IllegalStateException("Time of day not defined in submit time " + submitTime);
}
if (submitTime.getTimezone() != DatatypeConstants.FIELD_UNDEFINED
&& submitTime.getTimezone() != submitDate.getTimezone()) {
throw new IllegalStateException("Conflicting offsets " + submitDate.getTimezone()
+ " and " + submitTime.getTimezone() + " minutes");
}

// then format into a human readable string
final ZoneId userZone = ZoneId.of("Asia/Taipei");
final Locale userLocale = Locale.forLanguageTag("zh-TW");
DateTimeFormatter localizedFormatter = DateTimeFormatter
.ofLocalizedDateTime(FormatStyle.LONG)
.withLocale(userLocale);
ZonedDateTime dateTime = submitDate.toGregorianCalendar()
.toZonedDateTime()
.with(LocalTime.of(submitTime.getHour(), submitTime.getMinute(), submitTime.getSecond()))
.withZoneSameInstant(userZone);
String humanReadableDateTime = dateTime.format(localizedFormatter);
System.out.println(humanReadableDateTime);

打印:

2018年1月16日 上午10時14分55秒

我假设 submitDatesubmitTime 是您从远程系统收到的复杂对象中获得的 XMLGregorianCalendar 对象。我进一步假设您可以要求日期包含 UTC 偏移量。尽管该方法名为 getTimezone,但它真正返回的不是时区,而是距 UTC(或 GMT)的分钟偏移量。四个 if 语句中的大量检查是必要的,因为 XMLGregorianCalendar 对于定义哪些字段和不定义哪些字段非常灵活。

要以适合用户受众的格式显示日期和时间,您需要知道该受众的时区区域设置。一旦您知道了这些,请将它们填写在上面的代码片段中。如果您信任 JVM 的设置,则可以使用 ZoneId.systemDefault() 和/或 Locale.getDefault(Locale.Category.FORMAT) 您还可以在格式样式之间进行选择 完整

如果您没有收到偏移量,则需要依赖用户偏移量中已有的日期和时间。一方面它更简单,另一方面它更脆弱,因为如果日期和时间以不同于用户预期的另一个偏移量给出,他/她将收到不正确的信息,这比根本没有收到信息更糟糕。首先检查确实没有偏移:

    if (submitDate.getTimezone() != DatatypeConstants.FIELD_UNDEFINED
|| submitTime.getTimezone() != DatatypeConstants.FIELD_UNDEFINED) {
throw new IllegalStateException("Unexpected offset");
}

还要检查必填字段是否已定义,这与之前相同。然后创建一个 LocalDateTime 对象并格式化它:

    LocalDateTime dateTime = LocalDateTime.of(
submitDate.getYear(), submitDate.getMonth(), submitDate.getDay(),
submitTime.getHour(), submitTime.getMinute(), submitTime.getSecond());
String humanReadableDateTime = dateTime.format(localizedFormatter);

我得到了与上面相同的结果。

原始答案

    final ZoneId userZone = ZoneId.of("Asia/Taipei");
final Locale userLocale = Locale.forLanguageTag("zh-TW");
ZonedDateTime submitDateTime
= Instant.ofEpochMilli(submitDate + submitTime).atZone(userZone);
DateTimeFormatter localizedFormatter = DateTimeFormatter
.ofLocalizedDateTime(FormatStyle.LONG)
.withLocale(userLocale);
String humanReadableDateTime = submitDateTime.format(localizedFormatter);
System.out.println(humanReadableDateTime);

这会打印

2018年1月16日 上午10時14分55秒

要以适合用户受众的格式显示日期和时间,您需要知道该受众的时区区域设置。一旦您知道了这些,请将它们填写在上面代码片段的前两行中。如果您信任计算机的设置,则可以使用 ZoneId.systemDefault() 和/或 Locale.getDefault(Locale.Category.FORMAT) 您还可以在格式样式之间进行选择完整。为此,我认为您可以忽略返回类型为 XMLGregorianCalendar 的信息。

作为another answer中的@user未知我假设您只需将两个数值相加即可。第一个几乎肯定表示自纪元以来的毫秒数,总和也可能表示。那么为什么它们作为两个值而不只是一个值传递呢?我最好的猜测是,他们会为任何只需要日期而不是一天中的时间的客户单独传递日期。日期值落在时区的午夜,偏移量为 +08:00,这与中国、菲律宾、马来西亚和其他十几个时区一致。

如果您有两个 XMLGregorianCalendar 对象而不是数字,则获取日期和时间的情况就不同了,但您仍然可以使用相同的方式来格式化它们。

关于Java XMLGregorianCalendar 格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49604838/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com