दिनांक समय "शून्य" मान


273

मैं बहुत कुछ खोज रहा हूं लेकिन समाधान नहीं मिल रहा है। आप एक DateTime के साथ कैसे व्यवहार करते हैं जिसमें एक असमान मूल्य (शून्य के बराबर) को समाहित करने में सक्षम होना चाहिए? मेरे पास एक वर्ग है जिसमें डेटटाइम प्रॉपर्टी वैल्यू सेट हो सकता है या नहीं। मैं DateTime.MinValue के लिए प्रॉपर्टी होल्डर को इनिशियलाइज़ करने की सोच रहा था, जिसे तब आसानी से चेक किया जा सकता था। मुझे लगता है कि यह एक सामान्य प्रश्न है, आप ऐसा कैसे करते हैं?

जवाबों:


420

सामान्य डेटटाइम्स के लिए, यदि आप उन्हें बिल्कुल भी इनिशियलाइज़ नहीं करते हैं तो वे मेल खाएंगे DateTime.MinValue, क्योंकि यह एक रेफरेंस टाइप के बजाय एक वैल्यू टाइप है।

आप इस तरह एक अशक्त DateTime का उपयोग कर सकते हैं:

DateTime? MyNullableDate;

या लंबा रूप:

Nullable<DateTime> MyNullableDate;

और, अंत में, किसी भी प्रकार के डिफ़ॉल्ट को संदर्भित करने के लिए एक अंतर्निहित तरीका है। यह nullसंदर्भ प्रकारों के लिए लौटाता है , लेकिन हमारे DateTime उदाहरण के लिए यह उसी तरह लौटेगा DateTime.MinValue:

default(DateTime)

या, C # के हाल के संस्करणों में,

default

8
यदि आप इसका उपयोग करने का एक उदाहरण प्रदान करते हैं तो यह बहुत मदद करेगा। आप डेटाबेस में डेटटाइम कैसे असाइन करते हैं, जो कि DBNull हो सकता है, अतुलनीय डेटटाइम को?
kirk.burleson

9
यह नोट करना भी अच्छा है कि जब आप उन्हें इनिशियलाइज़ करते हैं और अशक्त होते हैं, तो उन्हें भी असाइन किया DateTime.MinValueजाता है
जेफ लाफे

2
@ kirk.burleson जो एक अलग प्रश्न की तरह दिखता है।
कॉम्पिटिशन

आपको इसे MyNullableDate=date; सेट करने की आवश्यकता होगी , इसे MyDate = MyNullableDate.Value;पढ़ने के लिए, और if(MyNullableDate.HasValue)यह जांचने के लिए कि क्या यह अशक्त है
satibel

उत्तर के "अंत" को थोड़ा स्पष्ट करने के लिए - Nullable <DateTime> (DateTime?) का डिफ़ॉल्ट शून्य है, क्योंकि Nullable <T> एक संदर्भ प्रकार बनाता है।
ryanwebjackson

88

यदि आप .NET 2.0 (या बाद में) का उपयोग कर रहे हैं, तो आप अशक्त प्रकार का उपयोग कर सकते हैं:

DateTime? dt = null;

या

Nullable<DateTime> dt = null;

फिर बाद में:

dt = new DateTime();

और आप के साथ मूल्य की जांच कर सकते हैं:

if (dt.HasValue)
{
  // Do something with dt.Value
}

या आप इसका उपयोग कर सकते हैं जैसे:

DateTime dt2 = dt ?? DateTime.MinValue;

आप यहाँ और अधिक पढ़ सकते हैं:
http://msdn.microsoft.com/en-us/library/b3h38hb0.aspx


1
आप .NET के पूर्व संस्करणों में भी nullable प्रकार का उपयोग कर सकते हैं, 3.0 की कोई आवश्यकता नहीं है।
स्टीफनबेयर 12

1
यह .NET 2.0 में सही आया था? ? सिंटैक्स को 3.5 में VB.NET में जोड़ा गया था, लेकिन यह 2.0 # के बाद से मेरा मानना ​​है।
डेविड मोहुंड्रो

