Java 8 ZonedDateTime

sca*_*cci 1 java groovy

我正在尝试使用ZonedDateTime.now(ZoneOffset.UTC).toString()来获取当前时间.它运行良好,但似乎在它们正好翻转(00.000Z)时切断秒/毫秒,或者它出现.通常它没关系,但我正在将数据写入ElasticSearch,它对我传递的日期(获取时间)有严格的映射.

我可能正在思考正在发生的事情,但我想确保我总能提供秒和毫秒的日期/时间.

基本代码片段(第一遍是添加毫秒,但是也可能省略秒数):

def utcDate = ZonedDateTime.now(ZoneOffset.UTC)
def utcDateStr = utcDate.toString()
utcDateStr = utcDateStr.contains(".") ? utcDateStr
        : utcDateStr.replace("Z","").concat(".000Z")
Run Code Online (Sandbox Code Playgroud)

希望它采用以下格式,几乎总是如下:

2016-06-16T05:43:07.624Z
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 5

首先,听起来你真的想要一个Instant而不是一个ZonedDateTime- 它将时区部分完全取出.但无论哪种方式,只需使用a DateTimeFormatter格式化您想要的值.

听起来你想要的东西(在Java中;适当地调整到Groovy):

DateTimeFormatter formatter = DateTimeFormatter
    .ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.US)
    .withZone(ZoneOffset.UTC);
Instant now = Instant.now();
String text = formatter.format(now); 
System.out.println(text);
Run Code Online (Sandbox Code Playgroud)

即使它为0,它仍将输出毫秒值.

(如果你真的想使用ZonedDateTime,你可以使用相同的格式化程序.但从概念上讲,我认为你想要代表的只是一个瞬间,并且Instant更适合它.)