繁体   English   中英

日期在Java中的非英语操作系统中即将到来

[英]date is coming in non-english os in java

在我的项目中,新的Date(); 用其他语言给出日期。 并且它给出了错误,有人可以提供解决方案以将darte转换为英语吗?

我的代码如下:

    model.put("total", timeSheetTempDAO.getCurrentDayHours(SessionManagement.getCurrentUserId(),new SimpleDateFormat("YYYY-MMM-dd").format(new Date())));

org.postgresql.util.PSQLException:错误:类型日期的输入语法无效:“ २०१७-जनवरी -२६”位置: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) .jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:388)org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:273)org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(Set) .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.hibe rnate.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。

tl; dr

  • 为您的SimpleDateFormat指定Locale
  • 修复格式模式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类型和数据类型之间的差异。 在“ Stack Overflow”中搜索“ JDBC”和“ LocalDate”,以获取更多讨论和示例。

时区

您正在忽略时区问题。

时区对于确定日期至关重要。 在任何给定时刻,日期都会在全球范围内变化。 例如, 法国巴黎午夜过后几分钟是新的一天,而在魁北克蒙特利尔仍然是“昨天”。

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

语言环境

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

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及更高版本中。 这些类取代了麻烦的旧的旧式日期时间类,例如java.util.DateCalendarSimpleDateFormat

现在处于维护模式Joda-Time项目建议迁移到java.time类。

要了解更多信息,请参见Oracle教程 并在Stack Overflow中搜索许多示例和说明。 规格为JSR 310

在哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展了java.time。 该项目为将来可能在java.time中添加内容提供了一个试验场。 您可以在这里找到一些有用的类,比如IntervalYearWeekYearQuarter ,和更多

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM