TZ = UTC-8 का उत्पादन क्यों होता है जो UTC + 8 हैं?


25

लॉस एंजिल्स में वर्तमान समय 18:05 है। लेकिन जब मैं दौड़ता TZ=UTC-8 date --iso=nsहूं, मुझे मिलता है:

2013-12-07T10:05:37,788173835+0800

दिनांक उपयोगिता मुझे बताती है कि समय 10:05 है, और यहां तक ​​कि यह भी कहता है कि यह इसे UTC + 8 के रूप में रिपोर्ट कर रहा है। क्यूं कर?

जवाबों:


33

कारण यह है कि POSIX समय क्षेत्र केTZ=UTC-8 रूप में व्याख्या की गई है । POSIX टाइमज़ोन प्रारूप में, 3 अक्षर टाइमज़ोन संक्षिप्त नाम (जो कि मनमाना है) और संख्या यूटीसी के पीछे टाइमज़ोन के घंटे की संख्या है । तो इसका मतलब है कि एक टाइमज़ोन संक्षिप्त रूप से "UTC" जो कि वास्तविक UTC से 8 घंटे पीछे है, या UTC + 8 घंटे।UTC-8

(यह उस तरह से काम करता है क्योंकि यूनिक्स को अमेरिका में विकसित किया गया था, जो यूटीसी के पीछे है। यह प्रारूप यूएस टाइमज़ोन को एस्टी 5, सीएसटी 6, आदि के रूप में प्रतिनिधित्व करने की अनुमति देता है)

आप देख सकते हैं कि इन उदाहरणों से क्या हो रहा है:

$ TZ=UTC-8 date +'%Z %z'
UTC +0800
$ TZ=UTC8 date +'%Z %z'
UTC -0800
$ TZ=FOO-8 date +'%Z %z'
FOO +0800

आईएसओ -0800टाइमज़ोन प्रारूप विपरीत दृष्टिकोण लेता है, जिसमें -यह संकेत मिलता है कि ज़ोन यूटीसी के पीछे है, और +ज़ोन यूटीसी के आगे है।


आह तो मैं वास्तव में क्या चाहता था TZ=PST+8 date। धन्यवाद। मुझे इस स्पष्टीकरण के तहत यह भी पता चला man timezone: "एसटीडी स्ट्रिंग टाइमज़ोन के नाम को निर्दिष्ट करता है और तीन या अधिक वर्णमाला वर्ण होना चाहिए। ऑफ़सेट स्ट्रिंग तुरंत एसटीडी का अनुसरण करता है और कोऑर्डिनरी टाइम को प्राप्त करने के लिए स्थानीय समय में जोड़े जाने वाले समय मान को निर्दिष्ट करता है। यूटीसी)। ऑफसेट सकारात्मक है अगर स्थानीय टाइमज़ोन प्राइम मेरिडियन के पश्चिम में है और नकारात्मक है अगर यह पूर्व में है। घंटे 0 और 24 के बीच होना चाहिए, और मिनट और सेकंड 0 और 59। "
एलेक्स हेनरी

3
@ एलेक्स नं, जो आप वास्तव में चाहते हैं TZ=America/Los_Angeles। आप भूल रहे हैं कि दिन के समय की बचत के समय प्रशांत समय -7 है।
मैट जॉनसन-पिंट

3
@MattJohnson, आपका मतलब है TZ=:America/Los_Angeles। बृहदान्त्र इंगित करता है कि यह एक ओल्सन टाइमज़ोन फ़ाइल है। और एक अन्य टिप्पणी में, उन्होंने उल्लेख किया कि वह दिन के समय की बचत को अनदेखा करना चाहते थे, जो ऐसा नहीं करेगा।
cjm

@ cjm, धन्यवाद, आप कोलन के बारे में सही हैं, और मैंने वह टिप्पणी नहीं देखी थी।
मैट जॉनसन-पिंट

अमेरिका, दुनिया का कारण बनता है अगर इसका मतलब है कि हमें होना चाहिए EST-5 CST-6
इवान कैरोल

7

जब भी आप +/- 00:00 के प्रारूप में एक टाइमज़ोन निर्दिष्ट करते हैं, तो आप एक ऑफसेट निर्दिष्ट कर रहे हैं , वास्तविक टाइमज़ोन नहीं। से GNU libc प्रलेखन (जो POSIX मानक इस प्रकार है):

ऑफसेट एक कॉर्डिनेटेड यूनिवर्सल टाइम वैल्यू पाने के लिए स्थानीय समय में आपके द्वारा जोड़े जाने वाले समय मूल्य को निर्दिष्ट करता है। इसका सिंटैक्स है [+ | -] hh [: mm [: ss]]। यह सकारात्मक है यदि स्थानीय समय क्षेत्र प्रधान मेरिडियन के पश्चिम में है और यदि यह पूर्व में नकारात्मक है। घंटे 0 और 23 के बीच होना चाहिए, और मिनट और सेकंड 0 और 59 के बीच होना चाहिए।

यही कारण है कि यह आपकी अपेक्षा के विपरीत प्रतीत होता है।


2

Why?

