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

use*_*985 1 java

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

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

Mad*_*mer 5

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);
Run Code Online (Sandbox Code Playgroud)

哪个输出......

< 2016-01-19T09:55
> 2016-01-19T09:55:00.000AEDT
Run Code Online (Sandbox Code Playgroud)

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

而且因为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);
Run Code Online (Sandbox Code Playgroud)

哪个输出......

< 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
Run Code Online (Sandbox Code Playgroud)

仅供参考:我认为您的输入是使用纳秒/微秒而不是毫秒(一秒钟内只有1000毫秒). SimpleDateFormat不支持纳米/微米秒,但是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);
Run Code Online (Sandbox Code Playgroud)

哪个输出......

< Tue Jan 19 09:55:00 AEDT 2016
> 2016-01-19T09:55:00.000AEDT
Run Code Online (Sandbox Code Playgroud)

这里的问题是,你可以转换到不同的时区,在这种情况下,你可以使用类似的东西......

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);
Run Code Online (Sandbox Code Playgroud)

哪个输出

< Tue Jan 19 20:55:00 AEDT 2016
> 2016-01-19T09:55:00.000GMT
Run Code Online (Sandbox Code Playgroud)

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

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