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

how to solve the error when convert string date to integer?

我想将我的字符串日期转换为 int,但出现错误,例如我的日期 'dim. 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: Cannot format given Object as a Date.

好吧,您已经有了字符串格式的日期,这就是 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.

的原因

我知道已经有一个可接受的答案。我发布这篇文章是为了激励您和其他任何人放弃过时的 类 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

在法语中,点是星期几和月份缩写的一部分,因此它们不应在格式模式字符串中明确显示。还要注意你没有前导 space 在那里(除非你的日期时间字符串也有一个)。结果是正确的,因为 1 月 23 日的午夜 24 小时与 24 日的 0 小时相同。

评论中的另一个字符串 "Tue Feb 08 12:30:27 +0000 2011" 格式相同,只是英文。所以你不需要改变格式模式,只需要改变语言环境:

    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(),结果是一样的,我只是避免了从Integerint的自动转换。

编辑:如果推文的创建日期是 "dim. janv. 23 24:00:10 +0000 2011" 怎么办?也就是说,午夜过后 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。