2017-07-07 31 views
1

我需要格式化字符串格式为这样的日期:2017-06-14T00:00:00Z我想在日期字符串中得到DateTimeFormatter约达时间

目前,我有:

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

我看过的文档中,似乎无法找到合适的格式化字符串。

回答

1

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

系统的默认时区偏移量为-07:00,这就是为什么你会得到这个输出。

如果你想正好与Z到底输出,必须将DateTime对象转换为org.joda.time.Instant

String strNow = new DateTime("2017-06-14T00:00:00Z").toInstant().toString(); 

strNow2017-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); 

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

2017-06-14T00:00:00Z

1

你可以尝试使用parseDateTime功能

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

希望这将有助于。

1

“Z” 在格式是RFC 822时区

对于格式化,如果偏移VALU来自格林威治标准时间的是0,产生“Z”。如果 模式字母的数量是1,则任何一小时的小数部分都会被忽略 。

对于解析,“Z”被解析为UTC时区指示符。一般 时区不被接受。

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

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