我正在尝试使用 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”
关于如何解决这个问题有任何提示吗?
您提供的代码对我来说效果很好。也许问题是你的语言环境?尝试在创建
SimpleDateFormat
: 时指定它
SimpleDateFormat format =new SimpleDateFormat("dd-MMM-yyyy HH:mm:ss,SSS z a",
Locale.US);
这样它将尝试查找美国月份和上午/下午指示符名称。
当我尝试跑步时,这对我来说效果很好:
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
已设置为某项吗?
试试这个...
System.out.println(new SimpleDateFormat("dd-MMM-yyyy HH:mm:ss,SSS z a",
Locale.US).format(new Date()));
我无法重现您的错误。您确定您使用的是:
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
正如 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。
即使在英语国家,符号也可能有不同的表示方式,例如
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 的更多信息。