【问题标题】:TimeStamp Difference Between Java and SQLiteJava和SQLite之间的时间戳区别
【发布时间】:2015-09-30 02:07:30
【问题描述】:

您好,我有一个 SLQLite 数据库,其中有表 water_logs

CREATE TABLE water_logs( 
_id INTEGER PRIMARY KEY AUTOINCREMENT,
amount REAL NOT NULL,
icon INTEGER NOT NULL,
date INTEGER NOT NULL);

我以毫秒为单位存储日期。

Calendar cal = Calendar.getInstance(); 
cal.getTimeInMillis();

我的问题是我想使用 strftime 函数从我的日期列中获取日期。问题是 tjat java 日历时间戳与 SLQLite 时间戳不同

1436859563832 --> result from cal.getTimeInMillis();

1436607407--> SELECT strftime('%s','now')

我实际上想做的是按天对记录进行分组。如果将 SELECT strftime('%s','now') 的值粘贴到日期列中,则以下 SQL 查询可以正常工作

SELECT SUM(amount), date(`date`) FROM water_logs
GROUP BY date(`date`, 'unixepoch')

【问题讨论】:

    标签: java android sqlite time unix-timestamp


    【解决方案1】:

    在我看来,您使用的是 2 种不同的值类型。

    当你使用时

    Calendar cal = Calendar.getInstance(); 
    long time = cal.getTimeInMillis();
    

    输出值以毫秒为单位,如here所述。

    当你使用时

    strftime('%s','now')
    

    输出值以为单位,如here所述。

    所以,这可能是两个值不匹配的原因。 当然,以秒为单位的值可能会进行一些舍入,这可能会稍微改变它的值。

    【讨论】:

    • 谢谢,就是这样。在将它们存储在数据库中之前,我需要将毫秒除以 1000,因为在数据库中值存储为秒。
    【解决方案2】:

    我会尽力为您提供在 SQLite 数据库中存储日期的最佳方式。

    1) 始终使用整数来存储日期。

    2) 使用此实用方法将日期存储到数据库中,

    public static Long saveDate(Date date) {
        if (date != null) {
            return date.getTime();
        }
        return null;
    }
    

    喜欢,

    ContentValues values = new ContentValues();
    values.put(COLUMN_NAME, saveDate(entity.getDate()));
    long id = db.insertOrThrow(TABLE_NAME, null, values);
    

    3) 使用此实用方法加载日期,

    public static Date loadDate(Cursor cursor, int index) {
        if (cursor.isNull(index)) {
            return null;
        }
        return new Date(cursor.getLong(index));
    }
    

    喜欢,

    entity.setDate(loadDate(cursor, INDEX));
    

    4) 您还可以使用简单的 ORDER 子句按日期对数据进行排序,

    public static final String QUERY = "SELECT table._id, table.dateCol FROM table ORDER BY table.dateCol DESC";
    
    //...
    
        Cursor cursor = rawQuery(QUERY, null);
        cursor.moveToFirst();
    
        while (!cursor.isAfterLast()) {
            // Process results
        }
    

    【讨论】:

    • 不幸的是,这对我没有帮助,因为在步骤 2 中存储的日期仍然以不同的格式写入我不想要的数据库中,因为我无法将其转换为 java.util.Date
    • 你误解了我的问题我已经编辑了问题,并添加了 3 个屏幕截图,以便您更好地了解
    猜你喜欢
    • 1970-01-01
    • 2014-04-14
    • 2012-02-29
    • 2021-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-29
    相关资源
    最近更新 更多