在我的项目中新的Date();用其他语言给出日期。并且它给出了错误,有人可以提供解决方案来转换英语中的darte吗?
我的代码如下:
model.put("total", timeSheetTempDAO.getCurrentDayHours(SessionManagement.getCurrentUserId(),new SimpleDateFormat("YYYY-MMM-dd").format(new Date())));
org.postgresql.util.PSQLException:错误:类型日期的输入语法无效:“2017-जनवरी-26” 位置:136 org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2103) org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1836) org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:257) org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:512) org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:388) org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:273) org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:56) org.hibernate.loader.Loader.getResultSet(Loader.java:2040) org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1837) org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1816) org.hibernate.loader.Loader.doQuery(Loader.java:900) org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:342) org.hibernate.loader.Loader.doList(Loader.java:2526) org.hibernate.loader.Loader.doList(Loader.java:2512) org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2342) org.hibernate.loader.Loader.list(Loader.java:2337) org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:495) org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:357) org.hibernate.engine。
答案 0 :(得分:1)
Locale
SimpleDateFormat
yyyy-MM-dd
字符串中的当前日期:
LocalDate.now(
ZoneId.of( "America/Montreal" )
).toString()
撕开你的代码来调试这类问题。你展示了一长串复杂的代码。一旦分开,你会发现问题与Postgres和JDBC / Hibernate无关。
您使用的SimpleDateFormat
格式代码不正确。大写Y
表示周年而不是日历年。三重M表示月份的名称,而不是数字。对于SimpleDateFormat
,使用yyyy-MM-dd
(但您应该使用java.time类)。
不要将日期时间值作为字符串通过JDBC传递到数据库。使用日期时间类型。 JDBC的一个目的是弥合Java类型和数据库的数据类型之间的差异。搜索“JDBC”和“LocalDate”的堆栈溢出,以获取更多讨论和示例。
你忽略了时区问题。
时区对于确定日期至关重要。对于任何给定的时刻,日期在全球范围内因地区而异。例如,在Paris France午夜后的几分钟是新的一天,而Montréal Québec中仍然是“昨天”。
SimpleDateFormat
类隐式应用JVM的当前默认时区。所以结果可能会有所不同。最好始终明确指定所需/预期的时区。
同样,在生成表示日期时间值的字符串时,您忽略了Locale
的问题。 Locale
确定(a)用于翻译日期名称,月份名称等的人类语言,以及(b)决定缩写,大小写,标点符号等问题的文化规范。顺便说一下,语言环境 nothing 与时区有关。
SimpleDateFormat
类隐式使用JVM的当前默认值Locale
。最好始终明确指定所需/期望的区域设置。可能是Locale.UK
或Locale.ENGLISH
。
您正在使用麻烦的旧日期时间类。我建议你了解java.time类并考虑它们的用法,虽然我不知道在Hibernate中对java.time的支持。
LocalDate
LocalDate
类表示没有时间且没有时区的仅限日期的值。
LocalDate.now( ZoneId.of( "America/Montreal" ) ) ;
java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和& SimpleDateFormat
现在位于Joda-Time的maintenance mode项目建议迁移到java.time类。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310。
从哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
和more。