我正在使用 java 和 MongoDB 来存储一些信息,包括使用 jdatechooser 的日期,并且我试图在数据库的另一个页面中设置日期。
当我查看 Db shell 时,我找到了这种格式的日期(2019-08-04T17:40:04.022Z)...我检索 DBObject 并设置 toString() 然后打印它以找到它(Sun Aug欧洲东部时间 2019 年 04 19:40:04)。
我测试了很多代码,甚至来自其他答案,但日期格式化程序的格式似乎都是错误的。
但是我总是收到此错误:
java.text.ParseException:无法解析的日期:“Sun Aug 04 19:40:04 EET 2019”
SimpleDateFormat sdf = new SimpleDateFormat("EE MM dd HH:mm:ss Z yyy");
Date date1 = sdf.parse(date);
System.out.println(date); //Prints Tue Oct 15 10:20:56 SGT 2015
jDateChooser1.setDate(date1);
我使用的格式示例
yyyy-MM-dd HH:mm:ss.SSS Z
EE MM dd HH:mm:ss Z yyy
yyyy-MM-dd
dd-MM-yyyy
您对解决这个问题有什么建议? 请随时要求编辑问题以帮助澄清问题
提前致谢
最佳答案
显然你正在使用一些你没有解释过的库,jdatechooser
,来生成一个java.util.Date
,它作为一个工具链存储在你的工具链中的某个地方。字符串 2019-08-04T17:40:04.022Z
,而在工具链的另一部分则由字符串 Sun Aug 04 19:40:04 EET 2019
表示。
让我们把这些碎片拆开。
在您命名库并最好链接到其产品网站之前,我们无法为您提供 jdatechooser
帮助。
java.util.Date
类很糟糕,现在是 legacy 。切勿使用它。这个类以及 SimpleDateFormat
和 Calendar
多年前就被现代 java.time 类所取代,并采用了 JSR 310 .
具体来说,日期
已替换为 java.time.Instant
。如果您必须与尚未更新到 java.time 的旧代码进行互操作,请通过调用添加到旧类中的新转换方法来进行来回转换。
字符串 2019-08-04T17:40:04.022Z
符合标准 ISO 8601格式。 java.time 类在解析/生成字符串时默认使用标准格式。
Instant instant = Instant.parse( "2019-08-04T17:40:04.022Z" ) ;
正在生成。
String output = instant.toString() ; // Yields: 2019-08-04T17:40:04.022Z
字符串 Sun Aug 04 19:40:04 EET 2019
的格式很糟糕。它假设英语,很难被机器解析,无法包含所有信息(缺少小数秒),并使用伪时区 EET
而不是真正的时区,例如 非洲/开罗
。切勿使用此格式。不幸的是,这是 java.util.Date::toString 方法使用的格式。更糟糕的是,toString 方法动态应用 JVM 当前的默认时区来调整 UTC 中实际的值。 ,造成很多困惑。再次强调,出于这个原因和许多其他原因,切勿使用 Date
类。
您应该尽可能在代码中重点使用Instant
。此类代表 UTC 中的一个时刻。
当使用JDBC时,你的driver可能不支持Instant
。如果没有,请使用OffsetDateTime
。
OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC ) ;
myPreparedStatement.setObject( … , odt ) ;
检索。
OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;
关于java - 在java中将ISO日期字符串转换为Jdatechooser日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57341260/