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



我正在使用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阶级很糟糕,现在是遗产。切勿使用它。这个类,连同SimpleDateFormatCalendar,几年前被现代的java.time类所取代,采用了JSR 310。

具体来说,Datejava.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 ) ;

相关内容

  • 没有找到相关文章

最新更新