1
Nullable प्रकार .Net 2.0 में उपलब्ध हैं। C # ने शॉर्टहैंड किया है? 2.0 से संकेतन। केवल VB.Net के पास आशुलिपि नहीं थी? 2.0 में लेकिन आप Nullable (DateTime का) का उपयोग कर सकते हैं
Mendelt

अंतिम स्निपेट के लिए, मैं कहूंगा कि डेटटाइम dt2 = dt ?? DateTime.MinValue;
जोएल कोएहॉर्न

मैं उपयोग करूंगा dt.GetValueOrDefault()- यह सबसे कुशल विकल्प है।
कॉम्पिटिशन

37

दिनांक और समय? MyDateTime {मिल; सेट;}

MyDateTime = (dr["f1"] == DBNull.Value) ? (DateTime?)null : ((DateTime)dr["f1"]);

1
इससे मुझे पता चला कि सिर्फ nullकाम करने से गुजरना नहीं है। इसे होना जरूरी है (DateTime?)null
अपरिपक्व भग्न

33

निम्नलिखित तरीके से भी काम करता है

myClass.PublishDate = toPublish ? DateTime.Now : (DateTime?)null;

कृपया ध्यान दें कि प्रॉपर्टी पब्लिश करें डेटटाइम होना चाहिए?



8

यह इंगित करने के लायक है कि, जबकि एक DateTimeचर नहीं हो सकता है null, यह अभी भी nullएक संकलक त्रुटि के बिना तुलना की जा सकती है :

DateTime date;
...
if(date == null) // <-- will never be 'true'
  ...

6

आप एक अशक्त वर्ग का उपयोग कर सकते हैं।

DateTime? date = new DateTime?();

यह शायद ध्यान देने योग्य है कि यह आपको गैर-अशक्त बनाने के लिए अलग व्यवहार देगा DateTime। जैसा कि पहले उल्लेख किया गया है, new DateTime()प्रभावी रूप से आपको देगा DateTime.Minजबकि new DateTime?()परिणाम शून्य होगा।
विटोक


6

आप DateTime को Nullable पर सेट कर सकते हैं। डिफ़ॉल्ट रूप से DateTime अशक्त नहीं है। आप इसे एक-दो तरीकों से अशक्त बना सकते हैं। दिनांक समय के बाद प्रश्न चिह्न का उपयोग करना? myTime या सामान्य शैली का उपयोग करने योग्य।

DateTime? nullDate = null;

या

DateTime? nullDate;

5

मैं हमेशा समय निर्धारित करता हूं DateTime.MinValue। इस तरह मुझे कोई NullErrorException नहीं मिलती है और मैं इसे उस तारीख से तुलना कर सकता हूं जो मुझे पता है कि सेट नहीं है।


8
इसका मतलब है कि आप "मुझे वास्तव में यहां डेटटाइम की जरूरत है" और "इट्स ऑल्टरनेटिव" के बीच का अंतर नहीं बता सकते हैं - Nullable <DateTime> एक बेहतर समाधान है, IMO।
जॉन स्कीट

? मुझे वास्तव में आपकी टिप्पणी नहीं आती। हाँ, मुझे पता है कि जब डेटटाइम अब तक वास्तविकता का रास्ता है, अगर यह शून्य था ...
पैट्रिक डेसजार्डिंस

2
यह सुविधाजनक है, लेकिन मैं DateTime.MinValue को एक मूल्य के रूप में देखता हूं, विशेष स्थिति नहीं। यह केवल रेखा के नीचे समस्याएं पैदा कर सकता है। मैं अशक्त <DateTime> के साथ जाऊँगा।
स्पूलसन

3
मुझे लगता है कि आपको मेरे उत्तर के बारे में कुछ याद है, स्पूलसन ने कुछ लिखा था और मैं जवाब दे रहा था। सार्वजनिक सदस्यों के बारे में, यह समान नहीं है और आप इसे जानते हैं। यह स्ट्रिंग की तरह है। खाली या अशक्त। आप दोनों कर सकते हैं, इसलिए नहीं कि String.Empty बेहतर है कि अशक्त गलत है। जो कुछ।
पैट्रिक डेसजार्डिन्स

