सी

2009-11-19 5 views
5

में परिवर्तित यूटीसी में स्थानीयसमय युक्त स्ट्रिंग मैं एक स्ट्रिंग एक स्थानीय दिनांक/समय से युक्त है और मैं इसे (यूटीसी में) एक टाइम_टी मूल्य में बदलने की जरूरत है - मैं इस कोशिश कर रहा है:सी

char* date = "2009/09/01/00"; 
struct tm cal = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL}; 
strptime(date, "%Y/%m/%d/%H", &cal); 
time_t t = mktime(&cal); 

लेकिन टाइम_टी वैल्यू जो मैं वापस प्राप्त करता हूं वह वैल्यू है जो मैं अपेक्षा करता हूं कि स्ट्रिंग को यूटीसी के रूप में स्थानीय समय के रूप में पार्स नहीं किया जा रहा था। हो सकता है कि मैंने गलत तरीके से क्या समझा है, लेकिन 1 सितंबर को मेरे टाइमज़ोन (यूके) में हम बीएसटी (यानी यूटीसी + 1 घंटा) का उपयोग कर रहे हैं, इसलिए मैं उम्मीद करता हूं कि मैं यूटीसी से 1 घंटे आगे का मूल्य समाप्त करूंगा ।

क्या स्ट्रिंग को लोकलटाइम के रूप में समझने का कोई तरीका है, स्वचालित रूप से यूटीसी ऑफ़सेट को ध्यान में रखते हुए जो उस तारीख पर प्रभावी होता? ध्यान दें कि मुझे tim_t मान की आवश्यकता नहीं है, एक उदाहरण टीएम में, ऊपर दिए गए उदाहरण में मैं समय_टी मान 200 9 -00-01 01:00:00 जीएमटी

उत्तर

0

मुझे लगता है कि मैं इसे अभी Andomar को फटा गया है, धन्यवाद लेता है - इस कोड को मैं क्या जरूरत है और परवाह किए बिना काम करने के लिए प्रकट होता है वर्तमान डीएसटी स्थिति के (मैं इस जांच करने के लिए मेरे पीसी पर घड़ी बदल):

#include <time.h> 
#include <assert.h> 

time_t parseLocalDate(char* date){ 
    struct tm cal = {0, 0, 0, 0, 0, 0, 0, 0, -1, 0, NULL}; 
    strptime(date, "%Y/%m/%d/%H", &cal); 
    return mktime(&cal); 
} 

int main(int argc, char *argv[]){ 
// DST is effect, Local Time = GMT+1 
    assert(1251759600 == parseLocalDate("2009/09/01/00")); // Mon, 31 Aug 2009 23:00:00 GMT 
    assert(1254351600 == parseLocalDate("2009/10/01/00")); // Wed, 30 Sep 2009 23:00:00 GMT 
// DST not in effect, Local Time = GMT 
    assert(1257033600 == parseLocalDate("2009/11/01/00")); // Sun, 01 Nov 2009 00:00:00 GMT 
} 
5

पर mktime का उपयोग कर सकते हैं ताकि संरचना में टीएम की व्याख्या हो सके। स्थानीय टाइमज़ोन। जब आप ऐसा करते हैं, तो tm_isdst ध्वज सेट करने के लिए सावधान रहें। यह ग्रीष्मकाल के लिए 0 है, शीतकालीन समय के लिए 1, और -1 से mktime इसे समझने के लिए है।

void main() 
{ 
    char* date = "2009/09/01/00"; 
    struct tm cal = {}; 
    // Read string into struct tm 
    strptime(date, "%Y/%m/%d/%H", &cal); 
    // Tell mktime to figure out the daylight saving time 
    cal.tm_isdst = -1; 
    printf("%20s: %s", "Before mktime", asctime(&cal)); 
    // Convert struct tm to time_t 
    time_t t = mktime(&cal); 
    // Convert time_t to localtime 
    struct tm localcal = *localtime(&t); 
    printf("%20s: %s", "Local time", asctime(&localcal)); 
    printf("%20s: %i\n", "Local DST", localcal.tm_isdst); 
    // Convert time_t to GMT 
    struct tm gmcal = *gmtime(&t); 
    printf("%20s: %s", "GM time", asctime(&gmcal)); 
    printf("%20s: %i\n", "GM DST", gmcal.tm_isdst); 
} 

यह प्रिंट (मैं जीएमटी + 1 में रहते हैं, और यह अब सर्दियों है):

Before mktime: Tue Sep 1 00:00:00 2009 
     Local time: Tue Sep 1 00:00:00 2009 
     Local DST: 1 
     GM time: Mon Aug 31 22:00:00 2009 
      GM DST: 0 

