यूनिक्स टाइमस्टैम्प UTC समझें: टाइमज़ोन, ऑफसेट और कन्वर्ज़न

UTC टाइमज़ोन लाइनों और Unix टाइमस्टैम्प के साथ विश्व मानचित्र, जो कई स्थानीय घड़ियों से जुड़ा है

अगर आपने कभी किसी database में date store की है, API बनाई है, या कोई ऐसा scheduling bug debug किया है जो सिर्फ कुछ खास देशों में आता था - तो आप Unix timestamp और UTC के बीच के रिश्ते से ज़रूर टकराए होंगे। यह confusion असली है और production में गंभीर bugs पैदा करती है। इस article में हम विस्तार से समझेंगे कि UTC क्या है, Unix timestamp हमेशा UTC में क्यों होता है, timezone offset कैसे काम करते हैं, और JavaScript, Python और PHP में timestamps को सही तरीके से convert कैसे करें। साथ ही जानेंगे वो सबसे आम गलतियाँ जो developers करते हैं और उनसे कैसे बचें।

मुख्य बातें:

  • Unix timestamp हमेशा 1 जनवरी 1970, 00:00:00 UTC से seconds की गिनती होती है - इसमें कोई timezone नहीं जुड़ा होता।
  • UTC एक universal reference point है; local time बस UTC में offset जोड़ने या घटाने से मिलती है।
  • किसी timestamp को local time में सही तरीके से convert करने के लिए target timezone का नाम जानना ज़रूरी है, सिर्फ offset नंबर काफी नहीं।
  • DST (Daylight Saving Time) किसी timezone के offset को बदल देती है - इसीलिए offset को hardcode करने से bugs आते हैं।

UTC क्या है और यह क्यों ज़रूरी है?

UTC का पूरा नाम है Coordinated Universal Time। यह वह प्राथमिक time standard है जिसके आधार पर दुनिया भर की घड़ियाँ और समय नियंत्रित होते हैं। timezones के विपरीत, UTC का कोई offset नहीं होता - यह खुद शून्य बिंदु है। यह किसी भी देश या क्षेत्र के लिए Daylight Saving Time नहीं मानता और न ही बदलता है।

UTC से पहले GMT (Greenwich Mean Time) प्रचलित था, और आज भी बहुत से लोग दोनों को एक ही मानते हैं। तकनीकी रूप से, UTC और GMT में थोड़ा अंतर है, लेकिन software के नज़रिए से दोनों को समकक्ष माना जाता है। UTC को ITU-R TF.460 recommendation के तहत औपचारिक रूप से परिभाषित किया गया है और इसे atomic clocks से maintain किया जाता है।

Developers के लिए UTC इसलिए महत्वपूर्ण है क्योंकि यह एक स्पष्ट और निर्विवाद reference point देता है। अगर Frankfurt का आपका server और Los Angeles का आपका user दोनों किसी event को UTC में record करते हैं, तो आप उन दोनों timestamps की सही तुलना कर सकते हैं। लेकिन अगर दोनों बिना timezone metadata के अपने-अपने local time में record करें, तो समस्या खड़ी हो जाती है।

Unix Timestamp हमेशा UTC में क्यों होता है

Unix timestamp (जिसे epoch time या POSIX time भी कहते हैं) को 1 जनवरी 1970, 00:00:00 UTC से बीते हुए seconds की संख्या के रूप में परिभाषित किया गया है। यह anchor point - UTC में 1 जनवरी 1970 की आधी रात - इसकी परिभाषा में ही शामिल है। Unix time का कोई ऐसा version नहीं है जो New York या Tokyo के local time से शुरू होता हो।

इसका मतलब है कि "क्या Unix timestamp हमेशा UTC होता है?" का जवाब है - हाँ, परिभाषा के अनुसार। 1700000000 नंबर दुनिया के हर व्यक्ति के लिए एक ही क्षण को दर्शाता है। जो बदलता है वह है कि उस क्षण को उनके local timezone में कैसे प्रदर्शित किया जाए।

इस अवधारणा की नींव को और गहराई से समझने के लिए हमारा यह article पढ़ें: Epoch Time: Unix Timestamps की नींव

UTC पर आधारित यह डिज़ाइन Unix time की सबसे उपयोगी विशेषताओं में से एक है। चूँकि timestamp number में कोई timezone जानकारी नहीं होती, इसलिए अलग-अलग देशों के दो systems बिना किसी अतिरिक्त समझौते के एक timestamp exchange कर सकते हैं और दोनों जानते हैं कि वह किस क्षण को refer करता है।

UTC बनाम Local Time और Timezones

UTC एक reference है। Local time वह होती है जो आपको UTC के ऊपर timezone rule लागू करने पर मिलती है। timezone सिर्फ एक fixed offset नहीं होता - यह एक named region है जिसके rules समय के साथ बदल सकते हैं (मुख्यतः Daylight Saving Time की वजह से)।