1
मैं इस पर Daok के साथ हूँ। यह "पुस्तक द्वारा" दृष्टिकोण नहीं हो सकता है, लेकिन यह NullReferenceException प्राप्त करने या बोझिल अशक्त प्रकार से निपटने से बेहतर है। इसके अलावा, कितने आवेदन हैं जो वास्तव में 1 जनवरी, 1 ईस्वी सन्दर्भ देने की आवश्यकता है?
याकूब डेटा सॉल्यूशंस

4

बस चेतावनी दी है - जब एक अशक्त अपनी स्पष्ट रूप से अब एक 'शुद्ध' डेटाइम वस्तु का उपयोग कर, के रूप में आप सीधे DateTime उपयोग नहीं कर सकते। मैं कोशिश करके समझाता हूँ।

Nullable <> का उपयोग करके आप मूल रूप से DateTime को एक कंटेनर (धन्यवाद जेनरिक) में लपेट रहे हैं, जो अशक्त है - जाहिर है इसका उद्देश्य। इस कंटेनर के अपने गुण हैं, जिन्हें आप कॉल कर सकते हैं जो उपर्युक्त DateTime ऑब्जेक्ट तक पहुंच प्रदान करेंगे; सही संपत्ति का उपयोग करने के बाद - इस मामले में Nullable.Value - आपके पास मानक DateTime सदस्यों, संपत्तियों आदि तक पहुंच है।

इसलिए - अब यह मुद्दा डेटाइम ऑब्जेक्ट तक पहुंचने के लिए सबसे अच्छा तरीका है। कुछ तरीके हैं, नंबर 1 एफएआर द्वारा सबसे अच्छा है और 2 "यार क्यों" है।

  1. Nullable.Value संपत्ति का उपयोग करना,

    DateTime date = myNullableObject.Value.ToUniversalTime(); //Works

    DateTime date = myNullableObject.ToUniversalTime(); //Not a datetime object, fails

  2. Convert.ToDateTime () का उपयोग करते हुए अशक्त वस्तु को डेटाइम में परिवर्तित करना,

    DateTime date = Convert.ToDateTime(myNullableObject).ToUniversalTime(); //works but why...

यद्यपि इस बिंदु पर उत्तर अच्छी तरह से प्रलेखित है, मेरा मानना ​​है कि नलबल का उपयोग संभवतः पोस्ट करने के लायक था। क्षमा करें यदि आप असहमत हैं।

संपादित करें: एक तीसरा विकल्प निकाला गया क्योंकि यह थोड़ा विशिष्ट और मामला निर्भर था।


2

हालांकि हर कोई आपको पहले ही जवाब दे चुका है, लेकिन मैं एक ऐसे तरीके का उल्लेख करूंगा, जिससे किसी कार्य को एक समय सीमा में पारित करना आसान हो जाता है

[त्रुटि: system.datetime कन्वर्ट नहीं कर सकते हैं? to system.datetime]

DateTime? dt = null;
DateTime dte = Convert.ToDateTime(dt);

अब आप बिना किसी समस्या के फ़ंक्शन के अंदर dte पास कर सकते हैं।


1

यदि आप कभी-कभी, अशक्त होने की अपेक्षा करते हैं, तो आप कुछ इस तरह का उपयोग कर सकते हैं:

var orderResults = Repository.GetOrders(id, (DateTime?)model.DateFrom, (DateTime?)model.DateTo)

अपने रिपॉजिटरी में अशक्त-सक्षम डेटाटाइम का उपयोग करें।

public Orders[] GetOrders(string id, DateTime? dateFrom, DateTime? dateTo){...}

1

मुझे वही समस्या थी क्योंकि मुझे थ्रो एर्गुमेंट्सन्यूसेप्शन के लिए यूनिट टेस्ट करते समय डेटॉल के लिए एक पैरामीटर के रूप में नल देना पड़ा था। यह निम्नलिखित विकल्प का उपयोग करके मेरे मामले में काम करता है:

Assert.Throws<ArgumentNullException>(()=>sut.StartingDate = DateTime.Parse(null));

0

