我想解析以下类型的日期:
2010-07-13T17:27:00.000Z
我如何在java中使用简单的日期格式化程序?使用什么格式?
答案 0 :(得分:5)
(你可能会注意到我实际上并没有给你格式字符串。这是一个“教人钓鱼”的答案。如果你有问题具体你需要什么用于特定部分,然后随意详细说明,说明你尝试了什么以及它为什么不起作用。但是现在听起来你还没有尝试任何特定的格式字符串.Javadocs是合理的精心编写并包含您需要的一切。能够从文档中提取信息对于程序员来说是一项非常重要的技能,我不会让您有机会改进它。)
答案 1 :(得分:1)
代码应如下所示。
对于您的日期字符串“2010-07-13T17:27:00.000Z
”,您可以尝试使用此格式“yyyy-MM-dd'T'hh:mm:ss.S'Z'
”。
我假设你的日期字符串中的'T'和'Z'只是常量/分隔符。
import java.text.SimpleDateFormat;
import java.util.Date;
public class TestMain {
public static void main(String[] args) throws Exception{
String fromDateTime = "2010-12-01 00:01:23";
DateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
Date date = null;
date = format.parse(fromDateTime);
//What ever you want to manipulate of this date object
//...
}
}
编辑:添加适当的类,方法&评论使其成为一个完整的程序。感谢@Andrzej Doyle的评论。 编辑:从演示程序中删除抛出IOException。感谢@BalusC。 编辑:重新阅读评论,得到@BalusC的全部含义:)
答案 2 :(得分:1)
日期时间字符串 2010-07-13T17:27:00.000Z
符合 ISO 8601 日期时间模式。在此字符串中,T
是日期和时间的分隔符,Z
代表祖鲁语,它指定 UTC(即时区偏移为 +00:00
小时)。解析此日期时间字符串所需的格式如下:
yyyy-MM-dd'T'HH:mm:ss.SSSX
在 documentation page 上了解有关该模式的更多信息。
请注意,旧的日期时间 API(java.util
日期时间类型及其格式 API,SimpleDateFormat
)已过时且容易出错。建议完全停止使用它们并切换到 java.time
,modern date-time API* 。
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.Instant;
import java.time.OffsetDateTime;
import java.time.ZonedDateTime;
import java.util.Date;
import java.util.TimeZone;
public class Main {
public static void main(String args[]) throws ParseException {
String strDateTime = "2010-07-13T17:27:00.000Z";
Instant instant = Instant.parse(strDateTime);
ZonedDateTime zdt = ZonedDateTime.parse(strDateTime);
OffsetDateTime odt = OffsetDateTime.parse(strDateTime);
System.out.println(instant);
System.out.println(zdt);
System.out.println(odt);
// #################Using legacy API####################
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSX");
Date date = sdf.parse(strDateTime);
// Default format
System.out.println(date);
// Custom format
sdf.setTimeZone(TimeZone.getTimeZone("Etc/UTC"));
System.out.println(sdf.format(date));
// #####################################################
}
}
输出:
2010-07-13T17:27:00Z
2010-07-13T17:27Z
2010-07-13T17:27Z
Tue Jul 13 18:27:00 BST 2010
2010-07-13T17:27:00.000Z
请注意,现代日期时间中的默认模式遵循 ISO 8601 标准,因此您不需要明确地使用 DateTimeFormatter
(现代日期时间 API 中 SimpleDateFormat
的对应物)来解析 ISO 8601 日期时间字符串。从 Trail: Date Time 了解有关现代日期时间 API 的更多信息。
这里要提到的另一点重要的是 java.util.Date
对象不是像 modern date-time types 那样的真实日期时间对象;相反,它表示自称为“纪元”的标准基准时间以来的毫秒数,即 January 1, 1970, 00:00:00 GMT
(或 UTC)。当您打印 java.util.Date
的对象时,它的 toString
方法返回 JVM 时区中的日期时间,从这个毫秒值计算出来。如果您需要在不同的时区打印日期时间,则需要将时区设置为 SimpleDateFormat
并从中获取格式化的字符串。
* 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用 ThreeTen-Backport,它将大部分 java.time 功能向后移植到 Java 6 & 7. 如果您正在为 Android 项目工作并且您的 Android API 级别仍然不符合 Java-8,请检查 Java 8+ APIs available through desugaring 和 How to use ThreeTenABP in Android Project。