每当我从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
。
知道如何解决这个问题吗?
答案 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()));