मैं एक अलग समयक्षेत्र से समय का उत्पादन कैसे कर सकता हूं?


115

मेरे पास एक सर्वर है जो टाइमज़ोन सेट के साथ चल रहा है UTC। ऐसा लग रहा था कि आम तौर पर एक अच्छा अभ्यास था (कृपया मुझे सही करें अगर मैं गलत हूं)।

किसी भी तरह, सर्वरों में से एक, जो मैं scpफ़ाइलों से जोड़ता हूं , चल रहा है EDTऔर उन फ़ाइलों को संग्रहीत करता है जिन्हें मुझे प्रारूप में कॉपी करने की आवश्यकता है/path/to/filename/data20120913

मैंने पिछले दिनों संशोधित फाइलों के लिए फाइंड फ़्लैग rsyncजैसी किसी चीज़ का उपयोग करके फ़ाइलों को देखने की कोशिश की -mtime -1, लेकिन मेरा कोई भाग्य नहीं था।

मुझे scpवर्तमान दिन की फ़ाइल की प्रतिलिपि बनाने के लिए उपयोग करने में कोई आपत्ति नहीं है , लेकिन अभी जैसे ही 4 घंटे की विंडो है, जहां चलने date +%Y%m%dसे प्रत्येक सर्वर पर एक अलग दिन मिलेगा और यह मुझे थोड़ा परेशान करता है।

के माध्यम से man dateदेख रहा हूँ कि मैं समय उत्पादन के रूप में हो सकता है UTC, लेकिन मैं इसे एक और timezone के रूप में उत्पादन करने के लिए एक रास्ता नहीं दिख रहा हैEDT

मुझे लगता है कि मैं भी GNUतारीख विस्तार की तरह कुछ का उपयोग कर सकते हैं date -d 20100909 +%sतारीख से सेकंड में सेकंड पाने के लिए, एक मैनुअल 4 * 60 * 60दूसरी गणना लागू करते हैं , और एक तारीख के रूप में प्रतिपादन के बारे में देखते हैं - लेकिन तब जब दिन के उजाले समय यह एक घंटे में बंद हो जाएगा ।

क्या सेट करने के YYYYMMDDलिए EDTकिसी सर्वर पर प्रारूप में दिनांक को आउटपुट करने का एक सरल तरीका है UTC?


EDT लिनक्स में कम से कम एक मान्यता प्राप्त टाइमज़ोन नहीं है। देखिये मेरा "सावधान!" पूरी बदसूरत कहानी के लिए नीचे जवाब। यदि EDT आपके NIX के ब्रांड पर पहचाना जाता है, तो आपको अभी भी सावधानी बरतनी चाहिए और अपने टाइमज़ोन स्ट्रिंग को दोबारा जांचना चाहिए।
माइक एस

जवाबों:


175

आप क्वेरी की अवधि के लिए एक टाइमज़ोन सेट कर सकते हैं, इस प्रकार:

TZ=America/New_York date

TZसेटिंग और dateकमांड के बीच व्हाट्सएप पर ध्यान दें । बॉर्न-जैसे और समान rcशेल में, जो TZकेवल कमांड लाइन के लिए चर सेट करता है । अन्य गोले (में csh, tcsh, fish), आप हमेशा उपयोग कर सकते हैं envबजाय कमांड:

env TZ=America/New_York date

tl; डॉ

लिनक्स सिस्टम पर। टाइमज़ोन को /usr/share/zoneinfoनिर्देशिका में फ़ाइलों में परिभाषित किया गया है । इस संरचना को अक्सर अपने संस्थापक योगदानकर्ता को सम्मानित करने के लिए "ओल्सन डेटाबेस" के रूप में जाना जाता है।

प्रत्येक टाइमज़ोन के नियमों को टेक्स्ट फ़ाइल लाइनों के रूप में परिभाषित किया गया है जो तब बाइनरी फ़ाइल में संकलित की जाती हैं। रेखाएँ संकलित हैं, ज़ोन के नाम को परिभाषित करती हैं; डेटा और समय की एक श्रेणी जिसके दौरान क्षेत्र लागू होता है; मानक समय के लिए यूटीसी से एक ऑफसेट; और यह निर्धारित करने के लिए कि दिन के समय की बचत से संक्रमण कैसे और क्यों होता है, को लागू करने के लिए संकेतन।

उदाहरण के लिए, निर्देशिका "अमेरिका" में न्यूयॉर्क के लिए आवश्यक जानकारी शामिल है, America/New_Yorkजैसा कि ऊपर, उपयोग किया गया है।

