2009-03-23 9 views
28

में एक कॉन्स के रूप में एक टीडीएटीटाइम घोषित करें जहां तक ​​मुझे पता है कि ऐसा करने का कोई तरीका नहीं है, लेकिन मैं सिर्फ यह पूछने जा रहा हूं कि कोई और जानता है कि यह कैसे करें। मैं डेल्फी में एक कॉन्स के रूप में एक तारीख कैसे घोषित कर सकता हूं?डेल्फी

मुझे मिला एकमात्र समाधान संख्यात्मक समकक्ष का उपयोग करना है, जो दर्द का प्रकार बनाए रखने के लिए है क्योंकि यह मानव पठनीय नहीं है।

const 
    Expire : TDateTime = 39895; // Is actually 3/23/2009 

मैं ऐसा करने में सक्षम होना चाहते हैं क्या कुछ इस तरह है:

const 
    Expire : TDateTime = TDateTime ('3/23/2009'); 

या

const 
    Expire : TDateTime = StrToDate('3/23/2009'); 

तो मुझे पता है कि यह एक सुविधा का अनुरोध है जाने या मैं अगर बस ऐसा करने के तरीके चूक (हाँ, मैं जानता हूँ कि यह चाहते करने के लिए एक अजीब बात की तरह लगता है।।।।)

+0

महान प्रश्न - मैं अक्सर यह करने के लिए चाहता था (दिनांकों से समय के लिए अधिक है, लेकिन सिद्धांत ज्यादा एक ही है - जैसे मैं एक स्थिरांक, आदि के रूप में एक TDateTime में 6:45 बजे रखना चाहते हैं)। मैं हमेशा टिप्पणियों के साथ अपने पहले उदाहरण की तरह कुछ कर रहा हूं - और यह दर्द है जब मुझे बाद में इसे बदलने की जरूरत है! – robsoft

+0

ऐसा लगता है कि जीईएक्सपेर्ट्स या डीएलएएनएक्सेंशन कुछ ऐसा करने में सक्षम होना चाहिए, या तो एक तिथि के रूप में सही समय पर टिप्पणी करने के लिए एक विशेषज्ञ के रूप में, या एक प्रीप्रोसेसर कनवर्टिंग स्ट्रिंग को टीडीएटीटाइम में परिवर्तित करना चाहिए। आईएसओ 8601 प्रारूपों को अनुमति देने से केवल सभी अस्पष्टता को हटा दिया जाना चाहिए। – mghie

+0

@ मागी - अच्छा बिंदु। एक GExperts समाधान मेरे लिए पूरी तरह से स्वीकार्य होगा। ऐसा तब होता है जब मुझे कैलकुलेटर को डिवीजन करने के लिए बाहर निकलना पड़ता है जिसे मैं निराश करता हूं। :-) – robsoft

उत्तर

12

केवल? संभव तरीका, लेकिन शायद आप जो खोज रहे हैं:

const 
{$J+} 
    Expire: TDateTime = 0; 
{$J-} 

initialization 
    Expire := EncodeDate(2009, 3, 23); 
+1

मई के साथ ही इसे एक कॉन्स के बजाय एक var के रूप में घोषित कर सकते हैं। –

+1

हां, आप सही हैं, लेकिन कम से कम मेरा समाधान कॉन्स कीवर्ड का उपयोग करता है;) –

+0

जिम, मेरा टाइपो आपकी पोस्ट से निकलता है: पी –

6

नहीं, डेल्फी इसका समर्थन नहीं करता है।

आपका पहला विचार सामान्य फ़्लोटिंग-पॉइंट अक्षर से अलग डेट-टाइम अक्षर के लिए अनुरोध होगा। मुझे QC 72000 मिला, जो डीबगर में दिनांक के रूप में TDateTime मान प्रदर्शित करने के बारे में है, लेकिन आपके विशेष अनुरोध के बारे में कुछ नहीं। ऐसा नहीं है कि किसी ने कभी इसका उल्लेख नहीं किया है, हालांकि। यह समाचार समूह पर एक बारहमासी विषय है; मुझे इसके बारे में क्यूसी में कुछ भी नहीं मिला है।

आपकी दूसरी विचार StrToDate आवश्यकता संकलन समय पर मूल्यांकित होगा। मुझे इसके बारे में क्यूसी में कोई भी प्रविष्टि दिखाई नहीं दे रही है, लेकिन इसके लायक होने के लिए, सी ++ को उन कार्यों के लिए ऐसी सुविधा मिल रही है जो आवश्यक गुणों के लिए दिखाए जाते हैं। StrToDate उन आवश्यकताओं को पूरा नहीं करेगा, हालांकि, क्योंकि यह वर्तमान लोकेल की दिनांक सेटिंग्स के प्रति संवेदनशील है।

