无法解释的日期:" 2014-05-22 09:09:04.145

时间:2016-09-07 23:34:55

标签: java date datetime

这可能是我在我的代码中出现的一个非常简单的拼写错误,但无论我做什么,我都无法使其工作。

我有以下代码:

 String date="2014-05-22";
 String time="09:09:04.145"

 String dateAndTime=date.concat(" "+ time);

 DateFormat convertDate=new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss:SSSZ");
 Date dateOfMeasurement=convertDate.parse(dateAndTime);

我尝试使用yyyy-MM-dd'T'HH:mm:ss:SSSZyyyy-MM-dd HH:mm:ss:SSS进行格式化,但没有任何效果。

我做错了什么?  非常感谢你。

2 个答案:

答案 0 :(得分:2)

java.time

您正在使用现在由java.time类取代的麻烦的旧旧日期时间类。

ISO 8601

您的输入符合ISO 8601标准。在解析/生成表示日期时间值的字符串时,java.time类默认使用ISO 8601格式。因此无需指定格式化模式。

LocalDate ld = LocalDate.parse( "2014-05-22" );
LocalTime lt = LocalTime.parse( "09:09:04.145" );
LocalDateTime ldt = LocalDateTime.of( ld , lt );

时区

LocalDateTime没有时区概念或从UTC偏移。所以代表时间轴上的一个时刻。

对于实际时刻,请指定时区。也许您希望输入代表UTC的时刻。

OffsetDateTime odt = ldt.atOffset( ZoneOffset.UTC );

或者您可能从上下文中了解到另一个特定时区的意图。

ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ldt.atZone( z );

字符串

您尝试汇编的格式也由ISO 8601标准定义。只需致电toString即可生成此类值。

Instant是java.time中的基本构建块类,表示UTC时间轴上的时刻,分辨率高达纳秒。

String output = zdt.toInstant().toString(); // 2016-09-08T02:46:15Z

ZonedDateTime通过在方括号中明智地附加时区名称来扩展标准格式。

String output = zdt.toString();  // 2016-09-07T23:46:15-03:00[America/Montreal]

答案 1 :(得分:1)

 DateFormat convertDate=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
 Date dateOfMeasurement=convertDate.parse(dateAndTime);