我从字符串
解析日期时遇到问题这是我的约会
String startedFrom = "Fri,+31+Dec+3999+23:00:00+GMT"
DateFormat df = new SimpleDateFormat("EEE, dd MMM yyyy kk:mm:ss z", Locale.ENGLISH);
Date result = df.parse(startedFrom);
我做错了什么?
我得到例外
java.text.ParseException: Unparseable date: "Fri,+31+Dec+3999+23:00:00+GMT"
答案 0 :(得分:1)
DateFormat df = new SimpleDateFormat("EEE,'+'dd'+'MMM'+'yyyy'+'kk:mm:ss'+'z",
Locale.ENGLISH);
但是,如果startedFrom
值实际上是添加到URL的URL编码参数(如使用GET方法的HTML表单中),那么'+'
将作为空格' '
到达,因此你的原始格式是正确的。
答案 1 :(得分:1)
首先,请使用java.time
及其DateTimeFormatter
类。 SimpleDateFormat
是众所周知的麻烦,并且与Date
课程一起长期过时。 java.time
是现代Java日期和时间API,使用起来非常好。
其次,Joop Eggen在his answer中是正确的,您的字符串看起来像是最初为Fri, 31 Dec 3999 23:00:00 GMT
的URL编码参数。这听起来更有可能,因为这是一种称为RFC 1123的标准格式,并且通常与HTTP一起使用。因此,用于获取URL参数的库应该为您解析字符串。然后它很简单,因为已经为你定义了格式化程序:
String startedFrom = "Fri, 31 Dec 3999 23:00:00 GMT";
OffsetDateTime result
= OffsetDateTime.parse(startedFrom, DateTimeFormatter.RFC_1123_DATE_TIME);
System.out.println(result);
打印
3999-12-31T23:00Z
如果您无法让您的资料库进行网址解码,请使用URLDecoder
:
String startedFrom = "Fri,+31+Dec+3999+23:00:00+GMT";
try {
startedFrom = URLDecoder.decode(startedFrom, StandardCharsets.UTF_16.name());
} catch (UnsupportedEncodingException uee) {
throw new AssertionError("UTF_16 is not supported — this should not be possible", uee);
}
现在按上述步骤进行。
您当然也可以定义一个格式化程序来解析字符串中的字符串。不过,我不知道你为什么要这么做。如果你这样做,你只需要将它们放在格式模式字符串中:
DateTimeFormatter formatterWithPluses
= DateTimeFormatter.ofPattern("EEE,+d+MMM+yyyy+H:mm:ss+z", Locale.ROOT);
ZonedDateTime result = ZonedDateTime.parse(startedFrom, formatterWithPluses);
这次我们得到一个ZonedDateTime
GMT作为时区的名称:
3999-12-31T23:00Z[GMT]
根据您需要的日期时间,您可以致电OffsetDateTime
或Instant
将其转换为result.toOffsetDateTime()
或result.toInstant()
。