【问题标题】:How can I create an SQL Date using a Json Map in Java?如何在 Java 中使用 Json Map 创建 SQL 日期?
【发布时间】:2015-11-30 20:28:06
【问题描述】:

我想在java.sql.Date format:的MySql数据库中保存一个日期

new Date();

输出:2015 年 9 月 4 日星期五 16:47:40 BST

我需要从 Json Map 中获取日期:

created": {

    "date": 3,
    "day": 4,
    "hours": 14,
    "minutes": 49,
    "month": 8,
    "nanos": 0,
    "seconds": 59,
    "time": 1441288199000,
    "timezoneOffset": -60,
    "year": 115

}

Map<String, Object> dateMap = (Map<String, Object>) dateJsonObject;

如何使用上述日期映射中的值正确格式化新的 sql 日期对象?

【问题讨论】:

  • 如果您在 Java 中使用 Date(),请考虑使用 jodatimes DateTime(),这样可以更轻松地处理日期。 joda.org/joda-time

标签: java mysql json date


【解决方案1】:

鉴于您的 Json 数据包含时间字段,我假设您指的是 MySQL DATETIME 数据类型,而不是 DATE 数据类型。

要从 Java 向 MySQL 发送 DATETIME 值,您需要 java.sql.Timestamp

如果您没有时区问题,最简单的方法是使用time 值:

new Timestamp(1441288199000L)

对于时区问题,您应该使用timezoneOffset 调整时区,或者将所有其他字段应用到Calendar

【讨论】:

    【解决方案2】:

    java.time

    我建议您在 Java 8 及更高版本中内置的 java.time 框架中完成大部分工作。 (Tutorial)

    Instant 是 java.time 的核心类,代表UTC 时区中时间轴上的一个点。 Instant 类在nanoseconds-since-epoch 中跟踪时间,但有一个工厂method taking a count in milliseconds

    long millisecondsSinceEpoch = 1441288199000L;
    Instant instant = Instant.ofEpochMilli( millisecondsSinceEpoch );
    String output = instant.toString();
    

    2015-09-03T13:49:59Z

    JDBC

    最终,JDBC 驱动程序将更新为直接使用新的 java.time 类型。但同时我们需要转换为java.sql.Timestamp

    java.sql.Timestamp 有新的附加方法用于与 java.time 之间的转换。

    java.sql.Timestamp ts = java.sql.Timestamp.from( instant );
    String tsAsString = ts.toString( );
    

    2015-09-03 06:49:59.0

    请注意 java.sql.Timestamp 中善意但无用的功能,其中其toString 实现默默地应用您的JVM’s current default time zone。更糟糕的是,它没有附加任何调整后时区的指示符,从而使这个字符串变得更糟。

    这里 java.sql.Timestamp 的 toString 应用了我的时区 America/Los_Angeles,将日期时间向后移动了七个小时。时间线上的时刻与上面看到的Instant::toString 输出相同,仅由美国西海岸的wall-time 表示。尽可能避免使用这些旧类并尽可能使用 java.time 的众多原因之一。

    java.sql.Date

    问题要求 java.sql.Date 是仅日期(以 UTC 表示),没有任何时间。

    实际上 java.sql.Date 两者都有(UTC 时间为 00:00:00.0),但假装没有。 (这个类是 Java 早期的一个糟糕的 hack。)

    要获得java.sql.Date,我们需要一个LocalDate,我们可以从LocalDateTime 获得,我们可以从Instant 获得。

    LocalDate localDate = LocalDateTime.ofInstant( instant , ZoneOffset.UTC ).toLocalDate();
    java.sql.Date sqlDate = java.sql.Date.valueOf( localDate );
    

    本地日期:2015-09-03 sql日期:2015-09-03

    【讨论】:

      【解决方案3】:

      试试这个..

      从 JSON 中,时间值 + 小时 + 分钟 + 秒,您将拥有 Sep 3 14:49:59 ,因此 GMT 将是 Sep 03 13:49:59 ... BST 和 GMT 之间的时间偏移为 60 分钟。 BST 比格林威治标准时间早 1 小时。

          //assuming you need time adjusted to GMT...
      Calendar cal = Calendar.getInstance();
      cal.setTimeInMillis(1441288199000L);//"time": 1441288199000 >>> 2015-09-03
      cal.set(Calendar.HOUR, 14);
      cal.set(Calendar.MINUTE, 49);
      cal.set(Calendar.SECOND, 59);
      cal.add(Calendar.MILLISECOND, -60*60*1000); //timezone adjust, since you have the offset..
      java.sql.Date sqlDate = new Date(cal.getTimeInMillis()) ;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-02-06
        • 1970-01-01
        • 2020-06-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-25
        • 2021-01-21
        相关资源
        最近更新 更多