c++ - समय - सभी देशों का टाइम




वर्तमान समय क्षेत्र कैसे प्राप्त करें? (4)

आप हमेशा सार्वभौमिक समय और स्थानीय समय को बढ़ावा देने और अंतर की जांच करने का प्रयास कर सकते हैं, हालांकि यह शायद चेतावनी से भरा है।

मैंने देखा कि अधिकांश उदाहरणों में:

time_zone_ptr zone( new posix_time_zone("MST-07") ); 

लेकिन मैं सिर्फ उस मशीन के लिए वर्तमान समय क्षेत्र प्राप्त करना चाहता हूं जो कोड चलाता है। मैं समय क्षेत्र नाम हार्ड कोड नहीं करना चाहता।


इस प्रश्न का सही उत्तर देने के लिए, यह समझना महत्वपूर्ण है कि बूस्ट में समय क्षेत्र समर्थन गंभीर रूप से सीमित है।

  • यह मुख्य रूप से पॉज़िक्स समय क्षेत्र पर केंद्रित है, जिसमें कई सीमाएं हैं। टाइमशोन टैग विकी के पॉज़िक्स अनुभाग में इन सीमाओं पर चर्चा की जाती है, इसलिए मैं उन्हें दोहराना नहीं चाहूंगा।

  • इसमें ऐसे कार्य हैं जो आईएएनए / ओल्सन समय क्षेत्र के आईडी के साथ काम करते हैं, लेकिन यह कृत्रिम रूप से इन्हें पॉज़िक्स मूल्यों पर मानचित्रित करता है - जिसका इतिहास समय में एक बिंदु पर समय क्षेत्र को फ़्लैटन करने का प्रभाव होता है। इन मैपिंग बूस्ट स्रोत कोड में एक सीएसवी फ़ाइल में संग्रहीत हैं।

  • सीएसवी फ़ाइल अप्रैल 2011 से अपडेट नहीं की गई है, और तब से समय क्षेत्र में कई बदलाव हुए हैं। तो, मैपिंग्स यह कुछ हद तक गलत है।

आम तौर पर, मैं समय क्षेत्रों के साथ काम करने के लिए बूस्ट की सिफारिश नहीं करता। इसके बजाय, ICU पर विचार करें, जो ICU परियोजना का हिस्सा हैं। आप इन्हें पूरी तरह से पोर्टेबल पाएंगे, और उनके पास पूर्ण और सही समय क्षेत्र समर्थन है।

यह उल्लेखनीय है कि कई लोकप्रिय अनुप्रयोगों में आईसीयू का उपयोग किया जाता है। उदाहरण के लिए, Google क्रोम वेब ब्राउज़र को आईसीयू से समय क्षेत्र समर्थन मिलता है।

आईसीयू में, वर्तमान स्थानीय सिस्टम समय क्षेत्र डिफ़ॉल्ट समय क्षेत्र के रूप में उपलब्ध है। आप आईसीयू दस्तावेज में "फैक्टरी विधि और डिफ़ॉल्ट टाइमज़ोन" अनुभाग में और अधिक पढ़ सकते हैं।


दिन में काफी देर हो चुकी थी, लेकिन मैं कुछ इसी तरह की तलाश कर रहा था ताकि उम्मीद है कि यह दूसरों की मदद कर सके। स्ट्रैटटाइम का उपयोग करते हुए निम्नलिखित (गैर-बूस्ट) तरीका अधिकांश प्लेटफार्मों पर काम करता है:

  time_t ts = 0;
  struct tm t;
  char buf[16];
  ::localtime_r(&ts, &t);
  ::strftime(buf, sizeof(buf), "%z", &t);
  std::cout << "Current timezone: " << buf << std::endl;
  ::strftime(buf, sizeof(buf), "%Z", &t);
  std::cout << "Current timezone: " << buf << std::endl;

या कोई शुद्ध C ++ संस्करण के लिए std :: time_put का उपयोग कर सकता है।


सादा पॉज़िक्स : कॉल tzset, tzname का उपयोग करें

#include <ctime>
tzset();
time_zone_ptr zone(new posix_time_zone(tzname[localtime(0)->tm_isdst]));

Glibc glibc/bsd जोड़ों के साथ Posix:

time_zone_ptr zone(new posix_time_zone(localtime(0)->tm_zone));

उपर्युक्त संक्षिप्त पॉज़िक्स टाइमज़ोन हैं , जो यूटीसी से ऑफसेट के मामले में परिभाषित हैं और समय के साथ स्थिर नहीं हैं (एक लंबा रूप है जिसमें डीएसटी संक्रमण शामिल हो सकते हैं, लेकिन राजनीतिक और ऐतिहासिक संक्रमण नहीं)।

ICU पोर्टेबल है और सिस्टम sumwale ओल्सन sumwale ( sumwale द्वारा स्निपेट) के रूप में पुनर्प्राप्त करने के लिए तर्क है:

// Link with LDLIBS=`pkg-config icu-i18n --libs`
#include <unicode/timezone.h>
#include <iostream>

using namespace U_ICU_NAMESPACE;

int main() {
  TimeZone* tz = TimeZone::createDefault();
  UnicodeString us;
  std::string s;

  tz->getID(us);
  us.toUTF8String(s);
  std::cout << "Current timezone ID: " << s << '\n';
  delete tz;
}

लिनक्स पर, आईसीयू को tzset के साथ संगत होने के लिए लागू किया गया है और TZ और /etc/localtime , जो कि हाल ही में लिनक्स सिस्टम पर एक सिल्लिंक होता है जिसमें ओल्सन पहचानकर्ता ( यहां इतिहास है ) शामिल है। कार्यान्वयन विवरण के लिए uprv_tzname देखें।

बूस्ट को पता नहीं है कि ओल्सन पहचानकर्ता का उपयोग कैसे करें। आप गैर-डीएसटी और डीएसटी ऑफसेट का उपयोग करके posix_time_zone बना सकते हैं, लेकिन इस बिंदु पर, आईसीयू कार्यान्वयन का उपयोग करना जारी रखना सबसे अच्छा है। इस बूस्ट एफएक्यू देखें।





boost-date-time