在java中将日期从一种格式转换为另一种格式[重复]

Posted

技术标签:

【中文标题】在java中将日期从一种格式转换为另一种格式[重复]【英文标题】:convert date from one format to another in java [duplicate] 【发布时间】:2016-03-28 13:13:22 【问题描述】:

我需要在 java 中将日期从一种格式转换为另一种格式。在这里,我没有将日期从一种格式转换为另一种格式。首先我必须从 XMLGregorianCalendar 检索,然后我必须将其转换为 yyyyDDDHHmmssSSS,这应该与下面通过硬编码解释的相同。

问题:

我在字符串中硬编码了一个值,然后我尝试转换为日期,然后再转换回原始值(yyyyDDDHHmmssSSS)格式,我得到的预期值如下。

SimpleDateFormat sdf1 = new SimpleDateFormat("yyyyDDDHHmmssSSS");
String t  ="20160690600530";
Date dateq = sdf1.parse(t);
System.out.println("After converting"+   dateq );
System.out.println("normalTest--->"+sdf1.format(dateq));

输出:(预期的)

Wed Mar 09 06:00:53 EST 2016  
sss-->2016069010053000

我尝试将 XMLGregorianCalendar 中的值转换为 yyyyDDDHHmmssSSS 的方法相同,但我得到的值与上述不同。

Pojo ddd = new Pojo();
XMLGregorianCalendar  gregorianCalendar = DatatypeFactory.newInstance().newXMLGregorianCalendar("2016-03-09T06:00:53.0Z");
ddd.setMemberEffectiveTimestamp(gregorianCalendar);
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyyDDDHHmmssSSS");
Date date1 = ddd.getMemberEffectiveTimestamp().toGregorianCalendar().getTime();
System.out.println("date1--->"+date1);
System.out.println("sss-->"+ sdf1.format(date1));

输出:

date1--->Wed Mar 09 01:00:53 EST 2016
sss-->2016069010053000

我需要将“2016-03-09T06:00:53.0Z”转换为 2016069010053000 值。 我不确定如何实现它。

【问题讨论】:

你需要这个吗? ***.com/questions/17692863/… 您在GMT+5 时区吗?如果你需要Z 时区,我建议你setTimeZone 到格林威治标准时间。 @bharanthi 您是否打算完全使用 UTC 作为每个值的时区? 【参考方案1】:

避免使用旧的日期项类

您正在使用与最早版本的 Java 捆绑在一起的过时的旧日期时间类。事实证明,它们设计不佳、令人困惑且麻烦。避开他们。

java.time

Java 8 及更高版本带有内置的java.time 框架。巨大的进步!

在 java.time 中,Instant 是 UTC 时间线上的一个时刻。

您的输入字符串符合ISO 8601 格式。 java.time 类在解析/生成其日期时间值的字符串表示时默认使用 ISO 8601 格式。所以不需要指定格式模式。 Instant 类可以直接解析这样的字符串。

String input = "2016-03-09T06:00:53.0Z";
Instant instant = Instant.parse ( input );

Instant 仅用作基本构建块。因此,为了生成格式化字符串,我们必须转换为 OffsetDateTime 对象。您显然想要相同的 UTC 时区,因此我们指定常量 ZoneOffset.UTC

OffsetDateTime odt = OffsetDateTime.ofInstant ( instant , ZoneOffset.UTC );

我们定义了一个DateTimeFormatter 来使用您的模式。读者应注意,所需的模式使用大写-D DDD 模式,表示一年中的某天(1 到 365/366 之间的计数)。

DateTimeFormatter formatter = DateTimeFormatter.ofPattern ( "yyyyDDDHHmmssSSS" );
String output = odt.format ( formatter );

转储到控制台。

System.out.println ( "input: " + input + " = instant: " + instant + " = odt: " + odt + " = output: " + output );

运行时。

输入:2016-03-09T06:00:53.0Z = 即时:2016-03-09T06:00:53Z = odt:2016-03-09T06:00:53Z = 输出:2016069060053000

注意:我强烈建议不要生成此类缺少任何offset-from-UTC 或时区信息的字符串。这就像在不注明哪种货币(美元、加元、墨西哥比索等)的情况下传输货币金额一样不明智。

此类将日期时间值序列化为字符串的方式应尽可能遵循 ISO 8601 定义的合理直观的格式。

【讨论】:

以上是关于在java中将日期从一种格式转换为另一种格式[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在 PHP 中将一种日期格式转换为另一种日期格式

如何在java中使用日光将日期格式从一个时区转换为另一种时区[重复]

如何将字符串类型的日期转换为另一种日期格式。 |颤振 |飞镖[重复]

在linux bash中将ISO日期转换为纪元以来的秒数

无法将日期时间从字符串转换为另一种格式(例如:14/12/2021 03:34:03 PM 到 03:34 pm)

使用linux工具将行从一种格式转换为另一种格式[关闭]