Joda DateTime ISODateTimeFormat pattern

20

Joda的ISODateTimeFormat文档中表示ISODateTimeFormat.dateTime()返回一个格式化程序,其模式为yyyy-MM-dd'T'HH:mm:ss.SSSZZ

但是该格式化程序会在+00:00的位置返回"Z"
请参阅以下内容-

DateTime dt = DateTime.now(DateTimeZone.UTC);

DateTimeFormatter patternFormat = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZZ");
DateTimeFormatter isoFormat = ISODateTimeFormat.dateTime();

System.out.println(dt.toString(patternFormat));     //2014-06-01T03:02:13.552+00:00
System.out.println(dt.toString(isoFormat));         //2014-06-01T03:02:13.552Z

有人能告诉我获取+00:00的格式打印为Z的模式是什么吗?
编辑: 只想澄清一下,我知道“Z”和“+00:00”是相同的,但在文本上它们是不同的。我的问题是,什么样的模式会将Z作为时间偏移量而不是+00:00。
(如果这太琐碎了,我想使用ISO格式,没有毫秒,并且在写这个问题的过程中,我在ISODateTimeFormat.dateTimeNoMillis()中找到了我想要的东西,所以现在只是出于兴趣问一下)

5
这个问题似乎被误解了。我认为问题是:为什么具有偏移量为零(+00:00)的Joda-Time日期时间值有时会生成以“Z”结尾的字符串,有时则以“+00:00”结尾?我该如何指定其中一个而不是另一个结尾? - Basil Bourque
4个回答

18

看起来您不能仅通过模式构建这样的格式化程序。DateTimeFormat文档中说:

时区:

  • 'Z' 输出偏移量但不带冒号,
  • 'ZZ' 输出带有冒号的偏移量,
  • 'ZZZ' 或更多输出区域标识符。

您可以根据模式构建大部分格式化程序,然后像这样自定义时区输出:

    DateTimeFormatter patternFormat = new DateTimeFormatterBuilder()
        .appendPattern("yyyy-MM-dd'T'HH:mm:ss.SSS")
        .appendTimeZoneOffset("Z", true, 2, 4)
        .toFormatter();

对于那些第一次阅读时无法理解的人,定制 appendTimeZoneOffset 的第一个参数即可。例如,不要调用 .appendTimeZoneOffset("Z", true, 2, 4),而是将其更改为 .appendTimeZoneOffset("+00:00", true, 2, 4) - vanomart

3
But the formatter returns a "Z" in place of +00:00 see this-

再次查看文档,它清楚地说明了:
The time zone offset is 'Z' for zero, and of the form '±HH:mm' for non-zero.

因此,ISO值2014-06-01T03:02:13.552Z等同于2014-06-01T03:02:13.552+00:00

在您的代码中查看非零情况,请尝试使用

DateTime dt = DateTime.now(); //without arg DateTimeZone.UTC;

1
谢谢回复。我已经对我的问题进行了澄清。我知道Z和+00:00是一样的,但我想知道我应该使用什么模式来显示Z而不是+00:00。如果我使用DateTime.now(),它会创建一个带有默认偏移量的日期。这与我的问题又有所不同。 - Dave Pile
1
@DavePile 你关于DateTime.now()是否有默认偏移量的问题是一个正交问题,与你主要提出的生成字符串格式无关。关键思想:如果您未指定时区,则JVM的当前默认时区将分配给新的DateTime对象。 如果您希望“现在”的日期时间值为UTC(或其他任何值),请明确说明。像这样:DateTime.now(DateTimeZone.UTC)。或者对于当地的魁北克时间:DateTime.now(DateTimeZone.forID("America/Montreal")) - Basil Bourque

1
如果您知道您的时区始终为DateTimeZone.UTC,则可以像注入T字符一样在模式中注入Z。类似这样:
DateTimeFormatter patternFormat = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");

如果您想保持相同的格式但不需要毫秒级别的时间,那么模式可能如下所示:

DateTimeFormatter patternFormat = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss'Z'");

我相信你已经找到了这个页面,但是请参考Joda Time Formatting 参考页面了解有关这些格式和其他选项的详细信息。


0

'Z'Zulu 时间 的简称,与 GMTUTC 相同。

我认为这就是你需要的..!!

int offset = DateTimeZone.forID("UTC").getOffset(new DateTime());

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接