【问题标题】:Converting one date time format into another in Java在 Java 中将一种日期时间格式转换为另一种日期时间格式
【发布时间】:2022-01-19 21:27:58
【问题描述】:

我有一种情况,我需要将一种 Java 日期时间格式转换为另一种,但我一直在做这件事。长期以来一直在寻找解决方案,并尝试了许多无效的方法,但我无能为力:(。

我必须从 yyyy-MM-dd'T'HH:mm:ssMM/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";

incomingDate = 2021-10-22T06:39:13Z 和离任日期 = 2021-10-22T06:39:13Z

我敢肯定这可能只是最天真的尝试。 我试过标准化日期格式,然后重新格式化,但不行。

我有点没劲了。 一如既往,非常感谢这个令人难以置信的社区提供的任何和所有帮助!


更新


我只是想指出这个方法的输入和输出是“Instant”类型的。 很抱歉一开始没有说清楚。

【问题讨论】:

  • 这毫无意义。您收到 Instant 并返回 Instant?你想返回一个代表时间轴上不同点的值吗?否则,return incomingDate;

标签: java datetime datetime-format data-conversion datetimeformatter


【解决方案1】:

我必须从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,这是一个分区日期时间,并且可以使用 parse-from/formatted-to DateTimeFormatter.ISO_ZONED_DATE_TIME.

【讨论】:

  • 或者,更简单地说,LocalDateTime.parse( datetime )。该格式化程序被隐式使用。
  • 谢谢@WJS 这个解决方案效果很好!干杯! :D
【解决方案2】:

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.

看到这个code run live at IdeOne.com

10/22/2021 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。我建议包括偏移量或时区的指标。但如果您坚持忽略这一点,请继续阅读。

从基本类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。这些话题已经讨论过很多次了。

【讨论】:

  • 感谢您提供此解决方案@Basil Bourque!
【解决方案3】:

在格式模式末尾附加时区“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));
    }

}

【讨论】:

  • 感谢 @dev101 的解决方案!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-27
相关资源
最近更新 更多