【问题标题】:Java data type to hold only dateJava 数据类型仅保存日期
【发布时间】:2012-06-18 13:14:25
【问题描述】:

Java 中哪种数据类型可以只保存日期而不需要时间组件?例如,只存储12/07/2012。我正在将数据持久化到/从具有仅日期数据类型的数据库中,因此我正在寻找 Java 中最好的等效数据类型。

【问题讨论】:

    标签: java


    【解决方案1】:

    来自 JDK:java.sql.Date:

    一个毫秒值的瘦包装器,允许 JDBC 识别 这是一个 SQL DATE 值。一个毫秒值代表数字 自January 1, 1970 00:00:00.000 GMT 以来经过的毫秒数。

    为符合 SQL DATE 的定义,毫秒值 由java.sql.Date 实例包裹的必须通过设置“规范化” 小时、分钟、秒和毫秒到零 实例关联的特定时区。

    或来自JodaTimeDateMidnightLocalDate(谢谢 @cdeszaq)

    DateMidnight 定义时间组件固定在的日期 午夜。该类使用时区,因此午夜是本地的,除非 使用 UTC 时区。

    需要强调的是,这个类代表了 任何一天的午夜。请注意,午夜被定义为 00:00, 这是一天的开始。

    【讨论】:

    • +1 用于引用 JodaTime。 JodaTime 中还有 LocalDate 类,它仅代表日期组件。这不是一个完全干净的合身,但它在过去满足了我的需求。
    • 午夜相关的类和方法已被弃用,不应使用。请参阅withTimeAtStartOfDay 方法。此外,Joda-Time 的制造商建议我们迁移到 java.time 框架。
    • 谢谢,java.sql.Date 正是我所需要的。我正在使用java.utils.Date,而 json 序列化程序搞砸了。
    【解决方案2】:

    其他答案已过时。

    旧的日期时间类是出了名的麻烦,应该避免。

    java.time

    java.time 框架内置于 Java 8 及更高版本中。见Oracle Tutorial。 java.time 的大部分功能是back-ported to Jave 6 & 7adapted to Android

    LocalDate 类表示没有时间和时区的仅日期值。

    LocalDate localDate = LocalDate.of( 2012 , 12 , 7 );
    

    文本表示

    toString 方法使用标准ISO 8601 格式生成一个字符串。

    localDate.toString() → 2012-12-07

    对于其他格式,请使用DateTimeFormatter

    SQL

    JDBC drivers 兼容JDBC 4.2 可以使用getObjectsetObject 方法直接将LocalDate 等java.time 类型获取/传递给SQL 类型DATE

    如果您的驱动程序不能这样做,请回退到使用 java.sql 类型。新方法已添加到旧类中以方便转换。

    java.sql.Date sqlDate = java.sql.Date.valueOf( localDate );
    

    还有另一个方向。

    LocalDate localDate = sqlDate.toLocalDate();
    

    搜索堆栈溢出

    在 Stack Overflow 上搜索 许多 更多关于使用 java.time 的讨论和示例。例如,my answerthis similar Question

    【讨论】:

      【解决方案3】:

      日期类。它拥有一个 UNIX 时间戳。在大多数数据库中,您也可以指定一个字段来保存时间戳。您可以根据需要使用 DateFormat 格式化时间戳。

      【讨论】:

        【解决方案4】:

        如果您使用的是 Java 8,则可以使用java.time.LocalDate

        【讨论】:

          【解决方案5】:

          使用可用的 Date 类。

          【讨论】:

            【解决方案6】:

            它显示了如何只保留日期(没有时间)

            formatter = new SimpleDateFormat("dd/MM/yyyy");
            
            Date date= new Date();
            
            Date todayWithOutTime =formatter.parse(formatter.format(date));
            

            【讨论】:

              【解决方案7】:

              不幸的是,java.util.Date 是某种东西,在 SQL 中的名称为 Timestamp。没有纯日期类型,javax.sql.Date 扩展了java.util.Date,在 Java 中使用这种类型进行日期操作没有任何优势。

              我正在使用 apache commons-lang class DateUtils 处理这个问题:

              Date myDate = DateUtils.truncate(timestamp, Calendar.DAY_OF_MONTH);
              

              这将删除时间部分,只留下日期部分。

              【讨论】:

                【解决方案8】:

                使用日期类。这是更好的方法。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2011-09-24
                  相关资源
                  最近更新 更多