Android - 如何在 SQLite 中存储日期和时间 "properly"?

标签 android sqlite date time

我已经阅读了一些关于这个问题的其他帖子。大多数答案建议将日期/时间数据转换为某种格式 (UTC) 并将其存储在字符串数据类型中。

将它们以整数格式存储并为每个数据(年、月、日、小时、分钟)存储 1 列是否“合适”?或者这是 Not Acceptable ?因为这将使与当前日期/时间的比较更容易。我打算做的是一行数据是否超过当前日期。

Java代码:

public void saveExam() {
    date = (DatePicker)findViewById(R.id.examDate);
    Integer day = date.getDayOfMonth();
    Integer month = date.getMonth();
    Integer year = date.getYear();
    StringBuilder temp = new StringBuilder();
    temp.append(day.toString()).append("/").append(month.toString()).append("/").append(year.toString());
    String dateStr = temp.toString();

    time = (TimePicker)findViewById(R.id.examTime);
    Integer hour, minutes;
    if (Build.VERSION.SDK_INT >= 23 ) {
        hour = time.getHour();
        minutes = time.getMinute();
    } else {
        hour = time.getCurrentHour();
        minutes = time.getCurrentMinute();
    }
    temp = new StringBuilder();
    temp.append(hour.toString()).append(":").append(minutes.toString());
    String timeStr = temp.toString();

    Toast.makeText(add_exam.this, dateStr  + ", " + timeStr, Toast.LENGTH_LONG).show();
}

最佳答案

根据 Sqlite documentation (section 2.2) ,您应该以下列方式之一存储您的日期:

  • ISO8601 字符串形式的文本(“YYYY-MM-DD HH:MM:SS.SSS”)。
  • 真实如儒略日数字。
  • 作为 Unix 时间的整数,自 1970-01-01 00:00:00 UTC 以来的秒数。

可以使用 strftime 解决比较问题允许您比较日期的函数,而不管它们的存储类型(TEXT、REAL 或 INTEGER)。

假设您想要获取数据库中日期为 Jenuary 的所有行。你可以这样做:

SELECT * FROM table
WHERE strftime('%m', your_date_column) == '01'

或者您可能想要获取时间为 09:40 的所有行:

SELECT * FROM table
WHERE strftime('%H:%M', your_date_column) == '09:40'

或者还有:

SELECT * FROM table
WHERE strftime('%s', your_date_column) < strftime('%s','now')

将返回所有日期早于当前日期(现在)的行。

SUMMARY:函数strftime抽象了数据库存储模式,所以它并不真正决定你使用哪种模式。

关于Android - 如何在 SQLite 中存储日期和时间 "properly"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39546541/

相关文章:

java - 我可以让 Filter getFilter() 方法更改多个列表吗?

android - 是否可以在运行时更新Android应用程序然后再次重新加载

java - 如何解决 "adapter cannot be applied"错误?

java - 在sqlite中插入不起作用

javascript - 我如何告诉 javascript 在序列化时不要将日期对象转换为 UTC

java - StartActivityForResult 不暂停主 Activity

android - 为什么 AndroidX 需要将 compileSdkVersion 设置为 28 或更高

Android JSON 服务器响应可能无效错误

javascript - 0 使用JavaScript在日期字符串中填充日和月

mysql - Laravel 查询失败但在 Mysql 中有效