簡體   English   中英

如何將 LocalDateTime 轉換為`"yyyy-MM-dd'T'HH:mm:ss'Z'"` 格式

[英]How to convert LocalDateTime to `"yyyy-MM-dd'T'HH:mm:ss'Z'"` format

我正在嘗試將格式為"yyyy-MM-dd'T'HH:mm:ss'Z'"的字符串解析為LocalDateTime ,如果日期是sundaysaturday我想將日期更改為monday並以相同的格式返回,我知道我可以使用plusDays添加天數

String str = "2018-09-22T12:30:10Z";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss'Z'");
LocalDateTime dateTime = LocalDateTime.parse(str, formatter);
System.out.println(dateTime.plusDays(2));  //2018-09-24T12:30:10

但我想以2018-09-24T12:30:10Z格式返回

tl;博士

使用Instant ,而不是LocalDateTime

Instant                                                // Represent a moment as seen in UTC (an offset of zero hours-minutes-seconds).
.parse( "2018-01-23T01:23:45.123456789Z" )             // Parse text in standard ISO 8601 format where the `Z` on the end means UTC.
.truncatedTo( java.time.temporal.ChronoUnit.SECONDS )  // Lop off any fractional second.
.plus(                                                 // Date-time math.
    Duration.ofDays( 2 )                               // Represent a span-of-time not attached to the timeline.
)                                                      // Returns another `Instant` object rather than altering the original.
.toString()                                            // Generate text in standard ISO 8601 format.

2018-01-25T01:23:45Z

ISO 8601

將格式為 "yyyy-MM-dd'T'HH:mm:ss'Z'" 的字符串解析為 LocalDateTime

你不能。 或者不應為此目的使用LocalDateTime

您的輸入字符串采用標准ISO 8601格式。 末尾的Z表示UTC ,發音為“Zulu”。 你永遠不應該忽略這個字符,因為你似乎有意在它周圍使用單引號。

Instant

將這樣的字符串解析為Instant ,UTC 中的一個時刻。

Instant instant = Instant.parse( "2018-01-23T01:23:45.123456789Z" ) ;

LocalDateTime

LocalDateTime類不能表示片刻。 它故意缺少任何時區或 UTC 偏移量的概念。 這個類代表了大約 26-27 小時范圍內的潛在時刻,全球目前使用的各個時區。

OffsetDateTime

要通過 JDBC 與數據庫通信,請使用OffsetDateTime

OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC ) ;

ZonedDateTime

要通過某個地區(時區)的人們使用的掛鍾時間的鏡頭查看該Instant的時刻,請應用ZoneId以獲取ZonedDateTime對象。

ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime zdt = instant.atZone( z ) ;

周末

要測試周末,請在EnumSet使用DayOfWeek枚舉。

Set< DayOfWeek > weekend = EnumSet.of( DayOfWeek.SATURDAY , DayOfWeek.SATURDAY ) ;

對於任何給定時刻,日期在全球各地因時區而異。 例如,在法國巴黎午夜過后幾分鍾是新的一天,而在魁北克蒙特利爾仍然是“昨天”。 因此,將Instant調整為適合您業務問題的時區,如上所示。

通過從ZonedDateTime提取DayOfWeek枚舉對象進行比較。

DayOfWeek dow = zdt.getDayOfWeek() ;

比較一下是周末還是工作日。

ZonedDateTime target = zdt ;  // Initialize.
if( weekend.contains( dow ) ) {
    target = zdt.with( TemporalAdjusters.next( DayOfWeek.MONDAY ) ) ; // Move from one day to another.
}

Java 中的日期時間類型表,現代和傳統


關於java.time

java.time框架內置於 Java 8 及更高版本中。 這些類取代麻煩的老傳統日期時間類,如java.util.DateCalendar ,和SimpleDateFormat

現在處於維護模式Joda-Time項目建議遷移到java.time類。

要了解更多信息,請參閱Oracle 教程 並在 Stack Overflow 上搜索許多示例和解釋。 規范是JSR 310

您可以直接與您的數據庫交換java.time對象。 使用符合JDBC 4.2或更高版本的JDBC 驅動程序 不需要字符串,不需要java.sql.*類。

從哪里獲得 java.time 類?

ThreeTen-Extra項目用額外的類擴展了 java.time。 該項目是未來可能添加到 java.time 的試驗場。 您可以在這里找到一些有用的類,比如IntervalYearWeekYearQuarter ,和更多

    String str = "2018-09-22T12:30:10Z";
    OffsetDateTime dateTime = OffsetDateTime.parse(str);
    DayOfWeek dow = dateTime.getDayOfWeek();
    if (dow.equals(DayOfWeek.SATURDAY) || dow.equals(DayOfWeek.SUNDAY)) {
        dateTime = dateTime.with(TemporalAdjusters.next(DayOfWeek.MONDAY));
    }
    System.out.println(dateTime);

這個片段的輸出是:

2018-09-24T12:30:10Z

它從字符串中獲取日期,在本例中為 9 月 22 日,並且由於它是星期六,它確實會調整到下一個星期一。 它不使用 JVM 的時區設置。

您的字符串采用 ISO 8601 格式,這是 java.time 中的類作為其默認解析和生成的標准格式,因此無需通過任何DateTimeFormatter指定格式。 字符串中的Z表示 UTC(換句話說,從 UTC 偏移 0),因此將其解析為偏移量並解析為OffsetDateTime而不是LocalDateTime以保留字符串中的所有信息。 這也使得返回相同格式變得容易。

如果需要返回String ,請使用dateTime.toString()

轉換為Instant時間。

System.out.println(dateTime.plusDays(2).toInstant(ZoneOffset.UTC)));

試試這個

String str = "2018-09-22T12:30:10Z";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss'Z'");
LocalDateTime dateTime = LocalDateTime.parse(str, formatter);
System.out.println(dateTime.plusDays(2).format(formatter));

輸出:

2018-09-24T12:30:10Z

暫無
暫無

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

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