2010-05-08 15 views
40

मुझे डेटा प्रकार time_t पता नहीं है। क्या यह एक फ्लोट डबल या कुछ और है? क्योंकि अगर मैं इसे प्रदर्शित करना चाहता हूं तो मुझे उस टैग की आवश्यकता है जो इसके साथ printf के अनुरूप है। मैं time_t प्रदर्शित करने के लिए बाकी से संभाल सकता हूं लेकिन मुझे इसके साथ मेल खाने वाले डेटा प्रकार को जानने की आवश्यकता है।क्या प्राचीन डेटा प्रकार time_t है?

+2

यह पहले से ही यहाँ उत्तर दिया गया है: http://stackoverflow.com/questions/471248/what-is-ultimately-a-time-t-typedef-to –

+1

जो लोग यहां आते हैं कैसे printf करने के लिए खोज के लिए एक time_t, वही चर्चा clock_t पर लागू होती है और [यहां] किया गया है (http://stackoverflow.com/questions/1083142/whats-the-correct-way-to-use-printf-to-print-a-clock आयकर)। –

+0

@FirasAssaad वह उत्तर लिनक्स के लिए है। यह पोस्ट गैर-ओएस विशिष्ट है। – chux

उत्तर

26

दुर्भाग्यवश, यह पूरी तरह से पोर्टेबल नहीं है। यह आमतौर पर अभिन्न है, लेकिन यह can be कोई भी "पूर्णांक या वास्तविक-फ़्लोटिंग प्रकार" है।

2

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

ने कहा, मेरे लिनक्स मशीन पर time_t का आकार 8 बाइट्स है, जो एक लंबे int या डबल का सुझाव देता है। तो मैंने किया:

int main() 
{ 
    for(;;) 
    { 
     printf ("%ld\n", time(NULL)); 
     printf ("%f\n", time(NULL)); 
     sleep(1); 
    } 
    return 0; 
} 

समय% ld एक की वृद्धि हुई द्वारा दिए गए हर कदम और नाव 0.000 हर बार छपी। यदि आप time_ts प्रदर्शित करने के लिए printf का उपयोग करने के लिए नरक हैं, तो आपका सबसे अच्छा शर्त अपने स्वयं के प्रयोग को आजमाएं और देखें कि यह आपके प्लेटफॉर्म पर और आपके कंपाइलर के साथ कैसे काम करता है।

+4

मुझे पता है कि आपकी टिप्पणी पुरानी है, लेकिन आपको 'printf ("% f \ n ", (double) time (NULL)) का उपयोग करने की आवश्यकता है; क्योंकि printf एक vararg फ़ंक्शन है। –

28

यह प्लेटफ़ॉर्म-विशिष्ट है। लेकिन आप इसे एक ज्ञात प्रकार में डाल सकते हैं।

printf("%lld\n", (long long) time(NULL)); 
+4

यह प्लेटफॉर्म का समर्थन करता है (लंबे समय तक)। यह ठीक है जब ऐसा नहीं होता है कि आपको यह जानने की जरूरत है कि time_t केवल 32-बिट है। –

+2

यह भी मानता है कि मूल्य को पकड़ने के लिए 'लंबा लंबा' पर्याप्त है। जहां तक ​​मानक कहता है कि 'टाइम_टी' पहले मोंटी पायथन एपिसोड प्रसारित होने के बाद से यॉटोसेकंड की संख्या हो सकती है (जो इसे 64 बिट्स से बड़ा कर देगा)। – skyking

+0

@skyking झूठ बोल नहीं है। इस तरह के मूल्य (लगभग 1.5e33) रखने के लिए आपको कम-से-कम 111-बिट नंबर की आवश्यकता होगी। जब तक वे मानक में 'लंबे समय तक लंबे समय तक नहीं डालते, तब तक आप अपने सभी' time_t' को 'uint64_t [2]' में संग्रहीत करके भविष्य के लिए तैयार कर सकते हैं। – Balthamos

12

आप फ़ंक्शन difftime का उपयोग कर सकते हैं। यह दो time_t मानों के बीच अंतर देता है, आउटपुट मान double है (difftime documentation देखें)।

time_t actual_time; 
double actual_time_sec; 
actual_time = time(0); 
actual_time_sec = difftime(actual_time,0); 
printf("%g",actual_time_sec); 
संबंधित मुद्दे