खबरदार कि गैर-मौजूद क्षेत्र (फ़ाइल नाम) के विनिर्देश को चुपचाप अनदेखा कर दिया जाता है और UTC बार रिपोर्ट किया जाता है। उदाहरण के लिए, यह एक गलत समय रिपोर्ट करता है:

TZ="America/New York" date ### WRONG ###

एकल UNIX विशिष्टता, संस्करण -3, जिसे SUSv3 या POSIX-2001 के रूप में जाना जाता है, नोट करता है कि पोर्टेबिलिटी के लिए, वर्ण स्ट्रिंग जो टाइमज़ोन विवरण की पहचान करती है, एक बृहदान्त्र वर्ण से शुरू होनी चाहिए। इस प्रकार, हम यह भी लिख सकते हैं:

TZ=":America/New_York" date
TZ=":America/Los_Angeles" date

विवरण फ़ाइल के लिए पथनाम का उपयोग करके टाइमज़ोन के विनिर्देश के लिए एक वैकल्पिक विधि के रूप में, SUSv3 ने POSIX मॉडल का वर्णन किया है। इस प्रारूप में, एक स्ट्रिंग के रूप में परिभाषित किया गया है:

std offset [dst[offset][,start-date[/time],end-date[/time]]]

stdमानक घटक नाम कहां है और dstदिन के उजाले की बचत है। प्रत्येक नाम में तीन या अधिक वर्ण होते हैं। offsetमध्याह्न के उन पूर्व के लिए प्रधानमंत्री मध्याह्न के पश्चिम समय क्षेत्र के लिए सकारात्मक और नकारात्मक है। UTC (जिसे पहले GMT के रूप में जाना जाता है) प्राप्त करने के लिए ऑफसेट को स्थानीय समय में जोड़ा जाता है। startऔर endसमय क्षेत्रों से संकेत मिलता है जब मानक / दिन के उजाले संक्रमण होते हैं।

उदाहरण के लिए, पूर्वी संयुक्त राज्य अमेरिका में, मानक समय UTC से 5 घंटे पहले है, और हम इसके EST5EDTबदले में निर्दिष्ट कर सकते हैं America/New_York। इन विकल्पों को हमेशा मान्यता नहीं दी जाती है, हालांकि, विशेष रूप से संयुक्त राज्य अमेरिका के बाहर के क्षेत्रों के लिए और सबसे अच्छा बचा जाता है।

HP-UX (एक SUSv3 आज्ञाकारी UNIX) पाठ नियम का उपयोग करता है /usr/lib/tztabऔर POSIX नाम जैसे EST5EDT, CST6CDT, MST7MDT, PST8PDT। फ़ाइल में हर समय क्षेत्र के लिए सभी ऐतिहासिक नियम शामिल हैं, ओल्सन डेटाबेस के समान है।

नोट: आप निम्नलिखित निर्देशिका निरीक्षण द्वारा समय-क्षेत्रों के सभी को खोजने के लिए सक्षम होना चाहिए: /usr/share/zoneinfo


यकीन नहीं है कि अगर मैं गलत हूं, लेकिन कमान exportसे बेहतर लग रहा हैenv
15

@JRFerguson - यदि कोई टाइमज़ोन सूची में शामिल नहीं है जैसे लास वेगास या नेवादा, समय को मान्य करने में क्या विकल्प हैं?
प्रेरित

@Motivated यदि आपका शहर या राज्य शामिल नहीं है, तो वही चुनें जो आपके समान ज़ोन की जानकारी का उपयोग करता है। उदाहरण के लिए, मैं फ्लोरिडा में हूं, जो न्यूयॉर्क के समान टाइमज़ोन का उपयोग करता है, इसलिए मेरी मशीनें न्यूयॉर्क समय के लिए सिंक्रनाइज़ होती हैं।
JRFerguson

1
@JRFerguson - यह मानता है कि व्यक्ति विभिन्न टाइमज़ोन के बारे में जानता है और आपके मामले में न्यूयॉर्क जैसे एक विकल्प का उपयोग करने में सक्षम है। क्या वह एकमात्र विकल्प होगा? उदाहरण के लिए, मैं यूरोप में नहीं रहता और मुझे ओवरलैपिंग टाइमज़ोन का पता नहीं चलेगा।
प्रेरित

1
@ अधिकृत आप अपने क्षेत्र में अन्य बिंदुओं को खोजने में सहायता करने के लिए इस साइट जैसी किसी चीज़ का उपयोग कर सकते हैं ।
JRFerguson

33

आप TZपर्यावरण चर में हेरफेर करके ऐसा कर सकते हैं । निम्नलिखित आपको यूएस / पूर्वी के लिए स्थानीय समय देगा, जो कि डीएसटी को संभालने के लिए पर्याप्त स्मार्ट होगा जब वह चारों ओर घूमता है:

