将字符串日期转换为整数时如何解决错误?

时间:2017-06-03 21:50:35

标签: java date-parsing

我想将我的字符串日期转换为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格式化为日期。

2 个答案:

答案 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)

我知道已经有一个已接受的答案。我发布此信息是为了激励您和其他任何人放弃过时的课程DateFormatSimpleDateFormat。这些天我们在现代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。