【问题标题】:Best way to store, retrieve, and compare dates in Java在 Java 中存储、检索和比较日期的最佳方式
【发布时间】:2012-12-22 15:16:23
【问题描述】:

我来自 PHP 背景。很长一段时间以来,我一直是一名 PHP 开发人员。我想跳入 Android 应用程序开发。我创建了一个应用程序,但我不觉得我对时间和日期功能有很强的把握,尤其是在存储在数据库中时。 O 我主要关心的问题之一是如何从数据库 (SQLite) 中存储和检索日期并进行比较。

我在 PHP 中的做法很简单;我使用time() 函数,它为当前时间创建一个unix 时间戳,然后我将它作为整数存储在MySQL 数据库中。由于 MySQL 的日期函数,以及通过 PHP 以整数形式轻松检索和比较日期的能力,这使得事情变得非常简单和容易。

所以基本上,我想知道 Java 的最佳解决方案是什么。在为我未来的 Android 应用创建、存储、检索和比较日期时,您建议我做什么?

这是我将使用的 PHP 代码示例,也许这会让人们更好地了解我的习惯以及我在寻找什么:

Database structure:
`id` (int) auto increment
`username` (varchar)
`the_date` (int)

<?php

$username = 'scarhand77';
$the_date = time();

// insert into database

mysql_query("insert into `stack_overflow` (`username`, `the_date`) values ('$username', '$the_date')");

// retrieve from database

$user_date = mysql_result(mysql_query("select `the_date` from `stack_overflow` where `username`='$username'"), 0);

// compare $user_date, see if its older than right now

if ($user_date < time())
    echo 'it is older';
else
    echo 'it is not older';

?>

任何帮助将不胜感激。

【问题讨论】:

    标签: java android sqlite date time


    【解决方案1】:

    只需使用原始长。从System.currentTimeMillis(); 返回的同一个(当前时间)。 它是自 1970 年以来的毫秒数。它与 unix 时间基本相同,但具有带符号的 64 位值(java long),并且以毫秒而不是秒为单位。

    java.util.Date 对象也只是 long 的包装器,所以如果你也喜欢的话,它几乎没有意义,但也很容易与 Date 对象一起使用。不要与java.sql.Date混淆

    然后您可以像在示例中一样比较时间

    long time1 = System.currentTimeMillis();
    long time2 = ...;
    
    if (time2 < time1) {
    

    【讨论】:

      【解决方案2】:

      如果您愿意,甚至可以在不创建 Date 对象的情况下获得 unix 时间戳:

      long unixTime = System.currentTimeMillis() / 1000L;
      

      然后你可以像你习惯的那样简单地将它写入 MySQL。

      【讨论】:

      • 为什么要除以1000L?我假设这是把它变成秒而不是毫秒。不知道我想要那个。
      • 因为 unixtime 是自纪元以来的秒数......不是毫秒。
      【解决方案3】:

      SQLite 仅支持datatypes 中的少数几个,其中唯一适合存储时间的是integer。它最多可以容纳 64 位 数字,因此可以很好地与 Java 的 long 配合使用。

      当存储到数据库中时,您从 java.util.Date 获取毫秒计数(自 1970 年 1 月 1 日起):

      Date now = new Date();
      long millis = now.getTime();
      

      然后您可以轻松地使用给定的毫秒重新创建日期:

      long millis = ...
      Date date = new Date(millis);
      

      【讨论】:

        【解决方案4】:

        如果您在从数据库中检索时间后对时间进行操作,您可能需要查看 Joda Time。它有大量有用的功能,而标准的 Java 库在这方面有点缺乏。

        【讨论】:

          猜你喜欢
          • 2017-10-30
          • 2015-03-26
          • 2012-06-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-09-24
          相关资源
          最近更新 更多