日期来自java

时间:2017-01-25 23:05:12

标签: java postgresql date spring-mvc utf-8

在我的项目中新的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。

1 个答案:

答案 0 :(得分:1)

TL;博士

  • Locale
  • 指定SimpleDateFormat
  • 修复格式设置模式yyyy-MM-dd
  • 最好使用java.time类而不是这些麻烦的遗留类

字符串中的当前日期:

LocalDate.now( 
    ZoneId.of( "America/Montreal" ) 
).toString()

调试时简化代码

撕开你的代码来调试这类问题。你展示了一长串复杂的代码。一旦分开,你会发现问题与Postgres和JDBC / Hibernate无关。

格式设置模式不正确

您使用的SimpleDateFormat格式代码不正确。大写Y表示周年而不是日历年。三重M表示月份的名称,而不是数字。对于SimpleDateFormat使用yyyy-MM-dd (但您应该使用java.time类)。

通过JDBC

传递对象,而不是字符串

不要将日期时间值作为字符串通过JDBC传递到数据库。使用日期时间类型。 JDBC的一个目的是弥合Java类型和数据库的数据类型之间的差异。搜索“JDBC”和“LocalDate”的堆栈溢出,以获取更多讨论和示例。

时区

你忽略了时区问题。

时区对于确定日期至关重要。对于任何给定的时刻,日期在全球范围内因地区而异。例如,在Paris France午夜后的几分钟是新的一天,而Montréal Québec中仍然是“昨天”。

SimpleDateFormat类隐式应用JVM的当前默认时区。所以结果可能会有所不同。最好始终明确指定所需/预期的时区。

区域设置

同样,在生成表示日期时间值的字符串时,您忽略了Locale的问题。 Locale确定(a)用于翻译日期名称,月份名称等的人类语言,以及(b)决定缩写,大小写,标点符号等问题的文化规范。顺便说一下,语言环境 nothing 与时区有关。

SimpleDateFormat类隐式使用JVM的当前默认值Locale。最好始终明确指定所需/期望的区域设置。可能是Locale.UKLocale.ENGLISH

java.time

您正在使用麻烦的旧日期时间类。我建议你了解java.time类并考虑它们的用法,虽然我不知道在Hibernate中对java.time的支持。

LocalDate

LocalDate类表示没有时间且没有时区的仅限日期的值。

LocalDate.now( ZoneId.of( "America/Montreal" ) ) ;

关于java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和& SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore