提问人:Atul 提问时间:4/12/2023 最后编辑:Arvind Kumar AvinashAtul 更新时间:4/13/2023 访问量:316
在 DateTimeFormatter 中打印 GMT+00:00
Print GMT+00:00 in DateTimeFormatter
问:
我需要打印日期,如下所示"Fri Feb 24 2023 13:57:11 GMT+00:00"
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("E MMM d u H:m:s O", Locale.ENGLISH);
OffsetDateTime odt = OffsetDateTime.ofInstant(date.toInstant(), ZoneOffset.of("+05:30"));
String strDate = odt.format(dtf);
我可以像这样打印它"Fri Feb 24 2023 19:27:11 GMT+5:30".
但是如果我使用
OffsetDateTime odt = OffsetDateTime.ofInstant(date.toInstant(), ZoneOffset.of("+00:00"));
它打印为没有 如何在 java 中添加它?"Fri Feb 24 2023 13:57:11 GMT"
+00:00
答:
2赞
Arvind Kumar Avinash
4/12/2023
#1
避免对局部区域偏移进行硬编码
避免对局部区域偏移进行硬编码(例如“GMT”)。DateTimeFormatter
已经为您提供了处理本地化区域偏移的模式。O
演示:
class Main {
public static void main(String[] args) {
Calendar calendar = Calendar.getInstance();
calendar.set(2023, 1, 24, 13, 57, 11);
Date date = calendar.getTime();
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("E MMM d u H:m:s Oxxx", Locale.ENGLISH);
ZonedDateTime zdt = ZonedDateTime.ofInstant(date.toInstant(), ZoneOffset.UTC);
String strDate = zdt.format(dtf);
System.out.println(strDate);
}
}
输出:
Fri Feb 24 2023 13:57:11 GMT+00:00
从 Trail: Date Time 了解有关新式日期时间 API 的更多信息。
评论
1赞
Miss Chanandler Bong
4/12/2023
如果区域偏移量为“+05:00”,则打印此值。Wed Apr 12 2023 14:44:41 GMT+5+05:00
0赞
Arvind Kumar Avinash
4/12/2023
@MissChanandlerBong - 这不是必需的。OP 已经提到过,即 OP 没有不同偏移量的问题。这个答案正好满足了要求。I can print it like "Fri Feb 24 2023 19:27:11 GMT+5:30"
0赞
Miss Chanandler Bong
4/12/2023
你是对的。它满足特殊情况的要求,但也不能用于更一般的情况。
1赞
Anonymous
4/12/2023
另外,当 OP 有一个老式的,一方面我们想提供一个工作示例,另一方面我们不想不必要地使用过时和设计不佳的类时,你会怎么做?我建议.还有其他可能性而不涉及.Date
Date.from(OffsetDateTime.parse("2023-02-24T19:27:11+05:30").toInstant())
Calendar
1赞
Arvind Kumar Avinash
4/12/2023
@OleV.V.感谢您的反馈。但是,我更喜欢我的答案,而不是在模式中进行硬编码。对于任何时区,都可以简单地使用(在 UTC/GMT 的情况下打印)。只是 OP 明确希望在 GMT 之后,这不是标准方式,因此我添加了模式以满足他的要求。"GMT"
DateTimeFormatter.ofPattern("E MMM d u H:m:s O", Locale.ENGLISH)
Fri Feb 24 2023 19:27:11 GMT
00:00
xxx
1赞
Miss Chanandler Bong
4/12/2023
#2
根据文档,是.如果您查看 ,您会发现该选项映射到名为 的解析器。以下是在没有区域偏移的情况下进行打印的代码部分:O
localized zone-offset
DateTimeFormatterBuilder
O
LocalizedOffsetIdPrinterParser
GMT
if (totalSecs != 0) {
...
}
return true;
由于秒数完全不同,因此不会执行此代码块。+00:00
0
下面是一个示例,说明如何使用 DateTimeFormatterBuilder#appendOffset(pattern, noOffsetText)
强制打印区域偏移量,即使它是:00:00
DateTimeFormatterBuilder dateTimeFormatterBuilder = new DateTimeFormatterBuilder()
.parseCaseInsensitive()
.append(DateTimeFormatter.ofPattern("E MMM d u H:m:s 'GMT'"))
.appendOffset("+HH:MM", "+00:00"); // +HH:MM - hour and minute, ignoring second, with colon
DateTimeFormatter formatter = dateTimeFormatterBuilder.toFormatter(Locale.ENGLISH);
System.out.println(odt.format(formatter));
评论
1赞
Arvind Kumar Avinash
4/12/2023
.appendLiteral("GMT")
与模式中的硬编码没有什么不同,正如 Ole V.V. 在他的评论中已经以简洁的方式所做的那样。此外,在这种情况下没有使用。"GMT"
.parseCaseInsensitive()
0赞
Miss Chanandler Bong
4/12/2023
附加“GMT”而不使用将导致问题,因为它是以时间格式保留的。“GMT”也是硬编码的,在这里编码也没有问题。 在这里用于使格式化程序也能够解析日期。它对于格式化并不重要,但此格式化程序也可以用作代码中其他位置的解析器。此外,大多数 JDK 内置格式化程序也使用相同的方法。appendLiteral
T
DateTimeFormatBuilder
parseCaseInsensitive()
0赞
Anonymous
4/12/2023
我们是否需要检查构建器的源代码才能理解这一点?请允许我建议,您链接到的文档应该足够了。DateTimeFormatter
0赞
Miss Chanandler Bong
4/12/2023
@ArvindKumarAvinash 我之前没有注意到这条评论,但无论如何,使用 .appendLiteral("GMT")
评论
Four letters outputs the full form, which is localized offset text, such as 'GMT, with 2-digit hour and minute field, optional second field if non-zero, and colon, for example 'GMT+08:00'
GMT
+00:00
DateTimeFormatter.ofPattern("E MMM d u H:m:s 'GMT'xxx", Locale.ENGLISH)
OffsetDateTime.ofInstant(date.toInstant(), ZoneOffset.UTC)
Fri Feb 24 2023 13:57:11 GMT+00:00