क्योंकि POSIX को इसकी आवश्यकता होती है

यदि '-' से पहले, टाइमजोन प्राइम मेरिडियन के पूर्व में होगा; अन्यथा, यह पश्चिम होगा (जो एक वैकल्पिक पूर्ववर्ती '+' द्वारा इंगित किया जा सकता है)।

तो, यह समय देगा [1] Los Angeles (समय क्षेत्र पाठ के लिए किसी भी 3 पत्र लेबल के साथ):

$ TZ=ANY8 date "+%Y-%m-%d %H:%M:%S %Z%z"
2016-04-23 10:47:12 ANY-0800

$ TZ=GMT+8 date "+%Y-%m-%d %H:%M:%S %Z%z"
2016-04-23 10:47:12 GMT-0800

और यह समय पास Shanghai, Chinaया Perth, Australia:

$ TZ=ANY-8 date "+%Y-%m-%d %H:%M:%S %Z%z"
2016-04-24 02:47:12 ANY+0800

$ TZ=CST-8 date "+%Y-%m-%d %H:%M:%S %Z%z"
2016-04-23 02:47:12 CST+0800

[१] निकट में क्योंकि वास्तविक "स्थानीय समय" को स्थानांतरित करने वाले कुछ डीएसटी (डेलाइट सेविंग टाइम) हो सकते हैं।


1

एक वैकल्पिक विधि के रूप में आप zdumpअन्य टाइमज़ोन + ऑफ़सेट में वर्तमान समय दिखाने के लिए कमांड का उपयोग कर सकते हैं ।

Zdump कमांड लाइन पर नामित प्रत्येक ज़ोननेम में वर्तमान समय को प्रिंट करता है।

टाइमज़ोन के साथ वही नियम लागू होते हैं; प्रधान मध्याह्न रेखा के पश्चिम में "पीछे" जबकि पूर्व में "आगे" रहा।

उदाहरण

$ zdump PST PST सत 7 दिसंबर 03:25:27 2013 PST

मैंने इस स्क्रिप्ट को कई टाइमज़ोन + ऑफ़सेट्स दिखाने के लिए बनाया है जिन्हें हम उपयोग करने में रुचि रखते हैं zdumpऔर dateइसलिए हम उनकी तुलना कर सकते हैं।

$ cat cmd.bash
#!/bin/bash

printf "\ndate: %s\n\n" "$(date)"

for tz in EST PST PST+8 PST-8 UTC UTC+8 UTC-8; do
  echo "-- timezone $tz"
  printf "zdump: %s\n" "$(zdump $tz)"
  printf "date:         %s\n" "$(TZ=$tz date +'%a %b %d %T %Y - (%Z %z)')"
  echo ""
done

तो फिर तुम की तुलना देख सकते हैं जब आप इसे चलाते zdumpलिए date:

$ ./cmd.bash 

date: Sat Dec  7 02:59:05 EST 2013

-- timezone EST
zdump: EST  Sat Dec  7 02:59:05 2013 EST
date:         Sat Dec 07 02:59:05 2013 - (EST -0500)

-- timezone PST
zdump: PST  Sat Dec  7 07:59:05 2013 PST
date:         Sat Dec 07 07:59:05 2013 - (PST +0000)

-- timezone PST+8
zdump: PST+8  Fri Dec  6 23:59:05 2013 PST
date:         Fri Dec 06 23:59:05 2013 - (PST -0800)

-- timezone PST-8
zdump: PST-8  Sat Dec  7 15:59:05 2013 PST
date:         Sat Dec 07 15:59:05 2013 - (PST +0800)

-- timezone UTC
zdump: UTC  Sat Dec  7 07:59:05 2013 UTC
date:         Sat Dec 07 07:59:05 2013 - (UTC +0000)

-- timezone UTC+8
zdump: UTC+8  Fri Dec  6 23:59:05 2013 UTC
date:         Fri Dec 06 23:59:05 2013 - (UTC -0800)

-- timezone UTC-8
zdump: UTC-8  Sat Dec  7 15:59:05 2013 UTC
date:         Sat Dec 07 15:59:05 2013 - (UTC +0800)

मैं वास्तव में डेलाइट सेविंग को अनदेखा करते हुए, प्रशांत मानक समय में वर्तमान समय प्राप्त करने की कोशिश कर रहा हूं।
एलेक्स हेनरी

1
मुझे इस एक को कम करना पड़ा क्योंकि आप अनुमान लगा रहे हैं कि "UTC-8" गलत है। यह सही है, यह वह नहीं करता है जो उपयोगकर्ता अपेक्षा करता है। मुझे नहीं लगता कि यह इस सवाल का जवाब देता है कि यह उस तरह से क्यों काम करता है।
जोर्डनम

@ जोर्डनम - क्लीन अप देखें।
slm

1
यह अभी भी बताता है कि क्या हो रहा है लेकिन ऐसा नहीं है और "क्यों" ओपी पूछ रहा है। मैं अपने पतन को दूर कर दूंगा लेकिन मुझे अभी भी ऐसा नहीं लग रहा है कि यह सवाल का अच्छा जवाब है।
jordanm
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.