将 ISO 日期字符串转换为 java 中的 Jdatechooser 日期

Converting ISO Date String to Jdatechooser date in java

我正在使用 java 和 MongoDB 来存储一些信息,包括使用 jdatechooser 的日期,我正在尝试在数据库的另一个页面中设置日期。

当我查看 Db 时 shell 我找到这种格式的日期 (2019-08-04T17:40:04.022Z) ... 我检索 DBObject 并设置 toString() 然后打印它找到它(Sun Aug 04 19:40:04 EET 2019)。

我什至从其他答案中测试了很多代码,但日期格式化程序的格式似乎都是错误的。

但是我总是得到这个错误:

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,直到您为图书馆命名,最好link到它的产品站点。

java.util.Dateclass太惨了,现在legacy. Never use it. This class, along with SimpleDateFormat & Calendar, were supplanted years ago by the modern java.time classes with the adoption of JSR 310.

具体来说,Datejava.time.Instant 取代了。如果您必须与尚未更新到 java.time 的旧代码进行互操作,请通过调用添加到旧 class 的新转换方法来来回转换。

字符串 2019-08-04T17:40:04.022Z 为标准 ISO 8601 格式。当 parsing/generating 字符串时,java.time classes 默认使用标准格式。

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 而不是真实时区,例如 Africa/Cairo .永远不要使用这种格式。不幸的是,这是 java.util.Date::toString 方法使用的格式。更糟糕的是,toString 方法动态应用 JVM 当前的默认时区来调整实际在 UTC 中的值,造成很多混乱。同样,出于这个原因和许多其他原因,永远不要使用 Date class。

您应该尽可能在代码中使用 Instant。这个 class 代表 UTC 中的一个时刻。

使用时JDBC, your driver may not support Instant. If not, use OffsetDateTime

OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC ) ;
myPreparedStatement.setObject( … , odt ) ;

检索。

OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;