उदाहरण के लिए, अमेरिका में "Eastern Time" सर्दियों में UTC-5 और गर्मियों में UTC-4 होती है। IANA timezone database में इस timezone का नाम "America/New_York" है, जो अधिकांश programming languages और operating systems द्वारा उपयोग किए जाने वाले timezone rules का आधिकारिक स्रोत है।

व्यावहारिक निष्कर्ष: जब आप database में Unix timestamp store करते हैं, तो आप एक UTC value store कर रहे हैं। जब आप इसे user को दिखाते हैं, तो इसे उनके local timezone में convert करें। कभी भी local time को raw number के रूप में store करके यह न मानें कि वह UTC है - यहीं से bugs शुरू होते हैं।

UTC Offset कैसे काम करते हैं

UTC offset यह बताता है कि कोई timezone UTC से कितना आगे या पीछे है। इसे +HH:MM या -HH:MM के रूप में लिखा जाता है। कुछ उदाहरण:

  • UTC+02:00 - Central European Summer Time (CEST), गर्मियों में Germany और France में उपयोग होता है।
  • UTC-05:00 - Eastern Standard Time (EST), सर्दियों में US East Coast पर उपयोग होता है।
  • UTC+05:30 - India Standard Time (IST), जो आधे घंटे का offset है।
  • UTC+00:00 - UTC खुद, जिसे UK सर्दियों में भी उपयोग करता है (GMT)।

किसी UTC epoch time को manually local time में convert करने के लिए, आप offset को seconds में जोड़ते या घटाते हैं। UTC+02:00 के लिए यह 2 * 3600 = 7200 seconds होगा। तो अगर आपका Unix timestamp 1700000000 है, तो UTC+02:00 में local time को format करने से पहले 1700000000 + 7200 की गणना करनी होगी।

हालाँकि, यह manually करना जोखिम भरा है क्योंकि DST के साथ offset बदलते हैं। हमेशा एक proper timezone library का उपयोग करें, offset को hardcode न करें। conversion methods की विस्तृत जानकारी के लिए हमारी guide देखें: Unix Timestamp को Date में Convert कैसे करें

Unix Timestamp को Local Time में Convert करना

यहाँ Unix timestamp 1700000000 का एक ठोस उदाहरण है, जो 14 नवंबर 2023, 22:13:20 UTC को दर्शाता है। हम इसे तीन languages में "America/New_York" (नवंबर में UTC-5) में convert करेंगे।

JavaScript

const ts = 1700000000;

// JavaScript Date milliseconds लेता है
const date = new Date(ts * 1000);

// New York local time में दिखाएँ
const options = {
  timeZone: 'America/New_York',
  year: 'numeric',
  month: 'long',
  day: 'numeric',
  hour: '2-digit',
  minute: '2-digit',
  second: '2-digit',
  timeZoneName: 'short'
};

console.log(date.toLocaleString('en-US', options));
// Output: November 14, 2023 at 05:13:20 PM EST

ध्यान दें कि JavaScript का Date object internally UTC milliseconds में समय store करता है। toLocaleString method को timeZone option के साथ उपयोग करने पर यह आपके लिए offset और DST rules को स्वचालित रूप से संभाल लेता है।

Python

from datetime import datetime, timezone
import zoneinfo  # Python 3.9+

ts = 1700000000

# timestamp से UTC-aware datetime बनाएँ
utc_dt = datetime.fromtimestamp(ts, tz=timezone.utc)

# New York local time में convert करें
ny_tz = zoneinfo.ZoneInfo('America/New_York')
local_dt = utc_dt.astimezone(ny_tz)

print(local_dt.strftime('%Y-%m-%d %H:%M:%S %Z'))
# Output: 2023-11-14 17:13:20 EST

यहाँ मुख्य बात है datetime.fromtimestamp(ts, tz=timezone.utc) का उपयोग। अगर आप tz argument छोड़ देते हैं, तो Python timestamp को interpret करने के लिए आपके server की local timezone उपयोग करता है - जो bugs का एक सामान्य कारण है।

PHP

$ts = 1700000000;

// Unix timestamp से DateTime object बनाएँ (हमेशा UTC)
$dt = new DateTime('@' . $ts);

// Target timezone सेट करें
$dt->setTimezone(new DateTimeZone('America/New_York'));

echo $dt->format('Y-m-d H:i:s T');
// Output: 2023-11-14 17:13:20 EST

PHP में, DateTime object बनाते समय @ prefix PHP को बताता है कि इस value को Unix timestamp (UTC) के रूप में treat करें। इसके बिना PHP server की default timezone setting का उपयोग करके string को interpret कर सकता है।

Developers की सामान्य गलतियाँ

अनुभवी developers भी timezone handling में फँस जाते हैं। यहाँ सबसे अधिक होने वाली समस्याएँ हैं:

1. Server की local time को UTC मान लेना

अगर आपका server "Europe/Berlin" पर सेट है और आप PHP में time() या Python में बिना timezone argument के datetime.now() call करते हैं, तो आपको UTC नहीं बल्कि local time मिलती है। timestamps record करते समय हमेशा UTC के बारे में स्पष्ट रहें।

