我有一个事件表,其中包含UTC(unixepoch)的开始时间,例如
sqlite> SELECT name, startUtc, datetime(startUtc, 'unixepoch') AS datetime FROM events;
name startUtc datetime
---------- ---------- -------------------
aaa 1451008800 2015-12-25 02:00:00
bbb 1451039400 2015-12-25 10:30:00
这些值将在Cursor
中返回。但是,我希望预先计算每个事件发生的日期与用户的本地时区(对我来说是GMT-08:00
)。基本上我想要一个适当日期的时间戳,截断所有更细粒度的字段(小时,分钟等)。这是我的查询与结果一起显示的内容:
sqlite> SELECT name, startUtc, strftime('%s', startUtc, 'unixepoch', 'localtime', 'start of day') AS localDay from events;
name startUtc localDay
---------- ---------- ----------
aaa 1451008800 1450915200
bbb 1451039400 1451001600
完整性检查:
sqlite> SELECT datetime(1450915200, 'unixepoch');
2015-12-24 00:00:00
这一切似乎都没问题,直到我使用事件的localDay
值" aaa"在Calendar
对象中。
long localDay = cursor.getLong(cursor.getColumnIndex("localDay"));
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(localDay * 1000); // adjust bc sqlite returns seconds
int day = calendar.get(Calendar.DAY_OF_MONTH); // returns 23, not 24
基本上,java Calendar
将时间戳解释为2015-12-23 16:00:00
而不是2015-12-24 00:00:00
,我最终会错误地查看该事件。
我在这里缺少什么?