【问题标题】:Comparing MySQL and Java Time比较 MySQL 和 Java 时间
【发布时间】:2011-09-06 09:32:14
【问题描述】:

我在 MySQL 中有一个 datetime 字段,我通过调用 result.getString('date') 来访问它,现在我想检查天气 Java 中的当前日期和时间是否超过了 MySQL 时间或在 MySQL 时间之前检查天气结果是否已激活。

MySQL 的日期时间格式为:2011-12-30 17:10:00,我如何将此字符串与 Java 时间进行比较?

【问题讨论】:

  • 您可以使用 getTimestamp('date') 然后在 Date 和 Timestamp 类上使用 getTime 方法进行比较。如果它确实是数据库中的字符串,那么我会使用日期格式化程序转换为日期并使用 getTime
  • @karakuricoder - 这是一个答案(正确,IMO),为什么要发表评论?

标签: java mysql datetime time


【解决方案1】:

在 Java 中,您可以使用 SimpleDateFormat 从字符串构造 Date

String text = "2011-12-30 17:10:00";
Date date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(text);
Date now = new Date();

if (date.after(now))
{
    // do stuff
}

您可以改为在数据库中执行类似的操作,使用基本算术和(我认为)相等运算符:+->< 等,还有MySQL's date and time functions

...虽然我很想知道您为什么使用getString() 而不是ResultSet#getTimestamp()


另外一个建议:考虑使用Joda Time 而不是java.util.Datejava.util.Calendar。见Should I use Java date and time classes or go with a 3rd party library like Joda Time?

【讨论】:

  • 也很好奇,但会使用 getTimestamp() 而不是 getDate()。由于 OP 正在使用 getString() 很好的答案。
  • @Mark 你绝对是对的,相应地进行了编辑。
【解决方案2】:

为什么不直接使用getDate('date') 而不是getString() 并使用Date 的before()after()

【讨论】:

  • getDate 返回一个 java.sql.Date,它应该被标准化,以便时间为 0:00:00。正确的是使用getTimestamp
【解决方案3】:

JDK 8 之前的版本

您可以使用ResultSet.getDate('date') 检索日期对象。然后使用Date.before()Date.after()的方法进行检查。

JDK 8 或更高版本

请参阅下方 Basil Bourque 的 answer

【讨论】:

  • getDate 返回一个 java.sql.Date ,它应该被标准化以便时间为 0:00:00。正确的是使用getTimestamp
  • 为什么我们必须将时间标准化为 00:00:00。在问题中,他想“检查当前日期和时间是否”
  • 我们?我们不必。它被驱动程序标准化,这就是问题所在。
  • java.sql.Date 假装只代表一个没有时间或时区的日期。但事实上,由于其从java.util.Date 继承的糟糕设计,java.sql.Date 确实存储了一个时间。作为 hack,它将时间设置为00:00:00.0。要从数据库中获取带有时间的日期,请使用java.sql.Timestamp。令人困惑?是的。尽量避免使用所有这些类,改用java.time 类。请参阅my Answer 了解更多信息。
【解决方案4】:

您可以使用非常容易比较日期的Joda DateTime api,我们在使用中具有相同的要求,即采用mysql datetime 格式并创建joda datetime 对象进行比较。

【讨论】:

  • 如果你能展示一些代码来演示 如何 Joda 使这变得更容易,那将会很有用。
【解决方案5】:

java.util.Calendar.getInstance().getTime().getTime() 将为您提供当前日期和时间(以毫秒为单位)

ResultSet.getDate('name of column').getTime()

将从数据库中获取日期和时间....

你可以像使用数字一样比较/进行逻辑运算.....例如,这将检查系统时间是否大于数据库中的日期时间

java.util.Calendar.getInstance().getTime().getTime() > new java.sql.Date(WIDTH).getTime();

您可以在 API 文档中查找有关这些方法的更多信息......

希望对你有帮助

【讨论】:

  • 使用 System.currentTimeMillis() 而不是创建日历和日期来获取当前日期和时间。 new java.sql.Date(WIDTH) 是怎么回事?这不是日期时间 - 它只是日期 - 也不是来自数据库 - 它是使用给定 (WIDTH) 毫秒时间值的日期!
【解决方案6】:

tl;博士

JDBC 4.2 及更高版本:

Boolean isFutureTask = myResultSet.getObject( "myDateColumn" , Instant.class )
                                  .isAfter( Instant.now() ) ;

旧 JDBC:

Boolean isFutureTask = myResultSet.getTimestamp( … )
                                  .toInstant()
                                  .isAfter( Instant.now() ) ;

java.time

其他答案是正确的,但使用过时的类。 java.util.Date/.Calendar 类已被 Java 8 及更高版本中内置的 java.time 框架所取代。

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

大部分 java.time 功能在ThreeTen-Backport 中向后移植到 Java 6 和 7,并在 ThreeTenABP 中进一步适应 Android。

日期时间类型

您应该将日期时间值存储为date-time type in your database。我相信那将是TIMESTAMP 在 MySQL 中输入(但我自己是 Postgres 人)。

然后使用java.sql.Timestamp 类型将数据移入/移出数据库。

java.sql.Timestamp ts = myResultSet.getTimestamp( 1 );

立即从 java.sql 转换为 java.time。 java.sql 类是那些被证明设计不佳、令人困惑和麻烦的旧日期时间类的一部分。仅在更新 JDBC 驱动程序以直接处理 java.time 类型之前使用它们。

旧的java.util.Timestamp 有新的方法来转换为Instant 或从Instant 转换。 Instant 是 UTC 时间线上的时刻,分辨率为纳秒。

java.time.Instant instant = ts.toInstant();

获取当前时刻。

Instant now = Instant.now();

比较。

Boolean isStoredDateTimePast = now.isAfter( instant );

JDBC 4.2 及更高版本中,您的JDBC driver 可能能够通过ResultSet::getObject 方法以Instant 对象的形式直接访问数据库中的值。


如果您必须解析该字符串,请将其转换为标准 ISO 8601 格式。用T 替换中间的空格。假设字符串表示与 UTC 的偏移量为零,则为 Zulu 附加 Z,这意味着 UTC。 java.time 类默认以 ISO 8601 格式解析/生成字符串。

String inputOriginal = "2011-12-30 17:10:00".
String input = inputOriginal.replace( " " , "T" ) + "Z" ;
Instant instant = Instant.parse( input );

【讨论】:

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