2. Timezone नाम की जगह UTC offset को hardcode करना

Germany के लिए +02:00 को fixed offset के रूप में उपयोग करना सर्दियों में टूट जाएगा जब Germany +01:00 पर switch करता है। हमेशा Europe/Berlin जैसे named timezones उपयोग करें ताकि library स्वचालित रूप से सही DST rules लागू कर सके।

3. Timestamps को timezone metadata के बिना local time string के रूप में store करना

Database में 2023-11-14 17:13:20 जैसी string अस्पष्ट है। क्या यह UTC है? EST? IST? अगर आप timestamps को Unix integers के रूप में या UTC offset के साथ ISO 8601 strings के रूप में (जैसे 2023-11-14T22:13:20Z) store करते हैं, तो अर्थ स्पष्ट होता है। कौन सा format चुनें, इसके लिए हमारी तुलना देखें: Unix Timestamp Format बनाम ISO 8601

4. Scheduling में DST को नज़रअंदाज़ करना

अगर आप "हर दिन 09:00 बजे" job चलाने के लिए पिछले run time में 86400 seconds जोड़ते हैं, तो DST बदलने वाले दिन यह एक घंटे drift कर जाएगी। ऐसी cron library या scheduler उपयोग करें जो timezone rules समझती हो।

5. Milliseconds और Seconds में भ्रम

JavaScript अपने Date object के लिए milliseconds उपयोग करता है, लेकिन अधिकांश Unix timestamps seconds में होते हैं। seconds-based timestamp को 1000 से गुणा किए बिना new Date() में pass करने पर आपको जनवरी 1970 की date मिलती है। इसके बारे में विस्तार से हमारे article में पढ़ें: Seconds बनाम Milliseconds बनाम Microseconds

निष्कर्ष

Unix timestamp और UTC डिज़ाइन के अनुसार अविभाज्य हैं। timestamp हमेशा एक UTC value होती है - एक fixed UTC anchor से seconds की गिनती। local time सिर्फ एक display format है, कोई अलग किस्म का timestamp नहीं। सबसे सुरक्षित तरीका यह है कि सब कुछ UTC में store करें, local time में सिर्फ display के समय convert करें, और हमेशा hardcoded offset की जगह named timezones उपयोग करें। इन नियमों का पालन करें और timezone से जुड़े अधिकांश bugs अपने आप खत्म हो जाते हैं। इन values को store करने की best practices के लिए हमारी guide देखें: Databases में Unix Timestamps

unixtimestamp.app से Unix timestamp को UTC या local time में convert करें

किसी भी Unix Timestamp को UTC या Local Time में तुरंत Convert करें

कोई भी Unix timestamp paste करें और एक click में उसे UTC और अपनी local timezone में converted देखें। बिल्कुल मुफ्त, कोई signup नहीं, और seconds तथा milliseconds दोनों के साथ काम करता है।

हमारा मुफ्त tool आज़माएँ ->

हाँ। परिभाषा के अनुसार, Unix epoch timestamp 1 जनवरी 1970, 00:00:00 UTC से seconds गिनता है। यह number खुद कोई timezone नहीं रखता - यह एक UTC value है। timezone तभी relevant होता है जब आप timestamp को display के लिए human-readable date और time में convert करते हैं।

अपनी programming language की built-in timezone library उपयोग करें। JavaScript में timeZone option के साथ toLocaleString उपयोग करें। Python में named timezone के साथ datetime.fromtimestamp(ts, tz=timezone.utc).astimezone() उपयोग करें। PHP में timestamp से DateTime बनाएँ और setTimezone() call करें। हमेशा named timezones उपयोग करें, raw offset नहीं।

यह आमतौर पर इसलिए होता है क्योंकि कोई function timestamp को interpret करते समय UTC की जगह server की default timezone उपयोग कर रहा है। Python में datetime.fromtimestamp() में tz argument न देने पर local system time उपयोग होती है। PHP में @ prefix न होने पर भी यही होता है। timestamp बनाते समय हमेशा UTC के बारे में स्पष्ट रहें।

UTC offset वह घंटों (और कभी-कभी मिनटों) की संख्या है जितना कोई timezone UTC से आगे या पीछे है। उदाहरण के लिए, UTC-05:00 का मतलब है UTC से पाँच घंटे पीछे। Unix timestamp को local time में convert करते समय, offset को UTC value पर लागू किया जाता है। चूँकि DST के साथ offset बदलते हैं, इसलिए hardcoded offset की जगह named timezone उपयोग करना चाहिए।

हाँ, और यही Unix timestamps का सबसे बड़ा फायदा है। चूँकि हर timestamp एक UTC value है, इसलिए आप किसी भी दो timestamps की सीधे integers के रूप में तुलना कर सकते हैं। अधिक संख्या हमेशा बाद के समय को दर्शाती है, चाहे timestamps कहीं से भी generate हुए हों। तुलना के लिए किसी timezone conversion की ज़रूरत नहीं।