我正在尝试获取 joda 时间中日期字符串的 DateTimeFormatter
I am trying to get the DateTimeFormatter for a date string in joda time
我需要格式如下的日期格式字符串:2017-06-14T00:00:00Z
。
目前,我有:
DateTimeFormatter DT_SCHEDULE_FORMATTER_START_TIME = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ssZ");
如果我用这个解析字符串 2017-06-14T00:00:00Z
,它会给我正确的 UTC 时间。
但是当我拿一个 DateTime
对象并尝试做时:
String strNow = new DateTime().toString(DT_SCHEDULE_FORMATTER_START_TIME);
我得到了 2017-06-14T00:00:00 -07:00
我查看了文档,似乎找不到正确的格式字符串。
您可以尝试使用parseDateTime函数
DateTimeFormatter f = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ssZ");
DateTime dateTime = f.parseDateTime("2017-06-14T00:00:00Z");
希望对您有所帮助。
那是因为 DateTime()
constructor uses your system's default timezone, and the Z
pattern in the formatter prints the timezone offset.
您系统的默认时区偏移量是 -07:00
,这就是您得到此输出的原因。
如果你想要最后 Z
的输出,你必须将 DateTime
对象转换为 org.joda.time.Instant
:
String strNow = new DateTime("2017-06-14T00:00:00Z").toInstant().toString();
strNow
将是 2017-06-14T00:00:00.000Z
.
如果你想获得 UTC 的当前时间(而不是解析 String
),你必须明确告诉 DateTime
构造函数使用 UTC,使用 new DateTime(DateTimeZone.UTC)
。
上面的代码还打印了毫秒数。如果您不想这样做,另一种选择是使用 DateTimeFormatterBuilder
:
DateTimeFormatter formatter = new DateTimeFormatterBuilder()
.appendPattern("yyyy-MM-dd'T'HH:mm:ss")
// append Z if offset is zero (UTC)
.appendTimeZoneOffset("Z", true, 2, 2)
// create formatter
.toFormatter();
String strNow = new DateTime("2017-06-14T00:00:00Z").toInstant().toString(formatter);
这将格式化日期(不带毫秒):
2017-06-14T00:00:00Z
"Z" 格式为 RFC 822 时区
For formatting, if the offset value from GMT is 0, "Z" is produced. If
the number of pattern letters is 1, any fraction of an hour is
ignored.
For parsing, "Z" is parsed as the UTC time zone designator. General
time zones are not accepted.
如果您想获取 UTC 字符串 - 您应该强制使用时区:
DateTime dateTime = new DateTime(DateTimeZone.UTC);
String strNow = dateTime.toString(DT_SCHEDULE_FORMATTER_START_TIME);
我需要格式如下的日期格式字符串:2017-06-14T00:00:00Z
。
目前,我有:
DateTimeFormatter DT_SCHEDULE_FORMATTER_START_TIME = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ssZ");
如果我用这个解析字符串 2017-06-14T00:00:00Z
,它会给我正确的 UTC 时间。
但是当我拿一个 DateTime
对象并尝试做时:
String strNow = new DateTime().toString(DT_SCHEDULE_FORMATTER_START_TIME);
我得到了 2017-06-14T00:00:00 -07:00
我查看了文档,似乎找不到正确的格式字符串。
您可以尝试使用parseDateTime函数
DateTimeFormatter f = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ssZ");
DateTime dateTime = f.parseDateTime("2017-06-14T00:00:00Z");
希望对您有所帮助。
那是因为 DateTime()
constructor uses your system's default timezone, and the Z
pattern in the formatter prints the timezone offset.
您系统的默认时区偏移量是 -07:00
,这就是您得到此输出的原因。
如果你想要最后 Z
的输出,你必须将 DateTime
对象转换为 org.joda.time.Instant
:
String strNow = new DateTime("2017-06-14T00:00:00Z").toInstant().toString();
strNow
将是 2017-06-14T00:00:00.000Z
.
如果你想获得 UTC 的当前时间(而不是解析 String
),你必须明确告诉 DateTime
构造函数使用 UTC,使用 new DateTime(DateTimeZone.UTC)
。
上面的代码还打印了毫秒数。如果您不想这样做,另一种选择是使用 DateTimeFormatterBuilder
:
DateTimeFormatter formatter = new DateTimeFormatterBuilder()
.appendPattern("yyyy-MM-dd'T'HH:mm:ss")
// append Z if offset is zero (UTC)
.appendTimeZoneOffset("Z", true, 2, 2)
// create formatter
.toFormatter();
String strNow = new DateTime("2017-06-14T00:00:00Z").toInstant().toString(formatter);
这将格式化日期(不带毫秒):
2017-06-14T00:00:00Z
"Z" 格式为 RFC 822 时区
For formatting, if the offset value from GMT is 0, "Z" is produced. If the number of pattern letters is 1, any fraction of an hour is ignored.
For parsing, "Z" is parsed as the UTC time zone designator. General time zones are not accepted.
如果您想获取 UTC 字符串 - 您应该强制使用时区:
DateTime dateTime = new DateTime(DateTimeZone.UTC);
String strNow = dateTime.toString(DT_SCHEDULE_FORMATTER_START_TIME);