簡體   English   中英

在 Java 中將一種日期時間格式轉換為另一種

[英]Converting one date time format into another in Java

我有一種情況,我需要將一種 Java 日期時間格式轉換為另一種日期時間格式,但這樣做已經有一段時間了。 長期以來一直在尋找解決方案,並嘗試了許多不起作用的方法,但我無能為力:(。

我必須從yyyy-MM-dd'T'HH:mm:ss轉換為MM/dd/yyyy HH:mm:ss

這是我嘗試過的最后一件事,但可惜它在轉換模式方面根本沒有效果:

private Instant convertInstantFormat(Instant incomingDate) {
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern(AUTH_DATE_PATTERN)
        .withZone(ZoneId.systemDefault());
    return Instant.parse(formatter.format(incomingDate));
}

在哪里

AUTH_DATE_PATTERN = "MM/dd/yyyy HH:mm:ss";

傳入日期 = 2021-10-22T06:39:13Z 和傳出日期 = 2021-10-22T06:39:13Z

我敢肯定,這可能只是最天真的嘗試。 我試過標准化日期格式然后重新格式化,但沒有 go。

我只是有點沒勁了。 與往常一樣,非常感謝這個令人難以置信的社區提供的任何和所有幫助!


更新


我只是想指出,此方法的輸入和 output 屬於“即時”類型。 很抱歉一開始沒有說清楚。

我必須從yyyy-MM-dd'T'HH:mm:ss轉換為MM/dd/yyyy HH:mm:ss

您的傳入日期時間格式為 ISO_LOCAL_DATE_TIME。

String datetime = "2021-12-16T16:22:34";
LocalDateTime source = LocalDateTime.parse(datetime,DateTimeFormatter.ISO_LOCAL_DATE_TIME);

// desired output format
String AUTH_DATE_PATTERN = "MM/dd/yyyy HH:mm:ss";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(AUTH_DATE_PATTERN);
String output = source.format(formatter);
System.out.println(output);

印刷

12/16/2021 16:22:34

如果您的傳入日期是2021-10-22T06:39:13Z ,這是一個分區日期時間,可以使用DateTimeFormatter.ISO_ZONED_DATE_TIME進行解析/格式化。

格式模式末尾的 Append 時區“z”信息,否則解析會引發異常。

這是一個工作示例。

單元測試(通過)

import org.junit.jupiter.api.Test;
import static org.assertj.core.api.Assertions.assertThat;

class DateFormatConverterTest {

    @Test
    void convertDate() {
        final String incomingDate = "2021-10-22T06:39:13Z";
        final String expectedOutgoingDate = "2021/10/22T06:39:13Z";

        String actualOutgoingDate = new DateFormatConverter().convertDate(incomingDate);
        assertThat(actualOutgoingDate).isEqualTo(expectedOutgoingDate);
    }

}

執行

import java.time.format.DateTimeFormatter;

public class DateFormatConverter {

    private static final DateTimeFormatter INCOMING_DATE_TIME_FORMAT = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssz");
    private static final DateTimeFormatter OUTGOING_DATE_TIME_FORMAT = DateTimeFormatter.ofPattern("yyyy/MM/dd'T'HH:mm:ssz");

    String convertDate(String incoming) {
        return OUTGOING_DATE_TIME_FORMAT.format(INCOMING_DATE_TIME_FORMAT.parse(incoming));
    }

}

tl;博士

Instant                           // Represents a point on the time line. 
.parse( "2021-10-22T06:39:13Z" )  // Returns an `Instant` object. By default, parses text in standard ISO 8601 for at where `Z` means offset of zero.
.atOffset( ZoneOffset.UTC )       // Returns an `OffsetDateTime` object. 
.format(
    DateTimeFormatter.ofPattern( "MM/dd/uuuu HH:mm:ss" )
)                                 // Returns a `String` object.

請參閱在 IdeOne.com 上實時運行的代碼

2021 年 10 月 22 日 06:39:13

細節

你說:

incomingDate = 2021-10-22T06:39:13Z

您的格式化模式與您的輸入字符串不匹配。

您的輸入字符串恰好符合Instant.parse中默認使用的 ISO 8691 格式。 所以不需要指定格式模式。

Instant instant = Instant.parse( "2021-10-22T06:39:13Z" ) ;

末尾的Z表示距 UTC 的本初子午線零時分秒的偏移量。

您要求生成表示該時刻的文本,格式為 MM/dd/yyyy HH:mm:ss。 我建議包括偏移量或時區的指標。 但是,如果您堅持忽略這一點,請繼續閱讀。

從基本的 class Instant轉換為更靈活OffsetDateTime

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

指定您的格式模式。

DateTimeFormatter f = DateTimeFormatter.ofPattern( "MM/dd/uuuu HH:mm:ss" ) ;

生成所需的文本。

String output = odt.format( f ) ;

要了解更多信息,請搜索 Stack Overflow。 這些話題已經被討論過很多次了。

暫無
暫無

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

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