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的好答案。
你的代码出了什么问题
您似乎混淆了格式化和解析的概念。您尝试了SimpleDateFormat
的parse
方法。在它的时代,它被用于将预定义格式的String
转换为Date
(另一个过时已久的类)。我猜您想要的大致相反:将DateTime
格式化为预定义格式的字符串。您的另一个问题是SimpleDateFormat
从未能够处理Joda TimeDateTime
对象(或任何其他同名类)。
链接
- 维基百科文章:ISO 8601
- Joda Time-主页