簡體   English   中英

Java 8 ZonedDateTime

[英]Java 8 ZonedDateTime

我正在嘗試使用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")

希望它采用以下格式,幾乎總是這樣:

2016-06-16T05:43:07.624Z

首先,聽起來您真的想要一個Instant而不是ZonedDateTime ,它使時區完全脫離了畫面。 但是無論哪種方式,只要使用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);

即使它是0,仍然會輸出毫秒值。

(如果您確實想使用ZonedDateTime ,則可以使用相同的格式化程序來使用。但是從概念上講,我認為您要表示的只是時間上的即時,而Instant更適合ZonedDateTime 。)

如果您想使用格式化程序,可以這樣構建:

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類中的代碼結合在一起)

改變基本上就是

                                        .appendFraction(NANO_OF_SECOND, 3, 9, true)

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM