将 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.Date
class太惨了,现在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.
具体来说,Date
被 java.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 ) ;
我正在使用 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.Date
class太惨了,现在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.
具体来说,Date
被 java.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 ) ;