我想将我的字符串日期转换为int,但是我收到错误,例如我的日期&d昏暗。 janv。 23 24:00:00 +0000 2011` 这是我的代码的一部分:
String created_at = (String) jsonObject.get("created_at");
System.out.println("la date de création de tweet est: " + created_at);
DateFormat df = new SimpleDateFormat(" ddd. MMMM. EE HH:mm:ss z yyyy");
String s= df.format(created_at);
int out=Integer.valueOf(s);
System.out.println("new date " +out);
输出是:
java.lang.IllegalArgumentException:无法将给定的Object格式化为日期。
答案 0 :(得分:2)
嗯,你已经有了String格式的日期,这是format
方法的作用。我假设你要做的是parse
日期(进入Date
对象)而不是format
。
此外,看起来日期位于French
区域设置中,因此您需要使用适当的区域设置以及SimpleDateFormat
并使用parse
方法,例如:
DateFormat df = new SimpleDateFormat("EEE MMMM dd HH:mm:ss z yyyy", Locale.FRANCE);
Date date = df.parse("dim. janv. 23 24:00:00 +0000 2011");
System.out.println(date);
这会给你Date
个对象。如果要以不同的格式对其进行格式化,可以使用不同的格式调用format
方法。
<强>更新强>
此外,您似乎正在调用format
方法的重载版本(通过传入字符串而不是Date
对象。这显然调用了format
TextFormat
方法} class(javadoc here)以及为什么你得到Exception
。
答案 1 :(得分:1)
我知道已经有一个已接受的答案。我发布此信息是为了激励您和其他任何人放弃过时的课程DateFormat
和SimpleDateFormat
。这些天我们在现代DateTimeFormatter
和朋友中有了更好的表现,这些课程往往更加程序员友好。所以,如果可以,请使用这些 - 您可以。
System.out.println("la date de création de tweet est: " + created_at);
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss xx uuuu",
Locale.FRENCH);
OffsetDateTime dateTime = OffsetDateTime.parse(created_at, dtf);
打印:
la date de création de tweet est: dim. janv. 23 24:00:00 +0000 2011
2011-01-24T00:00Z
在法语中,圆点是星期和月份缩写的一部分,因此它们不应该在格式模式字符串中显式。还要注意,那里没有前导空格(除非您的日期时间字符串也有)。结果是正确的,因为1月23日24小时的午夜与24日的0小时相同。
评论中的另一个字符串&#34; Tue Feb 08 12:30:27 +0000 2011&#34;,格式相同,仅限英文。因此,您无需更改格式模式,只需更改区域设置:
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss xx uuuu",
Locale.ENGLISH);
现在的结果是:
la date de création de tweet est: Tue Feb 08 12:30:27 +0000 2011
2011-02-08T12:30:27Z
我不明白转换为整数的部分。我注意到你在问题的代码中尝试了Integer.valueOf(s)
,只有在首先将日期时间格式化为数字字符串时才会有效。例如:
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuuMMdd");
String s = dateTime.format(formatter);
int out = Integer.parseInt(s);
System.out.println("new date " + out);
打印
new date 20110124
但我可能猜错了你的目标。如果您更好地解释您的要求,我将很乐意编辑。我使用parseInt()
代替valueOf()
,结果相同,我只是避免从Integer
自动转换为int
。
编辑:如果创建推文的日期是例如&#34;暗淡怎么办? janv。 23 24:00:10 +0000 2011&#34;?也就是说,午夜过了10秒。然后我们得到Invalid value for HourOfDay (valid values 0 - 23): 24
。
虽然Java显然接受24:00:00作为时间,但它认为午夜之后的时间应该写在第二天的0:00:10。但是,我们可以轻松地放宽这一要求:
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss xx uuuu",
Locale.FRENCH)
.withResolverStyle(ResolverStyle.LENIENT);
日期时间格式化程序带有三种解析器样式,严格,智能(默认)和宽松。使用最后一个我们得到
2011-01-24T00:00:10Z
同样,正如预期的那样,1月23日24:00:10等于24日的0:00:10。