由于环境的变化,java new date()函数正在以'dd-mon-yyyy hh:mm:ss'格式给出日期但只需要'dd mon yyyy'格式

xuo3flqw  于 2021-06-26  发布在  Java
关注(0)|答案(2)|浏览(350)

最近我们将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

xqk2d5yq

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 .

sql.addSQLToWhereClause(XXXTable, "? between table1.start_date and table1.end_date")
            .addSQLToWhereClause(YYYTable, "table1.ORG_ID = ? ")
            .addSQLToWhereClause(XXXTable, "table1.LANG_CODE = ? ")
            .bind(LocalDate.now())
            .bind(ConstValues.ORG_ID)
            .bind(locale.toString().toUpperCase());

从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。

ymdaylpp

ymdaylpp2#

java的对象示例 java.util.Date 课堂上总是有时间的部分。为什么它在aws上会有不同的表现…-不知道!
但我认为 bind(java.util.Date) 在这些环境中是不同的,因为 Date.toString() 与问题中显示的输出完全不同。
所以请检查提供相应类的库的版本。

相关问题