समाधान समय पर इन इंस्टेंट के लिए TIMESTAMPTZ फ़ील्ड का उपयोग करना है। "उपयोगकर्ता को कब बनाया गया था" जैसा कुछ कभी भी TIMESTAMP फ़ील्ड के साथ संग्रहीत नहीं किया जाना चाहिए क्योंकि डिफ़ॉल्ट रूप से इसमें TZ जानकारी नहीं होती है। JDBC ड्राइवर इन्हें काफी मनमाने ढंग से हैंडल करता है। उदाहरण के लिए, निम्नलिखित पर विचार करें:
मान लें कि आपका जेवीएम अमेरिका/लॉस_एंजेल्स ज़ोन में है जबकि आपका डेटाबेस सर्वर यूटीसी में है।
फिर निम्न तालिका बनाएं:
CREATE TABLE test (
id INTEGER,
ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
tswz TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
यदि आप PSQL से जारी करते हैं:
INSERT INTO test(id) values(1);
आपको "ts" और "tswz" के लिए समान मान मिलेंगे। दोनों वर्तमान UTC समय होंगे। हालाँकि यदि आप JDBC ड्राइवर का उपयोग करके जावा से समान सटीक क्वेरी करते हैं तो "ts" लॉस एंजिल्स में वर्तमान समय होगा और "tswz" UTC समय होगा।
मुझे नहीं पता कि ड्राइवर इस मामले में सर्वर को JVM टाइमज़ोन कैसे बताता है क्योंकि हम सर्वर पर फ़ील्ड को डिफॉल्ट कर रहे हैं। वे कहते हैं कि वे सत्र के लिए समय क्षेत्र निर्धारित नहीं करते हैं, लेकिन उन्हें अवश्य करना चाहिए। किसी भी तरह से, यदि आप TIMESTAMPTZ फ़ील्ड का उपयोग करते हैं तो आपको किसी भी JVM से वही इंस्टेंट प्राप्त होंगे, चाहे वह किसी भी समय क्षेत्र में क्यों न हो।