+1

एनकोडडेट से नफरत है, एनकोडटाइम प्रभावित नहीं हैं और आवश्यकता के अनुरूप होंगे। –

+0

काफी नहीं, @ क्रेग। सी ++ की आवश्यकताओं में से एक यह है कि फ़ंक्शन अपवाद नहीं फेंक सकता है (आवश्यकता में अंतर्निहित है कि फ़ंक्शन पूरी तरह से 'वापसी' कथन का होता है)।डेल्फी कार्यों में यौगिक बयान होते हैं और फेंक सकते हैं। –

+1

एक मामूली गलतफहमी, मुझे मेरी टिप्पणी में कम अस्पष्ट होना चाहिए था। मुझे विस्तृत करने की अनुमति दें: एनकोडडेट और एनकोडटाइम प्रभावित नहीं होते हैं (स्थानीयकरण द्वारा - वे निर्धारक हैं) और आवश्यकता के अनुरूप जिम की निरंतर तिथि/समय निर्दिष्ट करने के लिए जिम की आवश्यकता होगी (हालांकि। बेशक विचार एक महत्वपूर्ण मुद्दा है क्योंकि डेल्फी में वर्तमान में ऐसी सुविधा नहीं है। :(हालांकि, सी ++ के कोई अपवाद नहीं आवश्यकता के बारे में अपनी टिप्पणी दिलचस्प है –

4

रोब कैनेडी के जवाब से पता चलता है कि StrToDate समाधान सवाल से बाहर स्वाभाविक है आप अगर यह यूरोप में संकलित है अपने कोड को तोड़ने के लिए नहीं करना चाहते हैं के रूप में!

मुझे लगता है कि एनकोडडेट करने का कोई तरीका होना चाहिए लेकिन ऐसा नहीं है।

के रूप में जहां तक ​​मेरा सवाल संकलक बस संकलन और यह एक निरंतर काम में पाता है किसी भी कोड चलाने के लिए और निरंतर में परिणाम संग्रहीत करना चाहिए हूँ। यह सुनिश्चित करने के लिए कि प्रोग्राम अपने पर्यावरण के प्रति संवेदनशील नहीं है, मैं प्रोग्रामर को छोड़ दूंगा।

8

क्योंकि अपने आप में एक तारीख litteral व्याख्या निर्धारित करने योग्य नहीं है, यह सम्मेलन/स्थानीय आप का पालन पर निर्भर करता है यह करने के लिए कोई तरीका नहीं है। उदाहरण के लिए
'1/4/2009' किसी भी फ्रांसीसी व्यक्ति के लिए जनवरी में नहीं है, और 4 जनवरी के रूप में अनुवाद करने वाला कंपाइलर इसे मूर्ख बना देता है ;-)
जब तक संकलक कुछ (अच्छी तरह से प्रलेखित) "जादू लागू नहीं करता "दिनांक मूल्य और प्रदर्शन प्रतिनिधित्व को जोड़ने के लिए जैविक कार्य ... और वैसे भी, ग्रह का आधा इसे पसंद नहीं करेगा।
केवल गैर अस्पष्ट तरह से मैं अब देखते हैं ... मेरी $ 0.02

+3

यह केवल वातावरण यदि भाषा लोकेल के प्रति संवेदनशील होना परिभाषित किया गया है पर निर्भर करता है फ्लोटिंग सूत्री शाब्दिक स्थान में प्रति संवेदनशील नहीं हैं;।। वे बस को स्वीकार नहीं करते अल्पविराम के दशमलव विभाजक के रूप। कोई कारण नहीं एक तिथि समय शाब्दिक प्रारूप पर समान प्रतिबंध हो सकता है नहीं। –

+1

EncodeDate और EncodeTime नियतात्मक हैं तो useable ** हो सकता है अगर ** वे संकलन समय पर मूल्यांकन किया जा सकता है। –

3

एक डेल्फी तारीख days since Dec 30, 1899 की # है मूल्य भले ही यह एक दर्द की तरह दिखता है प्रदान करना है ...। तो आप शायद एक तारीख के रूप में एक तारीख को व्यक्त करने के लिए एक विस्तृत गणितीय सूत्र के साथ आ सकते हैं।फिर आप मानव-पठनीय भागों पर जोर देने के लिए इसे बहुत विचित्र रूप से प्रारूपित कर सकते हैं। मेरा सबसे अच्छा प्रयास नीचे है, लेकिन यह बहुत अधूरा है; एक बात के लिए, यह मानता है कि सभी महीनों में 30 दिन हैं।

मेरा उदाहरण ज्यादातर मज़ेदार है। अभ्यास में, यह बहुत हास्यास्पद है।

const 
    MyDate = ((
      2009 //YEAR 
              - 1900) * 365.25) + ((
      3  //MONTH 
              - 1) * 30) + 
      24 //DAY 
      ; 
+0

मुझे यह पसंद है, लेकिन जैसा कि आप ने कहा यह कुछ मुद्दों है। –

+0

आंशिक हिस्सा भी समस्याएं पैदा कर सकता के रूप में अपनी तिथि धीरे-धीरे आधी रात से एक वर्ष, 6 बजे दोपहर, शाम 6 से चलता है आधी रात को लीप वर्ष पर फिर से वापस जाने के लिए। – skamradt

+0

हाँ, बिल्कुल सही जैसा कि मैंने कहा, यह वास्तव में व्यावहारिक नहीं है जब तक कि आप सभी संभावनाओं को संभालने के लिए वास्तव में परिष्कृत फोरमला तैयार करने में बहुत समय व्यतीत नहीं करते हैं। बस इतना बेहतर मूल्य प्राप्त करना और हार्ड कोडिंग करना। – JosephStyons

4

एक समाधान साल के लिए स्थिरांक की एक सूची बनाने के लिए होगा, दूसरे महीने के ऑफसेट के लिए और फिर इसे फ्लाई पर बनाएं। प्रत्येक परिणामस्वरूप स्थिरांक में 1 जोड़कर आपको खुद को लीप साल का ख्याल रखना होगा। बस कुछ ही नीचे आप आरंभ करने के लिए ... :)

