Nodeとmysqlのタイムゾーンの理解

1859 ワード

mysqlのtimestamp
select current_timestamp();

これはシステム時間とタイムゾーンに基づいて、データの時間とタイムゾーンと計算する.例えばシステム時間は2017-10-09 14:00:00,+8区である.データベースのタイムゾーンを変更すると、上記の方法で得られる結果は以下の通りである.
SET TIME_ZONE ='+00:00'; --    ... 06:00:00
SET TIME_ZONE ='+04:00'; --    ... 10:00:00

個人的にはタイムゾーンが設置されている現地時間がわかります.
timestampタイプとdatetimeタイプ
テスト用のテーブルを作成し、2つのタイプのフィールドを1つずつ作成します.
CREATE TABLE test
(
    id INT PRIMARY KEY AUTO_INCREMENT,
    tdatetime DATETIME,
    ttimestamp TIMESTAMP
);

timezoneはまだ+8
insert into test (tdatetime, ttimestamp) VALUES ('2017-10-10 00:00:00', '2017-10-10 00:00:00');

この場合、タイムゾーンを変更しないで、直接selectして、得られた2つの値はすべて挿入とそっくりです.タイムゾーンを+4に変更すると、得られた結果はそれぞれ2017-10-10 00:00:002017-10-09 20:00:00であり、datetimeとタイムゾーンは関係ないようで、何を挿入するかが何であるかを説明する.timestampはタイムゾーンに基づいて計算し、現地時間に戻る.timestampが格納されているときはutc秒数に変換されているそうです.current_timestamp()を用いる場合も同様である、時間帯から現地時間を算出してから挿入する.
nodeで操作するとき
connection.query('select * from test where id=1', function (error, results) {
    console.log(results[0]);
});

//     ,             
//        +8   2017-10-10 00:00:00
{
  tdatetime: 2017-10-09T16:00:00.000Z,
  ttimestamp: 2017-10-09T16:00:00.000Z,
  id: 1 
}

nodeのmysql接続も+8区で、ttimestampはよく理解して、+8区の2017-10-10 00:00:00がutcに対応するのは2017-10-09 16:00:00で、実際には何区に設置してもttimestampは変わらない.
tdatetimeは、T 16:00にもなるが、データベース接続が+8であるため、プログラムは+8の時間を取り出し、-8をutc時間に変換する.では、接続タイムゾーンを+4に設定します.結果は
{
  tdatetime: 2017-10-09T20:00:00.000Z,
  ttimestamp: 2017-10-09T16:00:00.000Z,
  id: 1 
}

説明は確かに私たちが考えているように、つまりdatetimeタイプであれば、挿入取り出し時にタイムゾーンを一致させなければならない.そうしないと時間が合わない.moment変換の場合、システムタイムゾーンに基づいて現地時間に変換する.