2011-11-07 15 views
12

मैं एक एचएच :: एमएम :: एसएस फैशन में सी ++ में समय बचाने के लिए एक रास्ता तलाश रहा हूं। मैंने यहां देखा कि वे कई समाधान हैं और थोड़ी सी शोध के बाद मैंने time और localtime का चयन किया। हालांकि, ऐसा लगता localtime समारोह की तरह एक छोटे से मुश्किल है, यह says के बाद से:सी ++: समय और स्थानीय समय के साथ वास्तविक समय कैसे प्राप्त करें?

सभी LOCALTIME करने के लिए कॉल और एक ही स्थिर संरचना का उपयोग gmtime, तो प्रत्येक कॉल पिछले कॉल के परिणामों को अधिलेखित करता है।

समस्या इस का कारण बनता है कि कोड के अगले टुकड़ा में दिखाया गया है:

#include <ctime> 
#include <iostream> 
using namespace std; 

int main() { 
time_t t1 = time(0); // get time now 
struct tm * now = localtime(& t1); 

std::cout << t1 << std::endl; 
sleep(2); 
time_t t2 = time(0); // get time now 
struct tm * now2 = localtime(& t2); 
std::cout << t2 << std::endl; 

cout << (now->tm_year + 1900) << '-' 
    << (now->tm_mon + 1) << '-' 
    << now->tm_mday << ", " 
    << now->tm_hour << ":" << now->tm_min << ":" << now->tm_sec 
    << endl; 

cout << (now2->tm_year + 1900) << '-' 
    << (now2->tm_mon + 1) << '-' 
    << now2->tm_mday << ", " 
    << now2->tm_hour << ":" << now2->tm_min << ":" << now2->tm_sec 
    << endl; 
} 

इस के लिए एक विशिष्ट उत्पादन होता है:

1320655946 
1320655948 
2011-11-7, 9:52:28 
2011-11-7, 9:52:28 

तो तुम देख सकते हैं, time_t timestamps सही हैं, लेकिन स्थानीय समय सब कुछ गड़बड़ कर देता है।

मेरा सवाल है: मैं एक टाइमस्टैम्प ओटी प्रकार time_t को मानव-पठनीय समय में कैसे परिवर्तित करूं?

उत्तर

18

आप localtime और gmtime में reentrancy के बारे में चिंतित रहे हैं, तो वहाँ localtime_r और gmtime_r जो कई कॉल संभाल सकता है।

जब आपकी पसंद के समय को स्वरूपित करने की बात आती है, तो फ़ंक्शन strftime देखें।

+1

+1। मुझे * _r के बारे में भी पता नहीं था! धन्यवाद! – Viet

3

लोकलटाइम() कॉल परिणाम को आंतरिक बफर में संग्रहीत करता है।

हर बार जब आप इसे कॉल करते हैं तो आप बफर को ओवरराइट करते हैं।
बफर की प्रतिलिपि बनाने का एक वैकल्पिक समाधान होगा।

time_t  t1 = time(0);   // get time now 
struct tm* now = localtime(& t1); // convert to local time 
struct tm copy = *now;    // make a local copy. 
//  ^^^ notice no star. 

लेकिन ध्यान दें: जब आप मूल्य प्रदर्शित करते हैं तो आपको केवल स्थानीय समय में कनवर्ट करना चाहिए। अन्य सभी समय आपको केवल यूटीसी (भंडारण और हेरफेर के लिए) रखना चाहिए। चूंकि आप केवल डिस्प्ले कनवर्ट करने के लिए ऑब्जेक्ट्स को कनवर्ट कर रहे हैं, फिर तुरंत प्रिंट करें और फिर चीजें गलत नहीं होंगी।

+0

+1 स्पष्टीकरण के लिए कि मुझे केवल अंत में रूपांतरण करने की आवश्यकता है। धन्यवाद! – seb

0

localtime को विरासत इंटरफ़ेस माना जाता है। यह मल्टीथ्रेड कोड में उपयोग नहीं किया जा सकता है, उदाहरण के लिए। एक बहुप्रचारित पर्यावरण में, आप Windows के तहत Posix या localtime_s के तहत localtime_r का उपयोग कर सकते हैं। अन्यथा, तुम सब करने की है परिणामों को सहेजने है:

tm then = *localtime(&t1); 
// ... 
tm now = *localtime(&t2); 

यह शायद, अधिक मुहावरेदार होगा हालांकि, के लिए एक ही तुरंत उत्पादन स्वरूपण से पहले localtime
फोन जैसे:

std::string 
timestampToString(time_t timeAndDate) 
{ 
    char results[100]; 
    if (strftime(results, sizeof(results), "%Y-%m-%d, %H:%M:%S", 
       localtime(&timeAndDate)) == 0) { 
     assert(0); 
    } 
    return results; 
} 

और तो लेखन:

std::cout << formatTime(t1) << std::endl; 

(तुम भी एक अधिक सामान्य स्वरूपण समारोह है, जोले लिया बना सकते हैं एक तर्क के रूप में प्रारूप।)

-1

आप निम्नलिखित कोड का उपयोग कर निरंतर घड़ी चला सकते हैं। यह अच्छी तरह से काम करता है।

#include<iostream> 
#include <Windows.h> 
#include<ctime> 
using namespace std; 

void main() { 
    while(true) { 
    system("cls"); //to clear screen 
    time_t tim; 
    time(&tim); 
    cout << ctime(&tim); 
    Sleep(1); 
    } 
} 
+0

मुझे लगता है कि यह सवाल का जवाब देने में विफल रहता है। (मानव पठनीय प्रारूप में time_t कैसे प्रदर्शित करें) – andrel

+0

कृपया उत्तर देने से पहले प्रश्न पढ़ें –

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