我们如何将yyyy-MM-dd-HH.mm.ss.SSSSSS转换为yyyy-MM-dd’T’HH:mm:ss.SSSz在Java中?

任何人都可以告诉我,我们如何在yyyy-MM-dd-HH.mm.ss.SSSSSS格式yyyy-MM-dd-HH.mm.ss.SSSSSS日期转换为yyyy-MM-dd-HH.mm.ss.SSSSSS中的日期yyyy-MM-dd'T'HH:mm:ss.SSSz在Java中,两者都在输入和输出日期应该是字符串。

我已经使用了apache DateFormatUtils但是在输出中没有给出毫秒数。

Java 8+

您还可以在Java 8中使用较新的Time API ,类似于……

 String formatIn = "yyyy-MM-dd-HH.mm.ss.SSSSSS"; String formatOut = "yyyy-MM-dd'T'HH:mm:ss.SSSz"; String valueIn = "2016-01-19-09.55.00.000000"; LocalDateTime ldt = LocalDateTime.parse(valueIn, DateTimeFormatter.ofPattern(formatIn)); System.out.println("< " + ldt); ZonedDateTime zdt = ZonedDateTime.of(ldt, ZoneId.systemDefault()); String out = DateTimeFormatter.ofPattern(formatOut).format(zdt); System.out.println("> " + out); 

哪个输出……

 < 2016-01-19T09:55 > 2016-01-19T09:55:00.000AEDT 

这使您更有责任管理时区,这通常可能是更好的解决方案

而且因为Java 8 API中时区之间的转换让我很头疼(缺乏经验:P)

 LocalDateTime ldt = LocalDateTime.parse(valueIn, DateTimeFormatter.ofPattern(formatIn)); System.out.println("< " + ldt); ZonedDateTime here = ldt.atZone(ZoneId.systemDefault()); System.out.println("here " + here); ZonedDateTime there = here.withZoneSameInstant(ZoneId.of("GMT")); System.out.println("there " + there); String out = DateTimeFormatter.ofPattern(formatOut).format(there); System.out.println("> " + out); 

哪个输出……

 < 2016-01-19T09:55 here 2016-01-19T09:55+11:00[Australia/Sydney] there 2016-01-18T22:55Z[GMT] > 2016-01-18T22:55:00.000GMT 

仅供参考:我认为你的输入是使用纳秒/微秒而不是毫秒(一秒钟只有1000毫秒)。 SimpleDateFormat不支持nano / micro秒,但DateTimeFormatter不支持,你必须使用n模式,例如yyyy-MM-dd-HH.mm.ss.nnnnnn

Java 7及以下版本

基本答案是,使用SimpleDateFormat ….

 String formatIn = "yyyy-MM-dd-HH.mm.ss.SSSSSS"; String formatOut = "yyyy-MM-dd'T'HH:mm:ss.SSSz"; String valueIn = "2016-01-19-09.55.00.000000"; SimpleDateFormat in = new SimpleDateFormat(formatIn); SimpleDateFormat out = new SimpleDateFormat(formatOut); Date dateIn = in.parse(valueIn); System.out.println("< " + dateIn); String valueOut = out.format(dateIn); System.out.println("> " + valueOut); 

哪个输出……

 < Tue Jan 19 09:55:00 AEDT 2016 > 2016-01-19T09:55:00.000AEDT 

这里的问题是,你可以转换到不同的时区,在这种情况下,你可以使用像…

 in.setTimeZone(TimeZone.getTimeZone("GMT")); dateIn = in.parse(valueIn); System.out.println("< " + dateIn); out.setTimeZone(TimeZone.getTimeZone("GMT")); valueOut = out.format(dateIn); System.out.println("> " + valueOut); 

哪个输出

 < Tue Jan 19 20:55:00 AEDT 2016 > 2016-01-19T09:55:00.000GMT 

或者,如果你想要转换到不同的时区的组合。

但是,就个人而言,我会使用Joda-Time ,但这就是我

  SimpleDateFormat s1 = new SimpleDateFormat("yyyy-MM-dd-HH.mm.ss.SSSSSS"); SimpleDateFormat s2 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSz"); Date d= s1.parse( "2015-11-11-02.01.11.000001" ); String str= s2.format( d); System.out.println(str); 

这使用SimpleDateFormat s1将字符串日期解析为Date项目。 然后使用第二个SimpleDateFormat将其解析为所需的forms。