无法解析的日期:"Thu, 7 Dec 2017 07:40:40 "
Unparseable date: "Thu, 7 Dec 2017 07:40:40 "
我在尝试解析时遇到上述异常。我尝试了以下日期格式,
SimpleDateFormat sdf = new SimpleDateFormat("E, dd MMM yyyy HH:mm:ss ", Locale.ENGLISH);
它似乎也可以与 space 一起工作......你遇到了什么异常?
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
public class SimpleDateFormatExample {
public static void main(String[] args) {
SimpleDateFormat sdf = new SimpleDateFormat("E, dd MMM yyyy HH:mm:ss ",Locale.ENGLISH);
String strDate= sdf.format(new Date());
System.out.println(strDate);
}
}
Ouput:Fri, 08 Dec 2017 07:54:08
java.time
SimpleDateFormat
class 不仅早已过时,而且出了名的麻烦。我建议您停止使用它并改用 java.time
现代 Java 日期和时间 API 也称为 JSR-310。与它一起工作要好得多。
System.out.println(LocalDateTime.parse("Thu, 7 Dec 2017 07:40:40 ",
DateTimeFormatter.ofPattern("E, d MMM yyyy HH:mm:ss ", Locale.ENGLISH)));
这将打印预期的日期和时间:
2017-12-07T07:40:40
出了什么问题
在您的格式模式字符串中,您在 yyyy
之前有两个 space,在 yyyy
之后有两个 space,在您的 date-time 字符串中似乎每个地方只有一个 space。虽然 SimpleDateFormat
因解析它应该拒绝的字符串而臭名昭著,但在这种情况下,它 确实 object 通过抛出 ParseException
您要拒绝的消息在问题标题中引用。
如果您将我的格式模式字符串与您的进行比较,您会发现我只使用一个 d
而您使用两个。 SimpleDateFormat
用 dd
解析 7
,其中现代 classes 更严格:d
匹配 1 位或 2 位的 date-of-month。其中 dd
需要两位数。如果需要,您当然可以利用它进行更严格的验证。
问题:我的 Java 版本可以使用现代 API 吗?
如果至少使用 Java 6,则可以。
- 在 Java 8 和更高版本中,新的 API 出现 built-in。
- 在Java中6和7得到the ThreeTen Backport, the backport of the new classes (ThreeTen for JSR 310)。
- 在 Android 上,使用 ThreeTen Backport 的 Android 版本。它叫做 ThreeTenABP,在 this question: How to use ThreeTenABP in Android Project.
中有详细的解释
要学习使用 java.time
,请参阅 the Oracle tutorial 或在网上查找其他资源。
我在尝试解析时遇到上述异常。我尝试了以下日期格式,
SimpleDateFormat sdf = new SimpleDateFormat("E, dd MMM yyyy HH:mm:ss ", Locale.ENGLISH);
它似乎也可以与 space 一起工作......你遇到了什么异常?
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
public class SimpleDateFormatExample {
public static void main(String[] args) {
SimpleDateFormat sdf = new SimpleDateFormat("E, dd MMM yyyy HH:mm:ss ",Locale.ENGLISH);
String strDate= sdf.format(new Date());
System.out.println(strDate);
}
}
Ouput:Fri, 08 Dec 2017 07:54:08
java.time
SimpleDateFormat
class 不仅早已过时,而且出了名的麻烦。我建议您停止使用它并改用 java.time
现代 Java 日期和时间 API 也称为 JSR-310。与它一起工作要好得多。
System.out.println(LocalDateTime.parse("Thu, 7 Dec 2017 07:40:40 ",
DateTimeFormatter.ofPattern("E, d MMM yyyy HH:mm:ss ", Locale.ENGLISH)));
这将打印预期的日期和时间:
2017-12-07T07:40:40
出了什么问题
在您的格式模式字符串中,您在 yyyy
之前有两个 space,在 yyyy
之后有两个 space,在您的 date-time 字符串中似乎每个地方只有一个 space。虽然 SimpleDateFormat
因解析它应该拒绝的字符串而臭名昭著,但在这种情况下,它 确实 object 通过抛出 ParseException
您要拒绝的消息在问题标题中引用。
如果您将我的格式模式字符串与您的进行比较,您会发现我只使用一个 d
而您使用两个。 SimpleDateFormat
用 dd
解析 7
,其中现代 classes 更严格:d
匹配 1 位或 2 位的 date-of-month。其中 dd
需要两位数。如果需要,您当然可以利用它进行更严格的验证。
问题:我的 Java 版本可以使用现代 API 吗?
如果至少使用 Java 6,则可以。
- 在 Java 8 和更高版本中,新的 API 出现 built-in。
- 在Java中6和7得到the ThreeTen Backport, the backport of the new classes (ThreeTen for JSR 310)。
- 在 Android 上,使用 ThreeTen Backport 的 Android 版本。它叫做 ThreeTenABP,在 this question: How to use ThreeTenABP in Android Project. 中有详细的解释
要学习使用 java.time
,请参阅 the Oracle tutorial 或在网上查找其他资源。