使用 SimpleDateFormat 时出错

问题描述 投票:0回答:5

我正在尝试使用 SimpleDateFormat 类从该字符串中解析 DateTime:

2012 年 7 月 5 日 11:38:02,442 UTC 上午

我尝试了以下格式字符串:

SimpleDateFormat dateformatYYYYMMDD = new SimpleDateFormat("dd-MMM-yyyy HH:mm:ss,SSS z a");

Date temp = dateformatYYYYMMDD.parse(time);

但它会产生错误:

错误:无法解析日期:“”

如果我使用 zZ 我得到:错误:无法解析日期:“05-Jul-2012 11:38:02,442 UTC AM”

关于如何解决这个问题有任何提示吗?

java parsing simpledateformat
5个回答
6
投票

您提供的代码对我来说效果很好。也许问题是你的语言环境?尝试在创建

SimpleDateFormat
:

时指定它
SimpleDateFormat format =new SimpleDateFormat("dd-MMM-yyyy HH:mm:ss,SSS z a",
                                              Locale.US);

这样它将尝试查找美国月份和上午/下午指示符名称。


2
投票

当我尝试跑步时,这对我来说效果很好:

String time = "05-Jul-2012 11:38:02,442 UTC AM";
SimpleDateFormat dateformatYYYYMMDD = new SimpleDateFormat("dd-MMM-yyyy HH:mm:ss,SSS z a");
Date temp = dateformatYYYYMMDD.parse(time);

您确定

time
已设置为某项吗?


0
投票

试试这个...

System.out.println(new SimpleDateFormat("dd-MMM-yyyy HH:mm:ss,SSS z a",
                                              Locale.US).format(new Date()));

0
投票

我无法重现您的错误。您确定您使用的是:

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

0
投票

正如 Jon Skeet 指出的那样,这是一个与

Locale
相关的问题。然而,他忽略了重要的一点。由于您的日期时间字符串具有 AM/PM 标记,因此在模式中使用
H
没有意义。您应该使用
h
而不是
H
。符号
H
用于表示一天中的小时 (0-23),而
h
用于表示上午-下午。查看文档页面 [1][2] 以了解更多信息。

这是一个与
Locale
相关的问题吗?

默认情况下,当您未指定

Locale
时,日期时间解析/格式化 API 将使用默认的
Locale
(即 JVM 中设置的
Locale
)。由于您的日期时间字符串是英文的,因此您应该使用 English-
Locale
;否则,您的解析/格式化代码仅在默认为 English-
Locale
的 JVM 上执行时才有效。检查这个答案以了解更多信息。

java.time

2014 年 3 月,Java 8 引入了现代的

java.time
日期时间 API,取代了容易出错的旧版
java.util
日期时间 API
。任何新代码都应使用
java.time
API。

使用现代日期时间 API 的解决方案

即使在英语国家,符号也可能有不同的表示方式,例如

Locale.ENGLISH
Locale.US
Locale.ROOT
接受
AM
/
PM
,但
Locale.UK
接受
am
/
pm

因此,虽然您可以使用

DateTimeFormatter.ofPattern("dd-MMM-uuuu hh:mm:ss,SSS z a", Locale.ENGLISH)
来解析日期时间字符串,但我建议您构建并使用不区分大小写的
DateTimeFormatter
,如演示中所示。

演示:

class Main {
    public static void main(String[] args) {
        DateTimeFormatter dtf = new DateTimeFormatterBuilder()
                .parseCaseInsensitive()
                .appendPattern("dd-MMM-uuuu hh:mm:ss,SSS z a")
                .toFormatter(Locale.ENGLISH);

        ZonedDateTime zdt = ZonedDateTime.parse("05-Jul-2012 11:38:02,442 UTC AM", dtf);
        System.out.println(zdt);
    }
}

输出:

2012-07-05T11:38:02.442Z[Etc/UTC]

在线演示

注意: 如果由于某种原因,您需要

java.util.Date
的实例,请让
java.time
API 完成解析日期时间字符串的繁重工作,并将上述代码中的
zdt
转换为
java.util.Date
实例使用
Date date = Date.from(zdt.toInstant())

Trail:日期时间了解有关现代日期时间 API 的更多信息。

© www.soinside.com 2019 - 2024. All rights reserved.