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

新手上路,请多包涵

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

我使用了 apache DateFormatUtils 但这并没有在输出中给出毫秒数。

原文由 javaguy 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 817
2 个回答

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 does not support nano/micro seconds, but DateTimeFormatter does, you’d have to use the n pattern, yyyy-MM-dd-HH.mm.ss.nnnnnn for example

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 ,但这就是我

原文由 MadProgrammer 发布,翻译遵循 CC BY-SA 4.0 许可协议

        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 将其解析为所需的形式。

原文由 sguan 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题