Const 
    Leap_Day = 1; // use for clarity for leap year dates beyond feb 29. 
    Year_2009 = 39812; // January 1, 2009 
    Year_2010 = Year_2009 + 365; // January 1, 2010 
    Year_2011 = Year_2010 + 365; // January 1, 2011 
    Year_2012 = Year_2011 + 365; // January 1, 2012 (is leap year) 
    Year_2013 = Year_2012 + Leap_Day + 365; // January 1, 2013 

Const 
    Month_Jan = -1; // because adding the day will make the offset 0. 
    Month_Feb = Month_Jan + 31; // 31 days more for the first day of Feb. 
    Month_Mar = Month_Feb + 28; // 28 days more for the first day of Mar. 
    Month_Apr = Month_Mar + 30; // 30 days more for the first day of Apr. 

Const 
    Expire_Jan1 : tDateTime = Year_2009 + Month_Jan + 1; 
    Expire : tDateTime = Year_2009 + Month_Mar + 23; 

आप एक लीप वर्ष तो आपको लगता है कि साल फरवरी परे कुछ भी करने के लिए 1 जोड़ने के लिए है।

Const 
    Expire : tDateTime = Year_2008 + Month_Mar + 23 + Leap_Day; 

संपादित

जोड़ा स्पष्टता के लिए कुछ और साल है, और एक Leap_Day निरंतर गयी।

+0

क्यों नहीं जोड़ एक और निरंतर: Leap_day = इस तरह 1. कोई नकली "+1" कि चारों ओर बैठे नहीं पहली नजर में सहज हो सकता है ... –

1

मुझे लगता है कि सबसे अच्छा समाधान आप के लिए उपलब्ध घोषित करने के लिए है:

ArmisticeDay: TDateTime = 6888.0 + (11.0/24.0); //Nov 11, 1918 11 AM 

और बस स्वीकार करते हैं।


मेरे प्रयास Nº1

Expire = EncodeDate(2009, 3, 23); 

[त्रुटि] लगातार अभिव्यक्ति की उम्मीद

मेरे प्रयास Nº2

Expire: TDateTime = EncodeDate(2009, 3, 23); 

[त्रुटि] लगातार अभिव्यक्ति की उम्मीद

तो भले ही वे लगातार, और नियतात्मक कर रहे हैं (अर्थात किसी भी लोकेल जानकारी पर निर्भर न करें), यह अभी भी काम नहीं करता है।

18

ठीक है, मेरी प्रतिक्रिया थोड़ी देर हो चुकी है, लेकिन यहां नए डेल्फी के लिए एक समाधान है।