दिनांक / समय डेटा प्रकार की प्रकृति को देखते हुए इसमें कोई nullमान नहीं हो सकता है , अर्थात इसमें एक मान शामिल करने की आवश्यकता है, यह रिक्त नहीं हो सकता है या इसमें कुछ भी नहीं हो सकता है। यदि आप एक तारीख / समय चर के रूप में चिह्नित करते हैं nullableतो केवल आप इसे एक शून्य मान असाइन कर सकते हैं। तो आप जो करना चाह रहे हैं वह दो चीजों में से एक है (और भी हो सकता है लेकिन मैं केवल दो के बारे में सोच सकता हूं):

  • यदि आपके पास इसके लिए कोई मान नहीं है, तो अपने चर के लिए न्यूनतम दिनांक / समय मान असाइन करें। आप अधिकतम तिथि / समय मान के साथ-साथ जिस किसी भी तरह से आपको सूट करेंगे। बस यह सुनिश्चित करें कि आप अपनी तिथि / समय मानों की जाँच करते समय लगातार साइट-वाइड हैं। उपयोग करने minया maxइसके साथ रहने का निर्णय लें ।

  • अपनी तिथि / समय चर के रूप में चिह्नित करें nullable। इस तरह से आप अपनी तिथि / समय चर सेट कर सकते हैं nullयदि आपके पास इसके लिए चर नहीं है।

मुझे एक उदाहरण का उपयोग करके अपना पहला बिंदु प्रदर्शित करने दें। DateTimeवैरिएबल प्रकार अशक्त करने के लिए सेट नहीं किया जा सकता है, यह इस मामले में, एक मूल्य की जरूरत है मैं करने के लिए यह निर्धारित करने के लिए जा रहा हूँ DateTimeअगर वहाँ कोई मूल्य नहीं है के न्यूनतम मूल्य।

मेरा परिदृश्य यह है कि मेरे पास एक BlogPostवर्ग है। इसके कई अलग-अलग क्षेत्र / गुण हैं लेकिन मैंने इस उदाहरण के लिए केवल दो का उपयोग करने के लिए चुना। DatePublishedउस समय होता है जब पोस्ट को वेबसाइट पर प्रकाशित किया गया था और उसमें एक तिथि / समय मान होना चाहिए। DateModifiedजब कोई पोस्ट संशोधित की जाती है, तो उसमें कोई मान नहीं होता है, लेकिन एक मान हो सकता है।

public class BlogPost : Entity
{
     public DateTime DateModified { get; set; }

     public DateTime DatePublished { get; set; }
}

ADO.NETडेटाबेस से डेटा प्राप्त करने के लिए उपयोग करना (असाइनमेंट DateTime.MinValueहै इसका कोई मूल्य नहीं है):

BlogPost blogPost = new BlogPost();
blogPost.DateModified = sqlDataReader.IsDBNull(0) ? DateTime.MinValue : sqlDataReader.GetFieldValue<DateTime>(0);
blogPost.DatePublished = sqlDataReader.GetFieldValue<DateTime>(1);

आप DateModifiedफ़ील्ड को चिह्नित करके मेरे दूसरे बिंदु को पूरा कर सकते हैं nullable। अब आप इसे सेट कर सकते हैं nullयदि इसके लिए कोई मूल्य नहीं है:

public DateTime? DateModified { get; set; }

ADO.NETडेटाबेस से डेटा प्राप्त करने के लिए उपयोग करना , यह ऊपर से किए गए तरीके से थोड़ा अलग दिखाई देगा ( nullइसके बजाय असाइन करना DateTime.MinValue):

BlogPost blogPost = new BlogPost();
blogPost.DateModified = sqlDataReader.IsDBNull(0) ? (DateTime?)null : sqlDataReader.GetFieldValue<DateTime>(0);
blogPost.DatePublished = sqlDataReader.GetFieldValue<DateTime>(1);

मुझे उम्मीद है कि इससे किसी भी भ्रम को दूर करने में मदद मिलेगी। यह देखते हुए कि मेरी प्रतिक्रिया लगभग 8 साल बाद आप शायद अब तक एक विशेषज्ञ सी # प्रोग्रामर हैं :)

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