在java中转换为ISO日期时间


I have to convert String "15-08-2021" to  DateTime  yyyy-MM-dd'T'HH:mm:ss'Z' 

"尝试了以下方法,但没有成功。

String toDateString= "15-08-2021";
DateTime dt= new DateTime(toDateString);
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
DateTime result=formatter.parse(dt);  

java.time

java.util日期-时间API及其格式API、SimpleDateFormat已过时且存在错误。建议完全停止使用它们,并切换到现代日期时间API*

此外,下面引用的是Joda Time主页上的通知:

注意,从Java SE 8开始,用户被要求迁移到Java.time(JSR-310),这是JDK的核心部分,它取代了这个项目。

使用java.time(现代日期时间API)的解决方案:

import java.time.LocalDate;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
public class Main {
public static void main(String args[]) {
DateTimeFormatter dtfInput = DateTimeFormatter.ofPattern("dd-MM-uuuu", Locale.ENGLISH);
LocalDate date = LocalDate.parse("15-08-2021", dtfInput);
ZonedDateTime zdt = date.atStartOfDay(ZoneId.of("UTC"));
System.out.println(zdt);
// Custom format
DateTimeFormatter dtfOutput = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ssXXX", Locale.ENGLISH);
String formatted = dtfOutput.format(zdt);
System.out.println(formatted);
}
}

输出:

2021-08-15T00:00Z[UTC]
2021-08-15T00:00:00Z

在线演示

注意:如果你需要不同的时间,你可以用以下方式来做,同时保持其他事情的原样:

LocalDateTime ldt = LocalDateTime.of(LocalDate.parse("15-08-2021", dtfInput), LocalTime.of(21, 0));
ZonedDateTime zdt = ldt.atZone(ZoneOffset.UTC);

输出:

2021-08-15T21:00Z
2021-08-15T21:00:00Z

在线演示

跟踪:日期时间了解有关现代日期时间API的更多信息。


*如果您正在为Android项目工作,并且您的Android API级别仍然不符合Java-8,请检查通过降级提供的Java 8+API。请注意,安卓8.0奥利奥已经提供了对java.time的支持

你在用Joda Time吗?您可以考虑升级到现代的java日期和时间API java.time(您当然不想从java 1.0和1.1降级到SimpleDateFormat和其他麻烦的日期和时间类)

使用Joda时间

对于Joda Time,我会声明一个这样的格式化程序来进行解析:

private static final DateTimeFormatter DATE_PARSER =
DateTimeFormat.forPattern("dd-MM-yyyy")
.withZoneUTC();

然后转换如下:

String toDateString = "15-08-2021";
DateTime dt = DateTime.parse(toDateString, DATE_PARSER);
System.out.println(dt);

输出:

2021-08-15T0:00.000Z

输出包括秒的三位小数。这可能不是问题。输出与我认为您打算参考的ISO 8601标准一致。如果您需要去掉它们,您需要第二个格式化程序,但幸运的是,它内置于:

String formattedDt = dt.toString(ISODateTimeFormat.dateTimeNoMillis());
System.out.println(formattedDt);

2021-08-15T0:00Z

考虑java.time

来自Joda Time主页:

请注意,Joda Time被认为是一个基本上"完成"的项目。没有计划进行重大改进。如果使用Java SE 8,请迁移到java.time(JSR-310)。

对于此选项,请参阅Arvind Kumar Avinash的好答案。

你的代码出了什么问题

您似乎混淆了格式化解析的概念。您尝试了SimpleDateFormatparse方法。在它的时代,它被用于将预定义格式的String转换为Date(另一个过时已久的类)。我猜您想要的大致相反:将DateTime格式化为预定义格式的字符串。您的另一个问题是SimpleDateFormat从未能够处理Joda TimeDateTime对象(或任何其他同名类)。

链接

  • 维基百科文章:ISO 8601
  • Joda Time-主页

相关内容

  • 没有找到相关文章

最新更新