Java 不可剥夺的日期:“;2014-05-22 09:09:04.145

Java 不可剥夺的日期:“;2014-05-22 09:09:04.145,java,date,datetime,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=c

这可能是我代码中的一个极其简单的输入错误,但无论我做什么,我都无法让它正常工作

我有以下代码:

 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:SSSZ
yyy-MM-dd HH:MM:ss:SSS
进行格式化,但没有任何效果

我做错了什么? 多谢各位

java.time
 DateFormat convertDate=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
 Date dateOfMeasurement=convertDate.parse(dateAndTime);
您使用的是麻烦的旧遗留日期时间类,现在已被java.time类取代

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 );
串 您试图汇编的格式也由标准定义。只需调用
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]

请阅读完整的问题。我已经试过你建议的解决办法了。谢谢。我发现了我犯的一个非常愚蠢的错误,今天工作到很晚。我已经复制了,它确实如预期的那样工作,非常感谢。只有当这些输入字符串用于表示UTC时区中的某个时刻时,此代码才有意义。