NSUserDefaults में NSDate को संग्रहीत करने का इष्टतम तरीका क्या है?


174

NSUserDefaults में NSDate को संग्रहीत करने के दो तरीके हैं जो मैंने पूरे किए हैं।

विकल्प 1 - setObject: forKey:

// Set
NSDate *myDate = [NSDate date];
[[NSUserDefaults standardUserDefaults] setObject:myDate forKey:@"myDateKey"];

// Get
NSDate *myDate = (NSDate *)[[NSUserDefaults standardUserDefaults] objectForKey:@"myDateKey"];

विकल्प 2 - timeIntervalSince1970

// Set
NSDate *myDate = [NSDate date];
NSTimeInterval myDateTimeInterval = [myDate timeIntervalSince1970];
[[NSUserDefaults standardUserDefaults] setFloat:myDateTimeInterval forKey:@"myDateKey"];

// Get
NSTimeInterval myDateTimeInterval = [[NSUserDefaults standardUserDefaults] floatForKey:@"myDateKey"];
NSDate *myDate = [NSDate dateWithTimeIntervalSince1970:myDateTimeInterval];

फायदा और नुकसान

विकल्प 1

यह कॉम्पैक्ट और तार्किक लगता है। हालाँकि, मुझे डेट फॉर्मेट बग्स के कारण यह गलत हो रहा है ।

विकल्प 2

यह अनाड़ी लगता है। मैं इसकी सटीकता के बारे में भी अनिश्चित हूँ - एक परीक्षण में मैंने किया था, जब मैंने तारीख को वापस प्राप्त कर लिया था, यह 48 सेकंड से बाहर था, इसके बावजूद कि ऐप्पल डॉक्स ने कहा कि NSTimeInterval में "सबसेकंड सटीकता" है।

आवश्यकताएँ

मैं जो भी विधि चुनता हूं, वह होनी चाहिए:

  1. एक सेकंड के भीतर सटीक।

  2. पठनीय और विश्वसनीय।

मेरा प्रश्न

क्या विकल्प 2 के साथ अशुद्धि है क्योंकि मैं कुछ गलत कर रहा हूं?

आप इन दो विकल्पों में से किसका उपयोग करेंगे?

क्या कोई और विकल्प है जिसके बारे में मुझे जानकारी नहीं है?

धन्यवाद!

जवाबों:


380

आप अनावश्यक रूप से चीजों को उलझा रहे हैं। आप तिथि को समय अंतराल (फिर समय अंतराल को एक अलग आदिम में) क्यों परिवर्तित कर रहे हैं? बस [sharedDefaults setObject:theDate forKey:@"theDateKey"]और इसके साथ किया जाए। NSDATE PLIST प्रारूप (दिनांक, संख्या, तार, डेटा, शब्दकोशों और सरणियों) द्वारा समर्थित "मुख्य प्रकार" में से एक है, इसलिए आप इसे सीधे स्टोर कर सकते हैं।

प्रमाण के लिए दस्तावेज देखें ।

बस सीधे तारीख को स्टोर करें और पुनः प्राप्त करें और इसे Do The Right Thing (समय क्षेत्र, परिशुद्धता, आदि सहित) देखें। इसमें कोई फॉर्मेटर शामिल नहीं है, जैसा कि दूसरों ने कहा है।


8
यहोशू, आपके उत्तर के लिए धन्यवाद। जिस कारण से मैंने मूर्खतापूर्ण दृढ़ फ्लोट दृष्टिकोण की कोशिश की थी, क्योंकि मैंने एक और महान डेवलपर को ऐसा करते देखा था और मुझे लगा कि उसने इसे किसी अच्छे कारण के लिए किया है। बेशक नहीं। मुझे अपनी स्वयं की वृत्ति पर अधिक विश्वास होना चाहिए, जो सेटओबजेक्ट का उपयोग करना था: forKey: और इसके साथ किया है।
जॉन गैलाघेर

7
मैं अनावश्यक रूप से जटिल जटिलता के बारे में सोचता हूं - डेवलपर्स और आम तौर पर आलसी लोगों के लिए एक अच्छा लक्षण है। :-)
जोशुआ नोज़ी

ऐसे मामले जहां ऐसे दृष्टिकोण का उपयोग किया जाता है, जब NSUserDefaults का उपयोग जेनेरिक मिडलवेयर के लिए उपयोगकर्ता प्राथमिकताओं के भंडारण कार्यान्वयन के रूप में किया जाता है ...
Coyote

