为什么datetime('now')在SQLite中实时返回2小时?

时间:2012-12-07 10:05:52

标签: android sqlite datetime utc

每当我从SQLite中的表中对某个记录进行更改时,我需要在lastChangedDate列中设置来自法国的时间。这是我桌子的结构:

CREATE TABLE name(
    id VARCHAR(36) PRIMARY KEY
    , pos_report_id VARCHAR(36)
    , path_name VARCHAR(64)
    , photo_name VARCHAR(64)
    , from_scratch INTEGER DEFAULT 0
    , lastChangedDate DATETIME DEFAULT (DATETIME('now', 'utc', '1 hours'))
)

我看到DATETIME('now')在我的实际时间前2小时返回,DATETIME('now', 'utc', '1 hours')在我的时间前3小时返回。为什么会这样?我需要该应用程序在更多国家/地区使用,因此我无法使用localtime

知道如何解决这个问题吗?

2 个答案:

答案 0 :(得分:4)

我有同样的问题(在Raspbarry Pi上使用sqlite)。 'utc'显然只根据位置和时区来计算差异。我让它像这样运行:

select datetime(datetime('now', 'localtime'), 'utc');

另请查看我的VIEW [NOW]的其他变体,以便进行传感器记录。

CREATE VIEW [NOW] AS 
SELECT datetime('now', 'localtime') as LOCAL,
datetime(datetime('now', 'localtime'),'utc') as UTC, 
substr(datetime('now', 'localtime'),1,17)||'00' as TimeSlot_1min, 
substr(datetime('now', 'localtime'),1,15)||'0:00' as TimeSlot_10min, 
substr(datetime('now', 'localtime'),1,14)||'00:00' as TimeSlot_1h;

答案 1 :(得分:2)

尝试datetime('now','localtime')而不是DATETIME('now','utc','1小时') 好的,不要使用lastChangedDate的默认时间

CREATE TABLE name(
    id VARCHAR(36) PRIMARY KEY
    , pos_report_id VARCHAR(36)
    , path_name VARCHAR(64)
    , photo_name VARCHAR(64)
    , from_scratch INTEGER DEFAULT 0
    , lastChangedDate DATETIME)
)

然后当您想要将记录添加到表格时,您可以计算法国的时间并将此值添加到您的数据库

//Calendar cal = Calendar.getInstance();
//Log.v("hata",String.valueOf(cal.get(Calendar.HOUR)));

Calendar c = Calendar.getInstance();

// It is local time
Log.v("time",String.valueOf(c.getTime()));

TimeZone z = c.getTimeZone();       
int offset = z.getRawOffset();

if(z.inDaylightTime(new Date())){
    offset = offset + z.getDSTSavings();
}

// france is GMT2 
int offsetHrs = offset / 1000 / 60 / 60;
int offsetMins = offset / 1000 / 60 % 60;

// Offsets
Log.v("time",String.valueOf(offsetHrs));
Log.v("time",String.valueOf(offsetMins));

c.add(Calendar.HOUR_OF_DAY, (-offsetHrs));
c.add(Calendar.MINUTE, (-offsetMins));

// FRANCE time
Log.v("time",String.valueOf(c.getTime()));