首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java 8 ZonedDateTime

Java 8 ZonedDateTime
EN

Stack Overflow用户
提问于 2016-06-16 05:42:15
回答 2查看 668关注 0票数 1

我正在尝试使用ZonedDateTime.now(ZoneOffset.UTC).toString()获取当前时间。它工作得很好,但当它们处于滚动(00.000Z)时,似乎会切断秒/毫秒,或者看起来是这样的。通常情况下,这并不重要,但我正在将数据写入ElasticSearch,它对所传递的日期(获取的时间)有严格的映射。

我可能对我认为正在发生的事情感到失望,但我想确保我总是能够提供一个以秒和毫秒为单位的日期/时间。

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

代码语言:javascript
复制
def utcDate = ZonedDateTime.now(ZoneOffset.UTC)
def utcDateStr = utcDate.toString()
utcDateStr = utcDateStr.contains(".") ? utcDateStr
        : utcDateStr.replace("Z","").concat(".000Z")

希望它的格式如下,几乎总是这样:

代码语言:javascript
复制
2016-06-16T05:43:07.624Z
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-06-16 05:54:42

首先,听起来你真的很想要一个Instant,而不是一个ZonedDateTime --它把时区部分完全从图片中去掉了。但是,无论哪种方式,只要使用一个DateTimeFormatter来格式化你想要的值。

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

代码语言:javascript
复制
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);

即使它是0,它仍然会输出毫秒值。

(如果您真的想使用ZonedDateTime,可以使用相同的格式化程序。但从概念上讲,我认为您试图表示的只是一个瞬间,而Instant更适合这一点。)

票数 5
EN

Stack Overflow用户

发布于 2016-06-16 11:14:49

如果您想要走格式化路径,您可以构建如下所示的一个:

代码语言:javascript
复制
DateTimeFormatter ES_ISO8601_FORMATTER = new DateTimeFormatterBuilder()
            .parseCaseInsensitive()
            .append(
                    new DateTimeFormatterBuilder()
                            .parseCaseInsensitive()
                            .append(ISO_LOCAL_DATE)
                            .appendLiteral('T')
                            .append(
                                    new DateTimeFormatterBuilder()
                                            .appendValue(HOUR_OF_DAY, 2)
                                            .appendLiteral(':')
                                            .appendValue(MINUTE_OF_HOUR, 2)
                                            .appendLiteral(':')
                                            .appendValue(SECOND_OF_MINUTE, 2)
                                            .appendFraction(NANO_OF_SECOND, 3, 9, true)
                                            .toFormatter()
                            )
                            .toFormatter()
            )
            .appendOffsetId()
            .toFormatter();

(这是Java 8中DateTimeFormatter类中的代码拼凑而成的)

这种变化基本上是

代码语言:javascript
复制
                                        .appendFraction(NANO_OF_SECOND, 3, 9, true)

最小宽度为3,而不是原始ISO格式化程序中的0

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37850735

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档