我需要在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的价值。 我不确定如何实现它。
答案 0 :(得分:0)
您正在使用与最早版本的Java捆绑在一起的过时的旧日期时间类。事实证明,它们设计糟糕,令人困惑且麻烦。避免它们。
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 或时区信息的字符串。这与传输货币金额一样不明智,而没有注明哪种货币(USD,CAD,MXN等)。
此类日期时间值与字符串的序列化应尽可能坚持ISO 8601定义的合理且直观的格式。