我想在joda时间

时间:2017-07-07 13:23:39

标签: android jodatime datetime-format

我需要格式字符串,格式如下: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

的内容

我查看了文档,似乎无法找到正确的格式化字符串。

3 个答案:

答案 0 :(得分:2)

这是因为格式化程序DateTime() constructor uses your system's default timezone中的prints the timezone offsetZ模式。

您系统的默认时区偏移量为-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明确告知new DateTime(DateTimeZone.UTC)构造函数使用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);

这将格式化日期accinlgy(没有毫秒):

  

2017-06-14T00:00:00Z

答案 1 :(得分:1)

您可以尝试使用parseDateTime函数

DateTimeFormatter f = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ssZ");
DateTime dateTime = f.parseDateTime("2017-06-14T00:00:00Z");

希望它会有所帮助。

答案 2 :(得分:1)

" Z"格式为RFC 822时区

  

对于格式化,如果GMT的偏移值为0,则" Z"被生产。如果   模式字母的数量是1,一小时的任何一小部分   忽略。

     

用于解析," Z"被解析为UTC时区指示符。一般   时区不被接受。

如果你想获得UTC的字符串 - 你应该强制时区:

DateTime dateTime = new DateTime(DateTimeZone.UTC);
String strNow = dateTime.toString(DT_SCHEDULE_FORMATTER_START_TIME);