2008-10-21 12 views
216

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

उत्तर

332

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

DateTime? MyNullableDate; 

या उससे अधिक समय फार्म:

तुम भी एक नल दिनांक समय, इस तरह उपयोग कर सकते हैं

Nullable<DateTime> MyNullableDate; 

और अंत में, वहाँ किसी भी प्रकार की डिफ़ॉल्ट संदर्भ के लिए रास्ते में एक का निर्माण किया । इस संदर्भ प्रकार के लिए null दिखाए, लेकिन हमारे दिनांक समय उदाहरण के लिए यह एक ही वापस आ जाएगी DateTime.MinValue के रूप में:

default(DateTime) 
+7

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

+6

यह भी ध्यान रखना अच्छा है कि जब आप उन्हें प्रारंभ करते हैं और शून्य के साथ, उन्हें 'डेटटाइम.माइनवैल्यू' के साथ-साथ – jlafay

+1

@ kirk.burleson असाइन किया जाता है जो एक अलग प्रश्न की तरह दिखता है। – CompuChip

10

मैं एक nullable types उपयोग करने पर विचार होगा।

DateTime? myDateDateTime myDate के बजाय।

71

आप .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 के पुराने संस्करणों में भी शून्य के प्रकारों का उपयोग कर सकते हैं, 3.0 की आवश्यकता नहीं है। – stephenbayer

+1

टाइपो, इसे अद्यतन किया गया। –

+1

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

5

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

DateTime? date = new DateTime?(); 
5

आप इसके लिए एक सुस्त डेटटाइम का उपयोग कर सकते हैं।

Nullable<DateTime> myDateTime; 

या एक ही बात इस तरह लिखा:

DateTime? myDateTime; 
5

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

+8

इसका मतलब है कि आप "मुझे वास्तव में डेटटाइम की आवश्यकता है" और "यह वैकल्पिक है" के बीच अंतर नहीं बता सकता - Nullable एक बेहतर समाधान है, आईएमओ। –

+0

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

+0

मैं बस एक अन्य समाधान का सुझाव दे रहा हूं। दोहराए जाने के बजाय यहां पहले से 10 बार सुझाव दिया गया है। –

4

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

Using Nullable

Nullable

20

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

MyDateTime = (drOrder["Field1"] == DBNull.Value) ? (DateTime?)null : ((DateTime)drOrder["Field1"]); 
1

आप कर रहे हैं, कभी कभी, आप कुछ इस तरह इस्तेमाल कर सकते हैं अशक्त उम्मीद:

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

अपने भंडार उपयोग अशक्त करने योग्य datetime में।

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

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

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

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

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

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

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

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

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

  2. datetime को व्यर्थ वस्तु परिवर्तित Convert.ToDateTime() का उपयोग कर,

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

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

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

2

हालांकि हर किसी को पहले से ही आप इस सवाल का जवाब दे दिया है, मैं एक तरह से जो इसे आसान बना देता एक समारोह में एक datetime पारित करने के लिए

[त्रुटि उल्लेख करेंगे: system.datetime परिवर्तित नहीं कर सकते? system.datetime करने के लिए]

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

अब आप DTE समारोह के अंदर किसी भी मुद्दे के बिना पारित कर सकते हैं।

-1

दिनांक/समय डेटा प्रकार की प्रकृति को देखते हुए इसमें 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); 

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

public DateTime? DateModified { get; set; } 

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

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

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

7

इस तरह के रूप में अच्छी तरह से

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

कृपया ध्यान दें कि संपत्ति PublishDate दिनांक समय होना चाहिए काम कर रहे हैं कि?

1

मैं एक ही समस्या थी के रूप में मैं दिनांक समय के लिए एक पैरामीटर के रूप अशक्त देने के लिए है, जबकि यूनिट परीक्षण प्रदर्शन कर फेंकता के लिए ArgumentNullException.It मेरे मामले में काम किया निम्नलिखित विकल्प का उपयोग करने के लिए किया था:

Assert.Throws<ArgumentNullException>(()=>sut.StartingDate = DateTime.Parse(null)); 
संबंधित मुद्दे