String将“2010 年 1 月 2 日”格式的a 转换为DateJava中的a 的最佳方法是什么?
String
Date
最终,我想将月、日和年分解为整数,以便我可以使用
Date date = new Date(); date.setMonth().. date.setYear().. date.setDay().. date.setlong currentTime = date.getTime();
将日期转换为时间。
这是一种艰难的方式,并且这些java.util.Datesetter 方法自 Java 1.1 (1997) 以来已被弃用。此外,自Java 8 (2014) 中引入 API以来,整个java.util.Date类实际上已被弃用(不推荐)。java.time
java.util.Date
java.time
只需使用DateTimeFormatter与输入字符串匹配的模式来格式化日期(教程可在此处获得)。
DateTimeFormatter
在您将“2010 年 1 月 2 日”作为输入字符串的特定情况下:
MMMM
d
“2010”是 4 位数的年份,所以使用yyyy它的模式。
yyyy
String string = “January 2, 2010”; DateTimeFormatter formatter = DateTimeFormatter.ofPattern(“MMMM d, yyyy”, Locale.ENGLISH); LocalDate date = LocalDate.parse(string, formatter); System.out.println(date); // 2010-01-02
注意:如果您的格式模式恰好也包含时间部分,请使用LocalDateTime#parse(text, formatter)而不是LocalDate#parse(text, formatter). 而且,如果您的格式模式恰好也包含时区,请ZonedDateTime#parse(text, formatter)改用。
LocalDateTime#parse(text, formatter)
LocalDate#parse(text, formatter)
ZonedDateTime#parse(text, formatter)
以下是javadoc相关性的摘录,列出了所有可用的格式模式:
请注意,它为更流行的模式提供了几个预定义的格式化程序。因此DateTimeFormatter.ofPattern("EEE, d MMM yyyy HH:mm:ss Z", Locale.ENGLISH);,您可以使用DateTimeFormatter.RFC_1123_DATE_TIME. 这是可能的,因为它们是SimpleDateFormat线程安全的。因此,如有必要,您也可以定义自己的。
DateTimeFormatter.ofPattern("EEE, d MMM yyyy HH:mm:ss Z", Locale.ENGLISH);
DateTimeFormatter.RFC_1123_DATE_TIME
SimpleDateFormat
对于特定的输入字符串格式,您不需要使用显式DateTimeFormatter:标准ISO 8601日期,如 2016-09-26T17:44:57Z,可以直接解析,LocalDateTime#parse(text)因为它已经使用了ISO_LOCAL_DATE_TIME格式化程序。类似地,LocalDate#parse(text)解析没有时间组件的 ISO 日期(请参阅ISO_LOCAL_DATE),并ZonedDateTime#parse(text)解析添加了偏移量和时区的 ISO 日期(请参阅ISO_ZONED_DATE_TIME)。
LocalDateTime#parse(text)
ISO_LOCAL_DATE_TIME
LocalDate#parse(text)
ISO_LOCAL_DATE
ZonedDateTime#parse(text)
ISO_ZONED_DATE_TIME
如果您还没有使用 Java 8,或者被迫使用,请使用与输入字符串匹配的格式模式来java.util.Date格式化日期。SimpleDateFormat
String string = "January 2, 2010"; DateFormat format = new SimpleDateFormat("MMMM d, yyyy", Locale.ENGLISH); Date date = format.parse(string); System.out.println(date); // Sat Jan 02 00:00:00 GMT 2010
请注意显式Locale参数的重要性。如果您省略它,那么它将使用默认语言环境,该语言环境不一定是输入字符串的月份名称中使用的英语。如果语言环境与输入字符串不匹配,那么java.text.ParseException即使格式模式似乎有效,您也会感到困惑。
Locale
java.text.ParseException
请注意,模式区分大小写,四个或更多字符的基于文本的模式代表完整形式;否则,如果可用,则使用简短或缩写形式。因此,例如MMMMM或更多是不必要的。
MMMMM
SimpleDateFormat以下是解析给定字符串的一些有效模式示例:
一个重要的注意事项是它SimpleDateFormat不是 线程 安全的。换句话说,您永远不应该将其声明并分配为静态或实例变量,然后从不同的方法/线程中重用它。您应该始终在方法本地范围内创建全新的。