[英]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。
SimpleDateFormat
指定Locale
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类型和数据类型之间的差异。 在“ Stack Overflow”中搜索“ JDBC”和“ LocalDate”,以获取更多讨论和示例。
您正在忽略时区问题。
时区对于确定日期至关重要。 在任何给定时刻,日期都会在全球范围内变化。 例如, 法国巴黎午夜过后几分钟是新的一天,而在魁北克蒙特利尔仍然是“昨天”。
SimpleDateFormat
类隐式应用JVM的当前默认时区。 因此,您的结果可能会有所不同。 最好始终明确指定所需/期望的时区。
同样,在生成表示日期时间值的字符串时,您会忽略Locale
的问题。 Locale
确定(a)用于翻译日名,月名等的人类语言,以及(b)决定缩写,大写,标点符号等问题的文化规范。 顺便说一句,语言环境与时区无关 。
SimpleDateFormat
类隐式使用JVM的当前默认Locale
。 最好始终明确指定所需/期望的语言环境。 也许是Locale.UK
或Locale.ENGLISH
。
您正在使用麻烦的旧日期时间类。 我建议您了解java.time类并考虑使用它们,尽管我不知道Hibernate中对java.time的支持。
LocalDate
LocalDate
类表示没有日期和时区的仅日期值。
LocalDate.now( ZoneId.of( "America/Montreal" ) ) ;
java.time框架内置于Java 8及更高版本中。 这些类取代了麻烦的旧的旧式日期时间类,例如java.util.Date
, Calendar
和SimpleDateFormat
。
现在处于维护模式的Joda-Time项目建议迁移到java.time类。
要了解更多信息,请参见Oracle教程 。 并在Stack Overflow中搜索许多示例和说明。 规格为JSR 310 。
在哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展了java.time。 该项目为将来可能在java.time中添加内容提供了一个试验场。 您可以在这里找到一些有用的类,比如Interval
, YearWeek
, YearQuarter
,和更多 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.