शायद चीजें विफल हो रही हैं क्योंकि जब आप निश्चित समयक्षेत्र में डेटाबेस से डेटाटाइम्स से पूछताछ कर रहे हैं और टाइमस्टैम्प के प्रकार को टाइमज़ोन के बिना टाइमस्टैम्प के रूप में प्रभावी ढंग से परिवर्तित कर रहे हैं। उस स्थिति में डेटाबेस knex को जानकारी नहीं भेजेगा कि वह समय किस समय क्षेत्र में लौटा था।
तो knex (या बल्कि pg ड्राइवर जो knex उपयोग कर रहा है) आपके टाइमस्टैम्प को स्थानीय समय के रूप में व्याख्यायित करता है, जो आपके एप्लिकेशन सर्वर के knex के टाइमज़ोन सेटअप पर निर्भर करता है।
आप यूटीसी के रूप में समय प्राप्त कर सकते हैं और पल या लक्सन पुस्तकालयों के साथ जावास्क्रिप्ट पक्ष में टाइमज़ोन रूपांतरण कर सकते हैं (आईएमओ बाद वाला टाइमज़ोन हैंडलिंग के लिए बेहतर है)।
अन्य समाधान पीजी ड्राइवर को बताना होगा कि टाइमज़ोन प्रकारों के साथ टाइमस्टैम्प और टाइमस्टैम्प को JavaScript
में परिवर्तित नहीं किया जाना चाहिए Date
वस्तुओं।
यह इस तरह किया जा सकता है (https://github.com/brianc/node-pg- प्रकार ):
const types = require('pg').types;
const TIMESTAMPTZ_OID = 1184;
const TIMESTAMP_OID = 1114;
types.setTypeParser(TIMESTAMPTZ_OID, val => val);
types.setTypeParser(TIMESTAMP_OID, val => val);
यह कोड जो सभी टाइमस्टैम्प को स्ट्रिंग्स के रूप में वापस करने के लिए बनाता है उदाहरण के लिए knexfile.js
की शुरुआत में जोड़ा जा सकता है . वे लौटाए गए तार ठीक उसी प्रारूप में होंगे जो उन्हें डेटाबेस सर्वर द्वारा ही लौटाए गए थे।
संपादित करें:
मूल पोस्ट में कोड में, जब टाइमस्टैम्प को समय क्षेत्र में परिवर्तित किया जाता है UTC
डेटाबेस सर्वर timestamp with time zone
में कनवर्ट करता है सामान्य होने के लिए टाइप करें timestamp without time zone
इसलिए लौटाए गए मूल्य में टाइमज़ोन जानकारी नहीं है। समय क्षेत्र की जानकारी वापस जोड़ने के लिए आप उदाहरण के लिए +02 को इस तरह से लौटाए गए समय के अंत में जोड़ सकते हैं:
select ('2010-01-01T00:00:00.000Z'::timestamptz AT TIME ZONE 'UTC')::text || '+00';
जो देता है 2010-01-01 00:00:00+00
ड्राइवर को जिसे पीजी ड्राइवर भी सही से पढ़ सकता है।
यह प्रभावी रूप से वही काम करेगा जो बस SET TIME ZONE 'UTC';
डीबी सर्वर में जब कनेक्शन बनाया जाता है और सीधे टाइमस्टैम्प्ज़ कॉलम लौटाता है:
SET TIME ZONE 'UTC';
select '2010-01-01T00:00:00.000+02:00'::timestamptz;
जो 2009-12-31 22:00:00+00
लौटाएगा ।