यह अंतर्निहित वर्ग अधिभारकों का उपयोग करता है ताकि इस प्रकार के रिकॉर्ड का उपयोग किया जा सके जैसे कि वे टीडीएटीटाइम चर हैं।

TDateRec = record 
    year,month,day,hour,minute,second,millisecond:word; 
    class operator implicit(aDateRec:TDateRec):TDateTime; 
    class operator implicit(aDateTime:TDateTime):TDateRec; // not needed 
    class operator implicit(aDateRec:TDateRec):String; // not needed 
    class operator implicit(aDateRec:String):TDateRec; // not needed 
    end; 

कार्यान्वयन:

uses DateUtils; 

class operator TDateRec.Implicit(aDateRec:TDateRec):TDateTime; 
begin 
    with aDateRec do // Yeah that's right you wankers. I like "with" :) 
    Result := encodeDateTime(Year,Month,Day,Hour,Minute,Second,Millisecond); 
end; 

class operator TDateRec.Implicit(aDateTime:TDateTime):TDateRec; 
begin 
    with Result do 
    DecodeDateTime(aDateTime,Year,Month,Day,Hour,Minute,Second,Millisecond); 
end; 

class operator TDateRec.Implicit(aDateRec:TDateRec):String; 
begin 
    Result := DateTimeToStr(aDateRec) 
end; 

class operator TDateRec.Implicit(aDateRec:String):TDateRec; 
begin 
    Result := StrToDateTime(aDateRec) 
end; 

अब तुम अपनी तिथियाँ इस तरह की घोषणा कर सकते हैं:

const 
    Date1:TDateRec=(Year:2009;month:05;day:11); 
    Date2:TDateRec=(Year:2009;month:05;day:11;hour:05); 
    Date3:TDateRec=(Year:2009;month:05;day:11;hour:05;minute:00); 

अगर यह काम करता है देखने के लिए, निम्नलिखित निष्पादित करें:

ShowMessage(Date1); // it can act like a string 
ShowMessage(DateToStr(Date1)); // it can act like a date 

हैं आप वास्तव में अपने सभी Tdat को प्रतिस्थापित करना चाहते हैं इसके साथ ईटाइम चर, आपको शायद कुछ अन्य ऑपरेटरों को अधिभारित करने की आवश्यकता है (जोड़ें, घटाएं, स्पष्ट करें ...)।

+0

समाधान के लिए +1 और फिर 'with' के लिए, मैं हालांकि +1 इसके उपयोग को तुच्छ मानें :-) –

+0

मैंने इसे लिया और इसमें अपने स्वयं के जोड़ जोड़े ... 'फ्रेंडलीडेट', 'फ्रेंडलीटाइम' और 'फ्रेंडलीडेट टाइम' –

8

मैं एक समारोह के साथ स्थिरांक दिनांकों अनुकरण करने के लिए करते हैं। तकनीकी तौर पर वे एक छोटे से अधिक निरंतर "छद्म निरंतर" आबंटित से स्थिरांक के द्वारा लिखे गए हैं।

function Expire: TDateTime; 
begin 
    Result := EncodeDate(2009, 3, 23); 
end; 

नोटEncodeDate बजाय StrToDate का उपयोग। StrToDate क्षेत्रीय सेटिंग्स से प्रभावित होता है जिसका अर्थ है कि कोई गारंटी नहीं है कि एक स्ट्रिंग का अर्थ अपेक्षित किया जाएगा।

उदाहरण के लिए, आप जानते हैं कि लोग हैं, जो लगता है कि यह महत्व का एक असंगत क्रम में भावना करने के लिए "फेरबदल" तिथि भागों में आता है की एक अजीब एक समूह बनाया जा सकता है किया? वे बीच है, तो कम से कम है, तो सबसे महत्वपूर्ण हिस्सा (जैसे '2009/03/23') < मुखर मुस्कराहट > का उपयोग करें। केवल समय है कि तर्क समझ में आता है जब आप 102 वर्ष बारी - तो आप दावा कर सकते हैं अपनी उम्र 021.

समय से पहले optimisers के लिए है वहाँ बाहर, समारोह कहा जाता है यदि ऐसा है तो अक्सर है कि नैनो सेकंड किसी तारीख को एन्कोड करने के लिए आवश्यक एक मुद्दा बन जाता है - आपके पास बड़ी समस्या है जो पठनीय, रखरखाव योग्य कोड के नाम पर इस मामूली अक्षमता से अधिक है।