2010-11-09 6 views
5

क्या तारीख प्राप्त करने का कोई तरीका है ... अधिमानतः YYYYMMDD प्रारूप में ... ऑस्ट्रेलिया/सिडनी टाइमज़ोन में (केवल जीएमटी +11 नहीं) ..... सी ++ के माध्यम से लिनक्स?किसी अन्य टाइमज़ोन में दिनांक: लिनक्स पर सी ++

धन्यवाद,

रोजर

उत्तर

4

हाँ, पर तुम सिर्फ मानक सी पुस्तकालय तंत्र का उपयोग करें।

एक स्ट्रिंग बनाने के द्वारा वातावरण में वांछित समय क्षेत्र सेट:

std::string tz = "TZ=Australia/Sydney"; 
putenv(const_cast<char *>(tz.c_str())); 
tzset(); // Initialize timezone data 
time_t aTime = time(NULL); // get the time - this is GMT based. 
struct tm retTime; 
localtime_r(aTime, &retTime); // Convert time into current timezone. 
char destString[1024]; 
strftime(destString, 1023, "%Y%m%d %Z", &retTime); // Format the output in the local time. 
std::cout << destString << std::endl; 

समस्या यह है कि इस कोड को सुरक्षित थ्रेड नहीं है - एक से अधिक थ्रेड समयक्षेत्र जानकारी अच्छी तरह से अंत नहीं है बदल रहा है।

This Answer आपको बढ़ावा देने का उपयोग करने का एक तरीका देता है, जो निश्चित रूप से बहुत आसान है।

1

का उपयोग Boost.DateTime (चेतावनी: परीक्षण किया है, उदाहरण के प्रयोजनों के लिए ही)

// Load the timezone database 
tz_database db; 
// TODO: Adjust this path to your environment 
db.load_from_file("./boost/libs/date_time/data/date_time_zonespec.csv"); 

// Get the Sydney timezone 
time_zone_ptr sydney_zone = db.time_zone_from_region("Australia/Sydney"); 

// Current date/time in Sydney 
local_date_time sydney_time = local_sec_clock::local_time(sydney_zone); 

// Format sydney_time in desired format 
std::ostringstream formatter; 
formatter.imbue(std::locale(), new local_time_facet("%Y%m%d")); 
formatter << sydney_time; 

देखें:

1

न्यू जवाब:

इस cross platform, open source C++11/C++14 timezone library एक लिख सकते हैं का उपयोग करना:

#include "tz.h" 
#include <iostream> 

int 
main() 
{ 
    using namespace std::chrono; 
    using namespace std; 
    using namespace date; 
    auto ymd = make_zoned("Australia/Sydney", system_clock::now()); 
    cout << format("%Y%m%d", ymd) << '\n'; 
} 

कौन सा सिर्फ मेरे लिए उत्पादन:

20150824 

यह धागा सुरक्षित है। यह IANA timezone database की प्रतिलिपि के रूप में अद्यतित है जिसे आपने अभी डाउनलोड किया है। और यदि आपकी तिथि "अब" नहीं होती है, तो यह आईएएनए डेटाबेस से ऐतिहासिक डेटा का सही ढंग से उपयोग करेगी।

संबंधित मुद्दे