如何将 ISO DATE 转换为 Java 或 SQL 中的时间戳?

How to transform ISO DATE to Timestamp in Java or SQL?

我同时使用Mongo和Oracle 12c。

对于 MongoDB,我使用 ISO DATE(但像字符串一样)来保存日期。像这样:

{
            "_id" : null,
            "fields" : {
                "Status" : "UnderInvestigation",
                "Assignee" : "",
                "CreationDate" : "2016-12-14T00:00:00Z", //ISO DATE
                "CaseId" : "8165021",
                "RunningMode" : "STS",
                "CloserDueDate" : ""
            },
            "domain" : {},
            "arrays" : {}
        }

我想在 Oracle 中对同名列使用时间戳格式类型,所以我的想法是将该日期转换为时间戳。

我不知道该怎么做。我有以下代码,但它不起作用。

final String query = "INSERT INTO " + TABLE_APPLICATION + " (CreationDate) VALUES (TO_DATE(?,'YYYY-MM-DD HH24:MI:SS'))" ;
PreparedStatement ps = getPreparedStatement();
((OraclePreparedStatement) ps).setString(1, getValueFromJson(JSON, 'fields.CreationDate'));

但是我得到了:

java.sql.SQLDataException: ORA-01861: el literal no coincide con la cadena de formato

有什么问题?

我 SimpleDateFormat 解析你的字段 Date 和 getTime() 你 return millisTime 精确。

//String base = "YYYY-MM-ddTkk:mm:ssZ";
//"date": "2016-11-22T16:59:01+01:00"

String timeform = "YYYY-MM-dd-kk-mm-ss-Z";
Date datec = new Date();

//si null ont crée une nouvelle date
if (!json.isNull("date"))
{
    DateFormat format = new SimpleDateFormat(timeform, Locale.FRANCE);
    try {
        datec = format.parse(json.getString("date"));
    } catch (ParseException e){}
}
datec.getTime();

Oracle 解决方案:

SELECT TO_TIMESTAMP_TZ(
         '2016-12-14T00:00:00Z',
         'YYYY-MM-DD"T"HH24:MI:SSTZH:TZM'
       )
FROM   DUAL;

所以你的代码应该是:

final String query = "INSERT INTO " + TABLE_APPLICATION + " ("
                        + "CreationDate"
                        + ") VALUES ("
                        + "TO_TIMESTAMP_TZ( ?, 'YYYY-MM-DD\"T\"HH24:MI:SSTZH:TZM')"
                        + ")";

java.time

要在 Java 而不是 SQL 中执行此操作,请使用 java.time classes.

Instant class represents a moment on the timeline in UTC with a resolution of nanoseconds(最多九 (9) 位小数)。

您输入的字符串采用标准 ISO 8601 格式。 java.time classes 默认使用这些标准格式。因此,无需指定格式模式。

Instant instant = Instant.parse( "2016-12-14T00:00:00Z" );

如果您的 JDBC 驱动程序支持 JDBC 4.2 或更高版本,您可以通过 PreparedStatement::setObject/ResultSet::getObject 方法 pass/fetch java.time 对象.

myPreparedStatement.setObject( 1 , instant );

或者您可能需要指定 SQLType

myPreparedStatement.setObject( 1 , instant , JDBCType.TIMESTAMP_WITH_TIMEZONE );

如果您的 JDBC 驱动程序未指定 java.time 类型,请回退到使用旧的 java.sql 类型。调用添加到旧 classes 的新方法进行转换。

java.sql.Timestamp ts = java.sql.Timestamp.from( instant );
myPreparedStatement.setTimestamp( 1 , ts );

您的问题确实与许多其他问题重复。在 Stack Overflow 中搜索这些 class 名称以获得更多示例和讨论。


关于java.time

java.time framework is built into Java 8 and later. These classes supplant the troublesome old legacy date-time classes such as java.util.Date, Calendar, & SimpleDateFormat.

Joda-Time project, now in maintenance mode, advises migration to the java.time classes.

要了解更多信息,请参阅 Oracle Tutorial. And search Stack Overflow for many examples and explanations. Specification is JSR 310

从哪里获得java.time classes?

  • Java SE 8 and SE 9 及更高版本
    • 内置。
    • 标准 Java API 的一部分,带有捆绑实施。
    • Java 9 添加了一些小功能和修复。
  • Java SE 6 and SE 7
  • Android
    • ThreeTenABP 项目专门为 Android 改编 ThreeTen-Backport(如上所述)。
    • 参见

ThreeTen-Extra project extends java.time with additional classes. This project is a proving ground for possible future additions to java.time. You may find some useful classes here such as Interval, YearWeek, YearQuarter, and more.