2013-01-02 22 views
6

मुझे डेटाबेस से एक यूनिक्स टाइमस्टैंप मिलता है और मैं इससे मानव पठनीय तारीख बनाने की कोशिश कर रहा हूं। मैं इस तरह से उपयोग कर रहा हूंयूनिक्स टाइमस्टैम्प को मानव पठनीय समय में कैसे परिवर्तित करें?

long t1=[time longLongValue]; 

NSDate* date=[NSDate dateWithTimeIntervalSince1970:t1]; 

जहां समय टाइमस्टैम्प है। जब मैं तारीख प्रिंट मैं

1956-02-18 19:04:01 +0000 

बजाय

2013-01-02 12:31:03 +0000 

टाइमस्टैम्प था 1356765933449

+1

पढ़ा [यह] (https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/DataFormatting/Articles/dfDateFormatting10_4.html) और [यह] (http://stackoverflow.com/ प्रश्न/5739598/सेटिंग-डेट-फॉर्मेट-फॉर-एनएसडेटेटफॉर्मर) – tkanzakic

उत्तर

7

यह पूर्णांक अतिप्रवाह की बात, के रूप में बोरिस सही ढंग से है अपने जवाब में बताया।

मुझे नहीं पता कि आपकी time ऑब्जेक्ट क्या है, लेकिन signed long int के बजाय NSTimeInterval का उपयोग करें।

आईओएस NSTimeInterval पर वर्तमान में

typedef double NSTimeInterval; 

के रूप में परिभाषित किया गया है, लेकिन आप उस के बारे में बहुत ज्यादा परवाह नहीं करनी चाहिए। टाइप समानार्थी के साथ चिपकने से ऐप्पल किसी अन्य चीज को अंतर्निहित परिभाषा को बदलने का फैसला करता है।

कहा है कि आप की तरह

NSTimeInterval epoch = [time doubleValue]; 
NSDate * date = [NSDate dateWithTimeIntervalSince1970:epoch]; 

कोड रख-रखाव मुद्दा मैंने पहले वर्णित के संबंध में यहां आप स्पष्ट रूप से एक doubleValue (आप कई विकल्प नहीं है) का उपयोग कर रहे कुछ करने के लिए अपने कोड में परिवर्तन करना चाहिए,, लेकिन अच्छी बात यह है कि अगर ऐप्पल NSTimeInterval को double असाइनमेंट के साथ संगत नहीं करने की परिभाषा को बदलता है, तो संकलक आपको बताएगा।

0

फिर NSDateFormatter का उपयोग कर दिनांक स्वरूप मिलता है। विवरण गाइड।

https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSDateFormatter_Class/Reference/Reference.html

+0

यह गलत जवाब भी लौटा रहा है – zzzzz

+0

@NSIllusion ओपी स्पष्ट नहीं था, लेकिन मामला गलत होने के बारे में है, स्वरूपण नहीं। –

6

इस

- (NSString *) getDateFromUnixFormat:(NSString *)unixFormat 
{ 

    NSDate *date = [NSDate dateWithTimeIntervalSince1970:[unixFormat intValue]]; 
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init]; 
    [dateFormatter setDateFormat:@"MMM dd, yyyy-h:mm"]; 
    [dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]]; 
    //NSDate *date = [dateFormatter dateFromString:publicationDate]; 
    NSString *dte=[dateFormatter stringFromDate:date]; 

    [dateFormatter release]; 
    return dte; 

} 
+0

यह 1 9 जनवरी, 2038-3: 14 लौटा रहा है जो आज भेजे गए संदेशों के लिए है। – zzzzz

+0

यूनिक्स टाइमस्टैम्प 1356765933449 – zzzzz

+0

ठीक है, मैंने इसे अपनी विधि से भी चेक किया है, यदि मैं आपके दिए गए टाइमस्टैम्प के लिए अपनी विधि में intValue का उपयोग करता हूं तो यह वही परिणाम देता है जैसा आप प्राप्त करते हैं लेकिन आईडी मैं डबलव्यू का उपयोग करता हूं, यह मुझे मिला है 14 मार्च, 44 9 64-2 : 57, ऐसा लगता है कि टाइमस्टैम्प बहुत बड़ा तरीका है – Talha

6

यूनिक्स टाइमस्टैम्प केवल 32 उपलब्ध बिट्स है की कोशिश करो।

क्योंकि वे एक हस्ताक्षरित int का उपयोग करते हैं, वे 1.1.1970 से सेकंड गिनते हैं। एक 32 बिट हस्ताक्षरित int केवल 2147483647 तक मान रख सकता है, जहां आप इसे 1356765933449 होना चाहते हैं। इससे ओवरफ्लो होता है, और इससे आपकी तिथि अमान्य हो जाती है।

यह भी Year 2038 Problem के रूप में जाना जाता है, क्योंकि 2147483647 (अधिकतम मूल्य) ने मंगलवार को 03:14:07 यूटीसी, 19 जनवरी को हिट हो जाएगा 2038

+0

वर्ष 2038 समस्या के बारे में जानकारी के लिए धन्यवाद। – Augustine