【问题标题】:Joda DateTime ISODateTimeFormat patternJoda DateTime ISODateTimeFormat 模式
【发布时间】:2020-01-08 21:49:15
【问题描述】:

Joda ISODateTimeFormat 文档说 ISODateTimeFormat.dateTime() 返回模式 yyyy-MM-dd'T'HH:mm:ss.SSSZZ

的格式化程序

但格式化程序返回一个“Z”代替 +00:00
看到这个-

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() 中找到了我所追求的东西,所以我现在只问兴趣清酒)

【问题讨论】:

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

标签: java datetime jodatime


【解决方案1】:

您似乎无法纯粹从模式构建这样的格式化程序。 DateTimeFormat 文档说:

区域

  • 'Z' 输出不带冒号的偏移量,
  • 'ZZ' 用冒号输出偏移量,
  • 'ZZZ' 或更多输出区域 id。

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

    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)
【解决方案2】:
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。 p>

在您的代码中查看非零大小写,尝试使用

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

【讨论】:

  • 感谢您的回复。我对我的问题进行了澄清。我知道 Z 和 +00:00 是一回事,但我想问我将使用什么模式来显示 Z 而不是 +00:00。如果我使用 DateTime.now() 它会使用我的默认偏移量创建一个日期。又是完全不同的东西。
  • @DavePile 您关于DateTime.now() 具有默认偏移量的问题是一个正交问题,与您生成的字符串格式的主要问题无关。关键思想:如果您未能指定时区,则将 JVM 的当前默认时区分配给新的 DateTime 对象。 如果您希望“现在”日期时间值采用 UTC(或其他格式) ,然后这么说。像这样:DateTime.now( DateTimeZone.UTC )。或者魁北克当地时间:DateTime.now( DateTimeZone.forID( "America/Montreal") ).
【解决方案3】:

如果您知道您的 TimeZone 将始终为 DateTimeZone.UTC,那么您可以在模式中注入 Z,就像注入 T 字符一样。像这样的:

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 参考页面了解有关这些格式和其他选项的详细信息。

【讨论】:

    【解决方案4】:

    'Z'Zulu time的简称,与GMTUTC相同

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      • 2015-01-24
      • 1970-01-01
      • 2018-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多