【问题标题】:datetime datatype in javajava中的日期时间数据类型
【发布时间】:2011-09-24 20:54:00
【问题描述】:

我可以在 Java 中使用哪种数据类型来保存当前日期和时间?我想将日期时间存储在数据库中,并在 java bean 中有一个字段来保存它。

java.util.Date 吗?

【问题讨论】:

    标签: java date timestamp


    【解决方案1】:

    java.util.Date 代表时间的瞬间,与特定时区或日历系统无关。但它确实同时保存了日期和时间——它基本上是自 Unix 纪元以来的毫秒数。

    您也可以使用java.util.Calendar,它了解这两件事。

    我个人强烈建议您使用Joda Time,这是一个丰富的日期/时间 API。它允许您更清楚地表达您的数据,类型包括“仅日期”、“仅本地时间”、“本地日期/时间”、“即时”、“带时区的日期/时间”等。大多数类型也是不可变的,这在代码清晰度方面是一个巨大的好处。

    【讨论】:

    • 我的错,进入了错误的文档。我的评论明显有误导性,我会删除它。
    【解决方案2】:
    import java.util.Date;
    import java.text.DateFormat;
    import java.text.SimpleDateFormat;
    
    private String getDateTime() {
        DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
        Date date = new Date();
        return dateFormat.format(date);
    }
    

    【讨论】:

    【解决方案3】:

    您可以使用日历。

         Calendar rightNow = Calendar.getInstance();
    

    Calendar

    Date4j alternative to Date, Calendar, and related Java classes

    【讨论】:

      【解决方案4】:

      +1 推荐 Joda-time。如果您打算做的不仅仅是一个简单的 Hello World 示例,我建议您阅读以下内容:

      Daylight saving time and time zone best practices

      【讨论】:

        【解决方案5】:

        取决于 RDBMS 甚至 JDBC 驱动程序。

        大多数时候你可以使用java.sql.Timestamp 和一个准备好的语句:

        pstmt.setTimestamp( index, new Timestamp( yourJavaUtilDateInstance.getTime() );
        

        【讨论】:

          【解决方案6】:

          我使用了这个导入:

          import java.util.Date;
          

          并像这样声明我的变量:

          Date studentEnrollementDate;
          

          【讨论】:

            【解决方案7】:

            从 Java 8 开始,java.time 标准库似乎是要走的路。来自Joda time网页:

            请注意,从 Java SE 8 开始,用户被要求迁移到 java.time (JSR-310) - JDK 的核心部分,它取代了这个项目。


            回到你的问题。如果你使用 Java 8,我想你想要LocalDateTime。因为它包含日期和时间,但不知道时区或任何参考时间点,例如 unix 纪元。

            【讨论】:

            • 正确使用 java.time 但错误使用 LocalDateTime。因为它没有时区或与 UTC 的偏移量,所以它没有真正的意义。这不是时间线上的时刻。在商业应用程序中很少需要。 Instant、OffsetDateTime 和 ZonedDateTime 都用于表示时间轴上的某个时刻。
            • @BasilBourque 是的,这是一个很好的改写。虽然手头的问题还不够具体,无法说明什么是对还是错。
            • 同意这个问题不清楚,而且相当贫乏,缺乏细节。但它确实说“当前”日期和时间,几乎可以肯定应该进行分区。
            【解决方案8】:

            java.time

            Java 8 及更高版本中内置的 java.time 框架取代了与 Java 的最早版本和 Joda-Time 库捆绑在一起的旧日期时间类。 java.time 类已向后移植到 Java 6 和 7 以及 Android。

            Instant 类代表 UTC 时间轴上的一个时刻,分辨率为纳秒。

            Instant instant = Instant.now();
            

            应用与 UTC 的偏移量(小时数和可能的分钟数和秒数)以获得 OffsetDateTime

            ZoneOffset offset = ZoneOffset.of( "-04:00" );
            OffsetDateTime odt = OffsetDateTime.ofInstant( instant , offset );
            

            更好的是应用一个完整的时区,它是一个偏移量加上一组处理异常的规则,例如夏令时 (DST)。

            ZoneId zoneId = ZoneId.of( "America/Montreal" );
            ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );
            

            数据库

            希望 JDBC 驱动程序将被更新以直接与 java.time 类。在此之前,我们必须使用 java.sql 类将日期时间值移入/移出数据库。但是将您对 java.sql 类的使用限制在数据库传输的琐事上。不要将它们用于业务逻辑。作为旧日期时间类的一部分,它们设计不佳、令人困惑且麻烦。

            使用添加到旧类的新方法与 java.time 进行转换。寻找to…valueOf 方法。

            使用java.sql.Timestamp 类作为日期时间值。

            java.sql.Timestamp ts = java.sql.Timestamp.valueOf( instant );
            

            然后往另一个方向发展……

            Instant instant = ts.toInstant();
            

            对于日期时间数据,在设计数据库中的表列时,您几乎总是需要TIMESTAMP WITH TIME ZONE 数据类型而不是WITHOUT

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2014-04-02
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-10-20
              相关资源
              最近更新 更多