最近我们将java代码从aws环境迁移到oci环境。下面是给出问题的代码。
sql.addSQLToWhereClause(XXXTable, "? between table1.start_date and table1.end_date")
.addSQLToWhereClause(YYYTable, "table1.ORG_ID = ? ")
.addSQLToWhereClause(XXXTable, "table1.LANG_CODE = ? ")
.bind(new Date())
.bind(ConstValues.ORG_ID)
.bind(locale.toString().toUpperCase());
在aws环境中,它工作正常,但在oci环境中,我们得到错误:ora-01830:日期格式图片在转换整个输入字符串之前结束
出现此错误是因为.bind(new date())将'07-jan-2021 10:49:04'放在第一个参数中。但预期值为“2021年1月7日”
请说明为什么这些附加信息出现在当前日期,以及如何在不更改java代码的情况下删除这些信息。
谢谢rahul
2条答案
按热度按时间xqk2d5yq1#
这个
java.util.Date
对象不是像现代日期时间类型那样的实时日期时间对象;相反,它表示从Epoch of January 1, 1970
. 打印对象时java.util.Date
,其toString
方法返回jvm时区中的日期时间,该值是从该毫秒值计算出来的。如果需要在不同的时区打印日期时间,则需要将时区设置为SimpleDateFormat
并从中获取格式化字符串。一java.sql.Date
对象也从其父对象继承了这些问题java.util.Date
.JavaSE8以后,jdbc支持现代日期时间api。全班同学,
java.time.LocalDate
表示一个类,它封装了一年、一个月和一个月的一天,您应该使用这个类而不是Date
.从trail:date-time了解有关现代日期时间api的更多信息。
此外,api的日期时间
java.util
以及它们的格式化api,SimpleDateFormat
过时且容易出错。建议完全停止使用它们,并切换到现代日期时间api。出于任何原因,如果您必须坚持使用Java6或Java7,您可以使用threeten backport,它将大部分java.time功能向后移植到Java6和Java7。
如果您正在为一个android项目工作,并且您的android api级别仍然不符合java-8,请检查通过desugaring提供的java8+api以及如何在android项目中使用threetenabp。
ymdaylpp2#
java的对象示例
java.util.Date
课堂上总是有时间的部分。为什么它在aws上会有不同的表现…-不知道!但我认为
bind(java.util.Date)
在这些环境中是不同的,因为Date.toString()
与问题中显示的输出完全不同。所以请检查提供相应类的库的版本。