2012-03-05 18 views
6

मैंने एक साल, जूलियन डे (साल का दिन), घंटा, मिनट, और एक अवलोकन के साथ दो तारों में पढ़ा।एमकेटाइम() मेरे टीएम स्ट्रक्चर के साल के दिन क्यों बदल रहा है?

मैं प्रासंगिक चर बाहर sscanf का उपयोग कर खींच:

sscanf(tide_str1.c_str(), "%d %d %d %d %Lf", &y1, &j1, &h1, &m1, &obs1); 
sscanf(tide_str2.c_str(), "%d %d %d %d %Lf", &y2, &j2, &h2, &m2, &obs2); 

इस विशेष डेटा सेट के लिए, मान हैं 2011 083 23 22 1,1

मैं तो बना सकते हैं और एक टीएम संरचना को पॉप्युलेट, और mktime चलाने , अदालत के साथ के बीच में दिन पर कॉल करता है और यह 364.

int y1=2011, j1=83, h1=23, m1=22; 
struct tm time_struct = {0, 0, 0, 0, 0, 0, 0, 0, 0}, *time_ptr = &time_struct; 
time_t tv_min; 
time_struct.tm_year = y1 - 1900; 
time_struct.tm_yday = j1; 
cout << time_struct.tm_yday << endl; 
time_struct.tm_hour = h1; 
time_struct.tm_min = m1; 
time_struct.tm_isdst = -1; 
cout << time_struct.tm_yday << endl; 
tv_min = mktime(time_ptr); 
cout << time_struct.tm_yday << endl; 

कि क्यों है 083 से बदल जाता है? क्या ऐसा इसलिए है क्योंकि tm_mday और tm_mon 0 पर सेट हैं? मैंने शुरू में इसे शून्य पर शुरू करने की कोशिश नहीं की, लेकिन फिर एमकेटाइम -1 लौटा। अगर मुझे केवल दिन का दिन पता है, महीने और महीने के दिन में मुझे अलग-अलग क्या करना चाहिए?

+0

वर्ष का दिन है कभी कभी * गलत तरीके से * एक "जूलियन दिवस" ​​के रूप में भेजा। वास्तव में, एक [जूलियन दिवस] (http://en.wikipedia.org/wiki/Julian_day) संख्या 1 जनवरी, 4713 ईसा पूर्व से दिनों की संख्या है; यह खगोल विज्ञान में प्रयोग किया जाता है। –

+0

हां, लेकिन कुछ व्यवसायों के भीतर यह व्यापक रूप से उपयोग किया जाता है (गलत तरीके से), व्यावहारिक रूप से, सही हो। जब तक कि एक क्षेत्र के भीतर हर कोई एक ही शब्द का उपयोग करता है ... संचार होता है। – RuQu

उत्तर

13

mktime() कर रही है जो उसे करना चाहिए था।

सी मानक का हवाला देते हुए:

mktime समारोह टूट-डाउन समय बदल देता है, स्थानीय समय के रूप में व्यक्त, संरचना में timeptr द्वारा की ओर इशारा किया के साथ एक कैलेंडर समय मूल्य में मूल्यों से समय समारोह लौटे के समान एन्कोडिंग। के मूल मान tm_wday और tm_yday संरचना के घटकों को अनदेखा कर दिया गया है, और अन्य घटकों के मूल मान ऊपर दिए गए श्रेणियों तक सीमित नहीं हैं। सफल समापन पर, tm_wday और tm_yday संरचना के घटकों के मूल्यों को उचित रूप से स्थापित कर रहे हैं, और अन्य घटकों निर्दिष्ट कैलेंडर समय का प्रतिनिधित्व करने के लिए सेट कर रहे हैं, लेकिन उनके मूल्यों पर्वतमाला ऊपर संकेत करने के लिए मजबूर के साथ; tm_mdayis के अंतिम मूल्य नहीं सेट तक tm_mon और tm_year निर्धारित होते हैं।

mktime() कर सकते हैं गणनाtm_mday और tm_yday अन्य सदस्यों से के मूल्यों; यह उन क्षेत्रों के अन्य सदस्यों के मूल्यों की गणना करने के लिए डिज़ाइन नहीं किया गया है।

आप क्या कर सकते हैं, हालांकि, बाहर के रेंज मूल्यों के साथ एक struct tm प्रारंभ है। उदाहरण के लिए, यदि आप tm_yday चाहते 200 (साल की 200 वीं दिन) होने के लिए, आप एक struct tm जनवरी के 200 वीं दिन का प्रतिनिधित्व करने को प्रारंभ कर सकते हैं। mktime() उसके बाद सही तारीख करने के लिए यह सामान्य, एक time_t मूल्य है कि आप तो gmtime() या localtime() फ़ीड कर सकते हैं उपज।

#include <iostream> 
#include <ctime> 

int main() 
{ 
    struct tm t = { 0 }; 
    t.tm_sec = t.tm_min = t.tm_hour = 0; // midnight 
    t.tm_mon = 0;      // January 
    t.tm_year = 2012 - 1900; 
    t.tm_isdst = -1;      // unknown 

    t.tm_mday = 200;      // January 200th? 

    time_t when = mktime(&t); 
    const struct tm *norm = localtime(&when); // Normalized time 

    std::cout << "month=" << norm->tm_mon << ", day=" << norm->tm_mday << "\n"; 
    std::cout << "The 200th day of 2012 starts " << asctime(norm); 
} 

उत्पादन होता है:

यहाँ एक सरल उदाहरण है

month=6, day=18 
The 200th day of 2012 starts Wed Jul 18 00:00:00 2012 
+0

मैंने आपकी सलाह की कोशिश की और इस तरह शुरू किया: संरचना tm time_struct = {0, 0, 0, 200, 200, 0, 200, 0, 0} और परिणाम जब मैंने इसे वापस बुलाया तो 77 दिन था जब यह 83 होना चाहिए, जो पहले से 364 के करीब है लेकिन अभी भी बंद है। – RuQu

+1

मानक 'संरचना टीएम' के सदस्यों के आदेश की गारंटी नहीं देता है, इसलिए इसे प्रारंभ करना आवश्यक नहीं होगा। आपको नाम से सभी सदस्यों को प्रारंभ या असाइन करना चाहिए। लेकिन अगर उन्हें सामान्य क्रम में घोषित किया जाता है, तो आप 'tm_mday' और' tm_mon' 200 से शुरू कर रहे हैं। मुझे नहीं लगता कि आप 200 वें, या 201 वें महीने के महीने चाहते हैं। (और यह न भूलें कि 'संरचना टीएम' संख्याएं 0 से 11 महीने, 1 से 12 तक नहीं हैं।) –

+0

स्पष्ट होने के लिए, यदि मुझे वर्ष 83 83 चाहिए, तो मुझे महीने को 0 पर सेट करना चाहिए, और महीने का दिन 83? – RuQu

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

  • कोई संबंधित समस्या नहीं^_^