我正在尝试格式化日期字符串ex。使用以下代码2014-11-24T18:30:00.000Z
到2014-11-24
:
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
dateFormat.format(reqJsonObj.getString(FROM_DATE));
但它引发了异常
java.lang.IllegalArgumentException: Cannot format given Object as a Date
答案 0 :(得分:5)
使用dateFormat.parse()
代替dateFormat.format()
,因为您要将String
解析为Date
对象。然后,当您拥有Date
对象时,请将其格式化为String
所需的格式。 @Jens已经为您提供了完整的代码,因此无需在此处再次复制。
答案 1 :(得分:1)
您必须先将字符串解析为日期,然后格式化日期:
SimpleDateFormat dateFormatP = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
Date parsedDate = dateFormatP.parse(reqJsonObj.getString(FROM_DATE));
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
dateFormat.format(parsedDate );
答案 2 :(得分:0)
您需要提供一个日期作为格式而不是String的参数。首先创建一个SimpleDateFormat来将字符串解析为日期,然后将日期对象提供给另一个SimpleDateFormat来格式化日期。
答案 3 :(得分:0)
使用此
日期日期= formatter.parse(dateInString);
答案 4 :(得分:0)
您指定了一个模式,适合生成您寻求输出的字符串。但是你确实定义了一个用于解析输入的模式。您需要从字符串到解析到日期时间对象。然后使用该对象生成字符串。
不要将字符串视为日期时间,而应将其视为日期时间值的文本表示。将日期时间对象视为实际值。
您正在使用设计糟糕,令人困惑且麻烦的旧日期时间类。避免使用诸如java.util.Date/.Calendar。
之类的类这些旧类被Java 8及更高版本中内置的java.time框架所取代。
Instant
是UTC时间轴上的一个时刻。
Instant now = Instant.now();
ISO 8601标准为日期时间值的文本表示定义了合理的格式。
您的输入和输出字符串都符合此标准。
java.time类使用ISO 8601作为解析和生成字符串的默认值。因此,您无需指定格式化模式。
结尾的Z
是Zulu
的缩写,意思是UTC。
Instant instant = Instant.parse( "2014-11-24T18:30:00.000Z" );
您想要的是没有时间的仅限日期的值。 LocalDate
类用于此目的。
确定日期需要offset-from-UTC(或全时区)。 Instant
类始终位于一个特定偏移量中,偏移量为零(UTC),但实际上并未意识到这一点。 Instant
只是一个基本的构建块类。
OffsetDateTime
课程对包括UTC在内的各种补偿非常了解。我们需要指定一个显式偏移量来生成OffsetDateTime
。我们将为UTC指定方便的常量ZoneOffset.UTC
。
OffsetDateTime odt = OffsetDateTime.of( instant , ZoneOffset.UTC );
Instant
和OffsetDateTime
都是UTC时间轴上的一个时刻。不同之处在于OffsetDateTime
更灵活,功能更多。我们可以向OffsetDateTime
询问我们所需的LocalDate
对象。
LocalDate localDate = odt.toLocalDate();
现在我们只需调用toString
即可生成标准ISO 8601格式的输出。
String output = localDate.toString();
2014年11月24日