यह mktime तरह लग रहा है वर्तमान डेलाइट बचत के आधार पर सितंबर में एक तारीख धर्मान्तरित यहाँ कुछ उदाहरण कोड है पहर। यह अब नवंबर है, इसलिए यह वास्तव में एक घंटा दूर है। मुझे इसे सही करने का कोई तरीका नहीं मिला है।

+0

धन्यवाद, लेकिन इसकी टाइम_टी मूल्य है कि मैं में दिलचस्पी रखता हूँ - अगर मैं 'localcal' पर एक mktime() करना आपके कोड में संरचना यह मुझे एक ही परिणाम देता है जैसे mktime() पर ' कैलोरी '। मुझे '200 9 -01-01 01:00 GMT' – codebox

+1

के समतुल्य टाइम_टी मान का उत्पादन करने के लिए कुछ तरीका चाहिए। सी सम्मेलन यूटीसी में 1 9 70-01-01 के बाद से सेकंड की संख्या को स्टोर करने के लिए है। यह केवल व्याख्या या प्रदर्शन के लिए स्थानीय स्तर पर बदल गया है। यदि आप rob_t को localtime संस्करण के रूप में पेश करना चाहते हैं, तो आप gmtime() और localtime() के बीच सेकंड की संख्या की गणना कर सकते हैं और इसे अपने time_t में जोड़ सकते हैं। :) – Andomar

+0

ठीक है, लेकिन मैं स्ट्रिंग को स्थानीय समय के रूप में समझना चाहता हूं, यूटीसी टाइम स्ट्रिंग के लोकलटाइम समकक्ष का उत्पादन नहीं करता हूं। हमारे उदाहरण में, यह मानते हुए कि हम जीएमटी + 1 में रहते हैं, स्ट्रिंग "200 9/09/01/00" हमारे स्थानीय समय है, और इसलिए यह जीएमटी में "200 9/09/01/01" के बराबर है, और इसलिए कोड को "2009/09/01/01" से संबंधित time_t मान वापस करना चाहिए। क्या इसका कोई मतलब है? – codebox

0

tm_gmtoff का उपयोग करके मेरा संस्करण यहां है। उम्मीद है, पुस्तकालय डेलाइट सेविंग टाइम का ख्याल ...

#define _BSD_SOURCE 
#define _XOPEN_SOURCE 
#include <stdio.h> 
#include <time.h> 

int gmtoffset(void) { 
    struct tm *dummy; 
    time_t t = 0; 
    dummy = localtime(&t); 
    return dummy->tm_gmtoff; /* _BSD_SOURCE */ 
} 

int main(void) { 
    int off; 
    const char *date = "2009/09/01/00"; 
    struct tm cal = {0}; 
    time_t t; 

    off = gmtoffset(); 

    strptime(date, "%Y/%m/%d/%H", &cal); /* _XOPEN_SOURCE */ 
    t = mktime(&cal); 
    printf("t  --> %s", ctime(&t)); /* ctime includes a final '\n' */ 
    t -= off; 
    printf("t-off --> %s", ctime(&t)); 
    return 0; 
} 
 
$ /usr/bin/gcc ptime.c 
 
$ ./a.out 
t  --> Tue Sep 1 01:00:00 2009 
t-off --> Tue Sep 1 00:00:00 2009 
+0

'mktime' में आपके द्वारा 'संरचना tm' को पास किया गया है' tm_isdst' 0 पर सेट है, इसलिए समय डीएसटी के बिना पढ़ा जाता है। फिर आप इसे 'ctime' पर पास करते हैं, जो 1 घंटे जोड़कर डीएसटी के लिए सही करता है। इसके बाद आप कुछ यादृच्छिक समय प्राप्त करने के लिए ऑफ़सेट को घटाते हैं, जो 1 घंटे भी भ्रमित है। यह सामान मेरे सिर को स्पिन बनाता है लेकिन मैं इसके नीचे जाना चाहता हूं :) – Andomar

+0

यह डीएसटी मजाकिया व्यवसाय है।मुझे अभी एहसास हुआ कि वर्तमान में डीएसटी प्रभावी नहीं है, लेकिन यह 1 सितंबर को था! हमम ... मुझे लगता है कि पुस्तकालय के लिए "पता" करने का कोई तरीका नहीं है जब डीएसटी एक विशिष्ट स्थान पर शुरू होता है और समाप्त होता है। मुझे लगता है कि आपको हाथ से डीएसटी का प्रबंधन करना है (http://timeanddate.com/time/dst2009.html) – pmg