2013-02-20 16 views
8

एक " असाइन नहीं किए गए मूल्य" या तो चर के TDateTimeडेल्फी: निर्धारित करने के लिए कैसे और खाली TDatetime मूल्य

एक ही रास्ता मैं तैयार की है और उपयोग कर रहा है लगता है वहाँ शून्य आवंटित करने के लिए कोई रास्ता नहीं है (। कुछ इस तरह:

function isNull(aDate : TDateTime) : boolean; 
const NullDate = 0.0; 
var aNullDate : TDatetime; 
    ms : Int64; 
begin 
    aNullDate := NullDate; 
    ms := MilliSecondsBetween(aDate,aNullDate); 
    result := (ms = Int64(0)); 
end; 

वहाँ किसी को भी बाहर जो बेहतर समाधान क्या 0 दिनांक मान overlaps नहीं जानता है

neg हैं? एटीव TDateTime मूल्य खतरनाक है? (पिछले उद्देश्य के लिए एक सक्षम संसाधन के रूप में)

+0

यदि आप इस फ़ंक्शन का उपयोग करना चाहते हैं तो मुझे लगता है कि निश्चित रूप से 'नलडेट' वैश्विक स्थिर होना चाहिए? –

+0

मुझे शून्य असाइन किए गए मान TDateTime चर की तुलना में कॉन्स वैल्यू 0 ए _simple_ ** अगर ** इस स्थिति के रूप में 'var v_datetime: TDatetime;' 'v_datetime: = 0; ' ' अगर (v_datetime = 0) तो actionToTake ' – xsubira

+3

यह फ़्लोटिंग-पॉइंट फ़ज़ की वजह से है। 'Math.IsZero' का प्रयोग करें। –

उत्तर

9

जैसा कि एंड्रियास पहले ही लिखा है, TDateTime प्रकार वास्तव में double है और इस प्रकार "शून्य" नहीं है। मैं

const 
    c_UnassignedDate = -693594; 

खाली दिनांक मान के लिए उपयोग करता है क्योंकि यह 00/00/0000 की असंभव तिथि का प्रतिनिधित्व करता है। लेकिन उदाहरण के लिए DevExpress का उपयोग करता

NullDate = -700000; 
InvalidDate = NullDate + 1; 

तो वहाँ कोई मानक घाटी पर सहमत होने के लिए, आप एक जो अपनी जरूरत सूट चुनना चाहिए लगता है।

+2

कोई तारीख नहीं है जहां ** दिन ** और ** माह ** 0 (शून्य) हैं। डेटाबेस में, यदि तारीख को असाइन किया गया है तो 'जादू' का उपयोग नहीं किया जाना चाहिए, कुछ जादू तिथि नहीं। – ain

+1

हाँ, क्षमा करें। वापस लेना, मैं उस तारीख के साल के हिस्से में देख रहा था ... अच्छा, अगर किसी निश्चित दिनांक समय कॉलम का मान 'NULL' होगा और मुझे इस मान को' TDateTime' फ़ील्ड में कड़ाई से स्टोर करना होगा, I शायद आपके 'c_UnassignedDate' निरंतर मान का उपयोग करेगा। [+1] – TLama

+0

आप कैसे समझते हैं कि -6935 9 4 दिनांक 0/0/0000 का प्रतिनिधित्व करता है? –

9

सबसे पहले आपको 'खाली TDateTime मान' से क्या मतलब है, इसे परिभाषित करने की आवश्यकता है।

TDateTime मान पूर्णांक भाग में एन्कोड किए गए दिनांक और आंशिक भाग में एन्कोड किए गए दिनांक के साथ एक दोगुना है। तो, आपको प्राप्त होने वाली 'शून्य तिथि' की सबसे नज़दीकी चीज़ शायद 0 है।

इसलिए, दिनांक 'शून्य' होने पर परीक्षण करने के लिए बस ADate <> 0 का परीक्षण करें।

लेकिन सावधान रहें: यदि आप TDateTime स्थानीय चर घोषित करते हैं तो यह एक मूल्य देने से पहले =0 आवश्यक नहीं होगा। यह कुछ भी हो सकता है। बेशक, एक ही बात प्रकार integer, double, boolean, के चर पर लागू होता है ...

इसके अलावा, मुझे विश्वास है कि मूल्य 0 के साथ एक TDateTime तारीख 1899/12/30 encodes।

अंत में, नकारात्मक TDateTime मान पूरी तरह सामान्य हैं। उदाहरण के लिए, -50001886-04-22 से मेल खाता है।

मुझे आपके कोड का काफी अंक नहीं मिलता है। आप 0 'अ-निरुपित' मान (जो बुरा है, अगर आप 1899/12/30 के करीब दिनांकों में रुचि रखते हैं) के रूप में उपयोग करना चाहते हैं, क्यों बस

function IsUnassigned(ADate: TDateTime): boolean; 
begin 
    result := ADate = 0; 
end; 

संभवतः (लेकिन समतुल्य रूप नहीं ऐसा नहीं या,!),

function IsUnassigned(ADate: TDateTime): boolean; 
begin 
    result := IsZero(Date); 
end; 

अपने उत्तर में, ऐन ने 'असाइन किए गए दिनांक' मान के लिए कुछ और अधिक उचित विकल्प दिए।

+0

कैलेंडर समय टूटने पर ऋणात्मक समय की तारीख अंतहीन हो जाती है। –

+0

@ डेविड: अच्छा बिंदु। तो वास्तव में 'असाइन किए गए' मान के लिए बहुत सारे व्यावहारिक विकल्प हैं। –

+1

क्या NaN का उपयोग यहां स्पष्ट मूल्य के रूप में करने के लिए उपयोगी नहीं होगा? फिर आप इस स्थिति के परीक्षण के लिए IsNaN का उपयोग कर सकते हैं। –

1

TDateTime के बजाय PDateTime का उपयोग करें, और शून्य मान के रूप में भेजें। यदि मूल्य के लिए कोई सूचक नहीं है, तो परिणाम कोई मूल्य नहीं है।

जांच करने के लिए निरुपित ptr मूल्य उपयोग:

MyDatePointer := nil; 
if (Assigned(MyDatePointer)) then ... 
1

tDateTime 0 और -1 के बीच मूल्यों के लिए अपरिभाषित है जिसका अर्थ है कि -0.5 की एक tDateTime एक विकल्प के रूप एक अशक्त तारीख के लिए एक अपरिभाषित मूल्य और उपयोगी है NaN करने के लिए। DateTimeToString प्रदर्शित होगा -0.5 +0.5 के समान;

संबंधित मुद्दे