如何解决将字符串日期转换为整数时的错误?
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
.
的原因
我知道已经有一个可接受的答案。我发布这篇文章是为了激励您和其他任何人放弃过时的 类 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
在法语中,点是星期几和月份缩写的一部分,因此它们不应在格式模式字符串中明确显示。还要注意你没有前导 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()
,结果是一样的,我只是避免了从Integer
到int
的自动转换。
编辑:如果推文的创建日期是 "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。
我想将我的字符串日期转换为 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
.
我知道已经有一个可接受的答案。我发布这篇文章是为了激励您和其他任何人放弃过时的 类 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
在法语中,点是星期几和月份缩写的一部分,因此它们不应在格式模式字符串中明确显示。还要注意你没有前导 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()
,结果是一样的,我只是避免了从Integer
到int
的自动转换。
编辑:如果推文的创建日期是 "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。