我正在使用java和MongoDB来存储一些信息,包括使用jdatechooser的DATE,我正在尝试在数据库的另一个页面中设置日期。
当我查看 Db 外壳时,我发现日期采用这种格式(2019-08-04T17:40:04.022Z) ...我检索DBObject并设置为String(),然后打印它以找到它(周日8月04日19:40:04 EET 2019)。
我甚至从其他答案中测试了很多代码,但对于日期格式化程序来说,这似乎都是错误的格式。
但是我总是收到此错误:
java.text.ParseException:不可解析的日期:"周日 8 月 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
阶级很糟糕,现在是遗产。切勿使用它。这个类,连同SimpleDateFormat
Calendar
,几年前被现代的java.time类所取代,采用了JSR 310。
具体来说,Date
被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
而不是真正的时区,如Africa/Cairo
。切勿使用此格式。不幸的是,这是java.util.Date::toString
方法使用的格式。更糟糕的是,toString
该方法动态地应用 JVM 的当前默认时区来调整实际采用 UTC 的值,从而造成很多混乱。同样,出于此原因和许多其他原因,永远不要使用Date
类。
您应该专注于在代码中尽可能使用Instant
。此类表示 UTC 中的时刻。
使用 JDBC 时,您的驱动程序可能不支持Instant
。如果没有,请使用OffsetDateTime
。
OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC ) ;
myPreparedStatement.setObject( … , odt ) ;
检索。
OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;