用Java将一种日期时间格式转换为另一种



我遇到了一种情况,我需要将一种Java日期-时间格式转换为另一种格式,但一直在做这件事。我已经寻找了很长时间的解决方案,并尝试了许多不起作用的事情,但我束手无策:(.

我必须从年-月-日'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";

收入日期=2021-10-22T06:39:13Z出站日期=2021-10-22T06:39:13Z

我相信这可能只是最天真的尝试。我试过标准化日期格式,然后重新格式化,但没有成功。

我只是有点喘不过气来。一如既往,我们非常感谢来自这个不可思议的社区的任何帮助!


更新


我只是想指出,这种方法的输入和输出是";即时"很抱歉一开始没有说清楚。

我必须从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

tl;dr

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本初子午线偏移0小时分秒。

您要求生成以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 ) ;

要了解更多信息,请搜索"堆栈溢出"。这些议题已经被讨论了很多次。

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

相关内容

  • 没有找到相关文章

最新更新