【问题标题】:How to transform ISO DATE to Timestamp in Java or SQL?如何在 Java 或 SQL 中将 ISO DATE 转换为时间戳?
【发布时间】:2017-01-10 14:21:35
【问题描述】:

我同时使用 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 中对具有相同名称的列使用 Timestamp 格式类型,因此想法是将日期转换为时间戳。

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

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 contrast con la cadena de formato

有什么问题?

【问题讨论】:

  • Like this in Oracle;但是标题说你想用 Java 来做,那么你真正的意思是什么?另外,该列是什么数据类型,您是否打算将 UTC 值转换为本地时间?如果它是一个日期并且您不想调整它,您可以使用与 to_date() 相同的格式掩码,但这并不完全正确。
  • getFieldFromJson方法中的代码是如何设置的?您是否使用 Mongo java 驱动程序来处理映射?您也应该尝试将日期存储为 mongo db 中的日期类型。所以你不必转换,你可以从 MongoDB 中读取并将其保存到 oracle。

标签: java oracle mongodb timestamp isodate


【解决方案1】:

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')"
                        + ")";

【讨论】:

    【解决方案2】:

    我 SimpleDateFormat 解析你的字段 Date 和 getTime() 你返回 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();
    

    【讨论】:

    • 不正确。该格式模式与输入字符串匹配。忽略标准 ISO 8601 格式字符串中间的 T。
    • @GyGy19 我同意,如果使用此代码,日期会更改:(
    • 是的,来自位置!
    【解决方案3】:

    java.time

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

    Instant 类表示UTC 中时间轴上的时刻,分辨率为nanoseconds(最多九 (9) 位小数)。

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

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

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

    myPreparedStatement.setObject( 1 , instant );
    

    或者您可能需要指定SQLType。

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

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

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

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


    关于java.time

    java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.Date、Calendar 和 SimpleDateFormat。

    Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。

    要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310。

    从哪里获得 java.time 类?

    ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如Interval、YearWeek、YearQuarter 和more。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-05
      • 1970-01-01
      • 2014-12-10
      • 1970-01-01
      • 2012-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多