Sqlite:CURRENT_TIMESTAMP是格林尼治标准时间,而不是机器的时区

我有一个SQLite(V3)表与列定义:

"timestamp" DATETIME DEFAULT CURRENT_TIMESTAMP 

该数据库所在的服务器在CST时区。 当我插入到我的表中而不包括时间戳列时,sqlite会自动使用GMT中的当前时间戳填充该字段,而不是CST。

有没有办法来修改我的插入语句强制存储的时间戳在CST? 另一方面,它可能是更好的存储在格林尼治标准时间(例如,如果数据库被移动到不同的时区,例如),所以有办法我可以修改我的selectSQL将存储的时间戳转换为CST从表中提取它?

我在sqlite文档( https://www.sqlite.org/lang_datefunc.html )上find这个文本:

计算给定unix时间戳1092941466的date和时间,并补偿您当地的时区。

 SELECT datetime(1092941466, 'unixepoch', 'localtime'); 

这看起来不适合我的需要,所以我试着改变“date时间”的function,结束了这一点:

 select datetime(timestamp, 'localtime') 

这似乎工作 – 是正确的方式来转换您的时区,或者有更好的方式来做到这一点?

只需使用本地时间作为默认值:

 CREATE TABLE whatever( .... timestamp DATE DEFAULT (datetime('now','localtime')), ... ); 

通常情况下,您应该在GMT数据库中保留时间戳,并且只能在input/输出时将其转换为本地时间,或者将其转换为本地时间,然后才能将其转换为用户(非服务器)的本地时间戳。

这将是很好,如果你可以做到以下几点:

 SELECT DATETIME(col, 'PDT') 

…在太平洋白天时间输出用户的时间戳。 不幸的是,这是行不通的。 根据这个SQLite教程 ,然后(向下滚动到“其他date和时间命令”),您可以要求时间,然后同时应用一个偏移量(以小时为单位)。 所以,如果你知道用户的时区偏移量,那你就很好。

不处理夏令时规则,但…

在(很less见)的情况下,本地数据时间是通缉的(例如,本地时间存储在我的一个数据库中,因为我所关心的是当天的什么时间,而且我不跟踪我在哪里就时区而言…),您可以将列定义为

 "timestamp" TEXT DEFAULT (strftime('%Y-%m-%dT%H:%M','now', 'localtime')) 

%Y-%m-%dT%H:%M部分当然是可选的; 这只是我喜欢我的时间来存储。 [另外,如果我的印象是正确的,在sqlite中没有“DATETIME”数据types,所以在列声明中是否使用TEXT或DATETIME作为数据types并不重要。

当用“ NOT NULL DEFAULT CURRENT_TIMESTAMP ”定义的列时,插入的logging将始终使用UTC / GMT时间进行设置。

下面是我所做的,以避免在INSERT / UPDATE语句中包含时间:

 --Create a table having a CURRENT_TIMESTAMP: CREATE TABLE FOOBAR ( RECORD_NO INTEGER NOT NULL, TO_STORE INTEGER, UPC CHAR(30), QTY DECIMAL(15,4), EID CHAR(16), RECORD_TIME NOT NULL DEFAULT CURRENT_TIMESTAMP) --Create before update and after insert triggers: CREATE TRIGGER UPDATE_FOOBAR BEFORE UPDATE ON FOOBAR BEGIN UPDATE FOOBAR SET record_time = datetime('now', 'localtime') WHERE rowid = new.rowid; END CREATE TRIGGER INSERT_FOOBAR AFTER INSERT ON FOOBAR BEGIN UPDATE FOOBAR SET record_time = datetime('now', 'localtime') WHERE rowid = new.rowid; END 

testing看它是否工作…

 --INSERT a couple records into the table: INSERT INTO foobar (RECORD_NO, TO_STORE, UPC, PRICE, EID) VALUES (0, 1, 'xyz1', 31, '777') INSERT INTO foobar (RECORD_NO, TO_STORE, UPC, PRICE, EID) VALUES (1, 1, 'xyz2', 32, '777') --UPDATE one of the records: UPDATE foobar SET price = 29 WHERE upc = 'xyz2' --Check the results: SELECT * FROM foobar 

希望有所帮助。

 SELECT datetime('now', 'localtime'); 

SELECT datetime(CURRENT_TIMESTAMP, 'localtime')

我认为这可能有帮助。

 SELECT datetime(strftime('%s','now'), 'unixepoch', 'localtime'); 

当前时间,在您机器的时区中:

 select time(time(), 'localtime'); 

按照http://www.sqlite.org/lang_datefunc.html

Time ( 'now', 'localtime' )和date( 'now', 'localtime' )作品。

您也可以通过使用strftime()将时间列转换为时间戳:

 SELECT strftime('%s', timestamp) as timestamp FROM ... ; 

给你:

1454521888

'timestamp'表格列可以是一个文本字段,使用current_timestamp作为DEFAULT。

没有strftime:

 SELECT timestamp FROM ... ; 

给你:

2016-02-03 17:51:28