我想解析以下类型的日期:
2010-07-13T17:27:00.000Z
我如何在java中使用简单的日期格式化程序来做到这一点?要使用什么格式?
我想解析以下类型的日期:
2010-07-13T17:27:00.000Z
我如何在java中使用简单的日期格式化程序来做到这一点?要使用什么格式?
(您可能会注意到我实际上并没有给您格式字符串。这是一个“教人钓鱼”的答案。如果您在具体制定特定部分需要使用的内容时遇到问题,请随意详细说明,说明您尝试了什么以及为什么它不起作用。但现在听起来您还没有到尝试任何特定格式字符串的地步。Javadocs 编写得相当好,包含您需要的一切。能够从文档中提取信息对于程序员来说是一项非常重要的技能,我不会剥夺你改进它的机会。)
该代码应类似于以下代码。
对于您的日期字符串“ 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 的评论。编辑:从演示程序中删除 throws IOException。感谢@BalusC。编辑:重新阅读评论,了解@BalusC 的全部含义 :)
日期时间字符串,2010-07-13T17:27:00.000Z
符合ISO 8601日期时间模式。在此字符串中,T
是日期和时间的分隔符,Z
代表 Zulu,它指定 UTC(即时区偏移量+00:00
)。解析此日期时间字符串所需的格式如下:
yyyy-MM-dd'T'HH:mm:ss.SSSX
在文档页面了解有关该模式的更多信息。
请注意,旧的日期时间 API(java.util
日期时间类型及其格式化 API SimpleDateFormat
)已过时且容易出错。建议完全停止使用它们并切换到java.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
对象不是像现代日期时间类型那样的真实日期时间对象;相反,它表示自称为“纪元” 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 工作level 仍然不符合 Java-8,请检查Java 8+ APIs available through desugaring和How to use ThreeTenABP in Android Project。