@ कोयोट: जिस स्थिति में यह अभी भी NSUserDefaults के माध्यम से एक्सेस किया जा रहा है या संपत्ति सूची फ़ाइल से पार्स किया गया है, इसलिए उसी एक्सेस या पार्सिंग में एक उचित NSDate ऑब्जेक्ट मिलनी चाहिए, जिसे आवश्यकतानुसार परिवर्तित किया जा सकता है।
यहोशू नोजि

3
@ जॉनग्लाघर [साइडबार] किसी गरीब के लिए किसी के विशिष्ट कार्यान्वयन की गलती न करें। आपकी मूल भावना "सोचा कि उसने इसे किसी अच्छे कारण के लिए किया है ... स्पष्ट रूप से नहीं" केवल तभी मान्य हो सकता है जब आप उक्त देव की आवश्यकताओं के पूरे दायरे को समझें। अपने दृष्टिकोण को आँख बंद करके "स्पष्ट रूप से इस तरह से करने का कोई अच्छा कारण नहीं" के रूप में माना जाता है। यह कहा जा रहा है, हाँ, मैं यहोशू के दृष्टिकोण से सहमत हो जाऊंगा अगर आप इसे अन्यथा करने का कोई कारण नहीं रखते हैं तो इसे सरल रखें।
डोलियो

14

विकल्प # 1 के लिए, मुझे विश्वास नहीं है कि एक तिथि फ़ॉर्मेटर शामिल है। संभवतः हुड के नीचे, लेकिन मुझे लगता है कि यह टूटा नहीं है। तारीख को आईएसओ 8601 फॉर्म में संग्रहित किया गया है

विकल्प # 2 के लिए, उपयोग -setDouble:forKey:और आधारित संस्करणों के -doubleForKeyबजाय float। यह आपकी सटीक त्रुटियों का कारण हो सकता है।


वाह, जॉन। आपके अतिशीघ्र उत्तर के लिए धन्यवाद। जिसे आप व्यक्तिगत रूप से उपयोग करेंगे?
जॉन गलाघेर

8
सीधे तारीख का उपयोग करें, समय अंतराल का नहीं। मुझे संदेह है कि जब इतने सारे ऐप इस पर भरोसा करते हैं, तो ऐसा मूल एपीआई टूट जाता है।
बजे जॉन कलसेबेक

अति उत्कृष्ट। यह मेरी वृत्ति थी, लेकिन मैंने एक सम्मानित देव द्वारा थर्ड पार्टी कोड देखा होगा जो फ्लोट विधि का उपयोग करता था इसलिए मैंने सोचा कि कुछ अच्छा कारण होगा जो वह इसका उपयोग करेगा। बेशक नहीं। आपके उत्तर के लिए फिर से धन्यवाद!
जॉन गलाघेर

1
यह संभव है कि आपने जो कोड देखा था वह देव को याद नहीं था कि किस प्रकार को सीधे संपत्ति सूची में संग्रहीत किया जा सकता है।
बजे जॉन कलसेबेक

2
रिकॉर्ड के लिए - 32 बिट फ़्लोट में सटीकता के लिए केवल 24 बिट हैं, इसलिए 1970 से अब 40 वर्ष है, जो 40 * 365 * 86400 सेकंड है, और (40 * 365 * 86 400) / (2 ** 24) = 75 सेकंड त्रुटि । डबल सटीक वह है जो डेटाइम अंतराल है, और इसकी रॉ परिशुद्धता अब एक सेकंड के मिलियनवें भाग से बेहतर है।
टॉम एंडरसन

5

NSUserDefaults का उपयोग करें; तिथियां ज़ूलू समय में संग्रहीत की जाती हैं, इसलिए चिंता करने के लिए समय क्षेत्र के मुद्दे नहीं हैं। इसे अपने समय क्षेत्र में संग्रहीत करें, इसे किसी अन्य समय क्षेत्र में बाहर निकालें, आप ठीक हो जाएंगे, सिस्टम रूपांतरण को संभालता है (चिंता करने की कोई तिथि सूत्र नहीं)।


0

यदि आप फेसबुक ग्राफ़ एपीआई से समाप्ति की तारीख बचा रहे हैं, तो मैं * विकल्प 2 * का उपयोग करूंगा ।

विकल्प दो को आसानी से एक स्ट्रिंग में परिवर्तित किया जा सकता है (stringWithFormat का उपयोग करके)। सबसे महत्वपूर्ण बात, यह ग्राफ़ एपीआई के लिए काम करता है।

साथ ही, आपको अपनी तिथि के प्रारूप के बारे में चिंता करने की आवश्यकता नहीं है। NSDateFormatter के साथ काम नहीं करना 48 सेकंड की त्रुटि की संभावना के लायक है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.