在java中格式化日期

时间:2014-11-26 13:17:42

标签: java

我正在尝试格式化日期字符串ex。使用以下代码2014-11-24T18:30:00.000Z2014-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

5 个答案:

答案 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.time

这些旧类被Java 8及更高版本中内置的java.time框架所取代。

Instant是UTC时间轴上的一个时刻。

Instant now = Instant.now();

ISO 8601

ISO 8601标准为日期时间值的文本表示定义了合理的格式。

您的输入和输出字符串都符合此标准。

java.time类使用ISO 8601作为解析和生成字符串的默认值。因此,您无需指定格式化模式。

结尾的ZZulu的缩写,意思是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 );

InstantOffsetDateTime都是UTC时间轴上的一个时刻。不同之处在于OffsetDateTime更灵活,功能更多。我们可以向OffsetDateTime询问我们所需的LocalDate对象。

LocalDate localDate = odt.toLocalDate();

现在我们只需调用toString即可生成标准ISO 8601格式的输出。

String output = localDate.toString();
  

2014年11月24日