# all on one line
TZ=":US/Eastern" date +%Y%m%d

ज़ोन का नाम फ़ाइलों और निर्देशिकाओं के अंदर से आता है /usr/share/zoneinfo


17

सावधान रहे! दिनांक आपके CURRENT टाइमज़ोन में समय को ख़ुशी से बाहर निकाल देगा, यदि आप इसे एक टाइमज़ोन देते हैं तो यह पहचान नहीं करता है।

इसकी जांच करें:

-bash-4.2$ env TZ=EDT date
Wed Feb 18 19:34:41 EDT 2015
-bash-4.2$ date
Wed Feb 18 19:34:43 UTC 2015

ध्यान दें कि EDT नामक कोई समयक्षेत्र नहीं है। वास्तव में,

-bash-4.2$ find /usr/share/zoneinfo -name "*EDT*"

रिटर्न

/usr/share/zoneinfo/EST5EDT
/usr/share/zoneinfo/posix/EST5EDT
/usr/share/zoneinfo/right/EST5EDT

और यह काम करता है:

-bash-4.2$ TZ=EST5EDT date
Wed Feb 18 14:36:59 EST 2015
-bash-4.2$ date
Wed Feb 18 19:37:01 UTC 2015

हालाँकि, यदि आपका मित्र गोबल्डग्युक के रहस्यमयी देश में रहता है और उसके ज़ोन की जानकारी आपके साथ मेल खाती है, तो आप गोबल्डग्युक के ज़ोन में समय का उत्पादन कर सकते हैं और आपको यह बताने के लिए ख़ुशी होगी कि आपको बाहर जाने के लिए कोई मूल्य नहीं है। ज़ोन का पता नहीं है:

-bash-4.2$ TZ=Gobbledygook date
Wed Feb 18 19:37:36 Gobbledygook 2015
-bash-4.2$ echo $?
0

YMMV: मेरे MacOS / BSD बॉक्स पर, विकृत TZस्ट्रिंग UTC समय देता है।
मार्क हडसन


6

तारीख वाक्य रचना जो एक कमांड लाइन मंगलाचरण एक दर्द बना देता है रहस्यमय और त्रुटि प्रवण है। इसलिए मैंने एक छोटी सी स्क्रिप्ट लिखी (मैंने इसे वर्ल्डटाइम नाम दिया ), जो कि बेस टाइम ज़ोम (आपके स्थानीय एक) से निर्दिष्ट (या वर्तमान) समय को किसी अन्य समय क्षेत्र में और प्रिंट को प्रिंट करेगा।

यही पर है। अपनी आवश्यकताओं से मेल खाने के लिए इसे समायोजित करें, इसे अपने रास्ते में रखें, और इसे निष्पादन योग्य बनाएं।

#! / Bin / श
#
# अन्य समय क्षेत्रों में आधार समय से निर्दिष्ट (या वर्तमान) समय प्रिंट करें
# और दीक्षांत समारोह
#

# बेस टाइम ज़ोन / जिसमें से कन्वर्ट करना है
TZBASE = यूरोप / एथेंस

# समय क्षेत्र प्रदर्शित करने के लिए
# अधिक नामों के लिए / usr / शेयर / ज़ोनफो / देखें
TZONES = 'UTC अमेरिका / लॉस_अंगेल्स अमेरिका / न्यू_यॉर्क यूरोप / लंदन यूरोप / पेरिस'

# प्रारूप को प्रदर्शित करें
FORMAT = '% H:% M (% p)% Z% a% m% b% Y'

अगर ["$ 1"]; फिर
  समय = "$ 1"
अन्य
  समय = `तिथि +% टी`
फाई

# निर्दिष्ट आउटपुट में निर्दिष्ट इनपुट समय क्षेत्र से समय दिखाएं
# समय क्षेत्र
शो टाइम()
{
  TZIN = $ 1
  TZOUT = $ 2

  TZ = $ TZOUT दिनांक --date = 'TZ = "' $ TZIN '" "$ समय" + "$ समय $ TZIN $ TZOUT $ FORMAT"
}

$ TZONES में tz के लिए; करना
  शोटाइम $ TZBASE $ tz
किया हुआ

गूंज

$ TZONES में tz के लिए; करना
  शोटाइम $ tz $ TZBASE
किया हुआ


3

अक्सर आपके पास स्थानीय टाइमज़ोन में टाइमस्टैम्प होता है और आपको इसे दूरस्थ टीज़ में बदलने की आवश्यकता होती है। इसके साथ किया जा सकता है:

TZ=America/Curacao date -d 'Tue Nov 28 00:07:05 MSK 2016'

कहाँ पे:

America/Curacao - remote timezone
MSK - local timezone
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.