2012-09-27 22 views
5

पर डेटटाइम कब चुना है क्योंकि मैं अपना अधिकांश समय php और mysql या pgsql के साथ बिताता हूं, मैं दिनांक API को दिनांक API के लिए सामान्य शब्द के रूप में उपयोग करूंगा। PHP में कोई "दिनांक", "समय", "डेटटाइम" और "डेटटाइम ऑफसेट"हमने टाइमस्टैम

जैसे-जैसे मैं वेब एप्लिकेशन को अधिक से अधिक विस्तृत करता हूं, मैं अधिकांश समय डेटटाइम का उपयोग करता हूं, लेकिन कभी-कभी मुझे आश्चर्य होता है कि यह वास्तव में है या नहीं मैं क्या चाहता हूँ। उदाहरण के लिए ऐसा होता है कि मैं आज की तारीख को प्रदर्शित करना चाहता हूं (उदाहरण के लिए जब मैं एक मंच या ब्लॉग पोस्ट स्टोर करना चाहता हूं), कोई गणना नहीं है, प्रदान करने के लिए कोई फ़िल्टर नहीं है, कोई पुनरावृत्ति नहीं है ... तो मैं क्यों पर date() फ़ंक्शन पर उपयोग करें?

मैंने this topic देखा जो प्रत्येक प्रौद्योगिकियों के पेशेवरों का कुछ सरल विवरण प्रदान करता है।

लेकिन यह वास्तव में प्रश्न का उत्तर नहीं देता है। क्या यह वास्तव में मेरे डेटाबेस में PHP और अन्य 2 बाइट्स में डेटटाइम ऑब्जेक्ट में 2 और बाइट फेंकने का नुकसान है क्योंकि यह मुझे DATE_INTERVAL API (php में DateInterval) और IntlDateFormatter का उपयोग करने की अनुमति देता है।

इसके अलावा, इस पोस्ट का कहना है कि unix_timestamp 1970 से सुरक्षित लेकिन यह तार्किक नहीं है और कुछ परीक्षण यह साबित होता है:

echo date('d/m/Y',time(-1)); 

गूँज '31/12/1969 '! और यह तार्किक है। एक 32 बिट्स हस्ताक्षर किए गए int 0 से 4 294 967 295 तक जाते हैं और 68 वर्षों में केवल 2 अरब सेकंड होते हैं, इसलिए int हस्ताक्षरित होता है और "ऋणात्मक टाइमस्टैम्प" मौजूद होना चाहिए!

एक और सोचता है कि मेरे लिए वास्तव में महत्वपूर्ण है, और यह मुझे हर समय डेटटाइम चुनता है कि मैं तिथियों से निपटना चाहता हूं, पूर्णांक के साथ नहीं। डेटटाइम एक तिथि है, टाइमस्टैम्प नहीं है! समय क्षेत्र से निपटने: केवल इस अर्थ में कि मैं टाइमस्टैम्प पाया क्योंकि उस cas टाइमस्टैम्प में बार मैं समय-निशान तक एक फ़ाइल नाम चाहता था टाइमस्टैम्प ...

हालांकि, वहाँ अभी भी एक समस्या है। MySQL और दूसरों के रूप में समय क्षेत्र प्रबंधन नहीं करती है जब दिनांक समय के रूप में दिनांक भंडारण, अब के लिए, मैं "भागने बाहर में फिल्टर" के भागने भाग के रूप में समयक्षेत्र एकीकरण का उपयोग

$toStoreDate = new \DateTime($_POST['date'],new DateTimeZone('UTC')); 
$dao->exec('INSERT INTO mytable(mydate) VALUES (\''.$toStoreDate->format('Y-m-d h:i:s').'\')'); 
$toDisplayDate =new \DateTime($dao->query('SELECT mydate FROM mytable') 
    ->fetch(DAO::FETCH_ASSOC)['mydate']); 
$toDisplayDate->setTimeZone(new DateTimeZone('myLocal')); 

यह सही तरीका है? क्या एक साधारण टाइमस्टैम्प स्टोर करना बेहतर नहीं होगा और फिर अच्छा स्थानीय समय प्राप्त होगा?

  • दिनांक समय के 2 अधिक बाइट्स API (केवल प्रदर्शित)
  • की बहुत आसान उपयोग में एक नुकसान है कि यह समय है:


    तो, यहाँ सवाल का संक्षेप है unix_timestamp छोड़ने के लिए?

  • क्या एक साधारण टाइमस्टैम्प स्टोर करना बेहतर नहीं होगा और फिर अच्छा स्थानीय समय प्राप्त होगा?
+0

शायद अप्रासंगिक, लेकिन 'तारीख()' केवल 2038 वर्ष तक ही काम करेगा। उस वर्ष, 'दिनांक() 'शायद बहिष्कृत किया जाएगा ;-) –

+0

भले ही 2038 64 बिट सिस्टम में मानक होगा? अगर नहीं, तो एक इंट से लंबी int तक यूनिक्स टाइमस्टैम्प विनिर्देश माइग्रेट करने में समस्या क्या है? – artragis

+0

दरअसल। समय मापने के लिए जावास्क्रिप्ट 1/1/1970 से मिलीसेकंड का भी उपयोग करता है। मेरा अनुमान है कि यूनिक्स टाइमस्टैम्प यहां रहने के लिए है ^^ – Johan

उत्तर

3

जैसा कि एक टिप्पणी में कहा गया है, मेरा मानना ​​है कि यह ज्यादातर व्यक्तिगत वरीयता के लिए नीचे है। मेरी आंखों में, यूनिक्स टाइमस्टैम्प और "विरासत" गैर-ओओपी इंटरफेस का उपयोग आज की दुनिया में आगे बढ़ने का तरीका नहीं है, उदाहरण के लिए, हम INT डेटाटाइप का उपयोग करके (पढ़ना नहीं चाहिए) नहीं यूनिक्स टाइमस्टैम्प प्रारूप में तारीखों को संग्रहीत करने के लिए हमारे डेटाबेस में, हमें डेटाबेस के मूल प्रकार का उपयोग करना चाहिए जो आमतौर पर DATE या DATETIME प्रकार है जो मानक रूपांतरणों की बात करते समय PHP की DateTime ऑब्जेक्ट (और अन्य भाषाओं ') के साथ सहयोग करता है।

मानक रूपांतरणों से मेरा क्या मतलब है, इस पर थोड़ा सा विस्तार करने के लिए: जब आप MySQL का उपयोग करते हैं और PHP को मान वापस खींचते हैं तो आपको एक आईएसओ-स्वरूपित दिनांक स्ट्रिंग मिलती है, जिसमें DateTime क्लास पार्स इसके कन्स्ट्रक्टर में आपको तुरंत उपयोग करने योग्य बनाता है वस्तु। इसके विपरीत, यूनिक्स टाइमस्टैम्प मार्ग पर जाने के लिए आपको strtotime, का उपयोग करना होगा, फिरdate जो भी प्रारूप आप चाहते हैं उसे प्राप्त करने के लिए।

मैंने अपने PHP सिस्टम और .NET सिस्टम के बीच इंटरऑप के बारे में पहले उल्लेख किया था। जबकि टाइमस्टैम्प का उपयोग करके कोई विशिष्ट समस्या नहीं है, यह केवल व्यावहारिक समाधान नहीं है, फिर भी, हम एक डेटाबेस का उपयोग करते हैं जो डेटटाइम मान देता है जिसे सीधे पाइप से भेजा जा सकता है। अगर हम इसे PHP में आंतरिक रूप से उपयोग के लिए यूनिक्स टाइमस्टैम्प में परिवर्तित करना चाहते हैं तो हमें इसे वापस भेजना होगा यदि हम प्रतिक्रिया भेजना चाहते हैं, या .NET एप्लिकेशन को प्रतिक्रिया भेजना चाहते हैं (या मुझे केवल एपीआई कहना चाहिए इस मामले में) यह एक टाइमस्टैम्प है, और अंत में इसे परिवर्तित करें। बोर्ड में DateTime का उपयोग करके, यह किसी भी रूपांतरण की आवश्यकता को कम करता है और पूरी विकास प्रक्रिया आसान होती है।

अंत में, यह सब में जोड़ने के लिए के रूप में आप भी अपनी पोस्ट में उल्लेख किया है, आप इस तरह के DateInterval के रूप में चमकदार आइटम, आसान timezoning, आसान हेरफेर और उपयोग करने के लिए मिल आसान स्वरूपण आदि जब आप DateTime उपयोग करें और यह संबंधित है वस्तु उन्मुख भागीदारों अपराध मैं। यह मेरी आंखों में बस एक आसान विकास प्रक्रिया है।

मुझे विश्वास नहीं है क्योंकि मैंने शुरुआत में कहा था कि इसका एक "सही" जवाब है, आपकी व्यक्तिगत कोडिंग शैली के आधार पर व्यक्तिगत पसंद की अधिकता है, और ऊपर दी गई टिप्पणियां मेरा प्रतिबिंबित करती हैं।

दिनांक समय के 2 अधिक बाइट (केवल प्रदर्शित)

  • मैं किसी भी तरह से तो विश्वास नहीं करते एपीआई के बहुत आसान उपयोग में एक नुकसान है। विशेष रूप से PHP स्क्रिप्ट के साथ आमतौर पर ऐसी छोटी चल रही प्रक्रियाएं होती हैं।

क्या यह unix_timestamp को छोड़ने का समय है?

हाँ :)

नहीं यह अच्छा स्थानीय समय एक सरल टाइमस्टैम्प की दुकान और फिर पाने के लिए बेहतर होगा?

डेटाबेस पर उपरोक्त टिप्पणियां देखें, यह इस उद्देश्य आईएमओ के लिए यूनिक्स टाइमस्टैम्प का उपयोग करने के लिए "मूल" नहीं है। आप बस ->getTimezone पर कॉल कर सकते हैं और इसे डेटाबेस में संग्रहीत कर सकते हैं, फिर ->setTimezone का उपयोग करें जब आप इसे दोबारा बाहर खींचें।

+0

मुझे यह जवाब बहुत पसंद है। आप एक अर्थ में मेरे दृष्टिकोण का पालन करते हैं। इसके अलावा, आप इस तथ्य को भूल गए हैं कि डेटटाइम :: createFromFormat आपको unixtimestamp से एक तारीख बनाने की अनुमति देता है (और आप प्रारूप ('यू') या getTimestamp विधियों द्वारा अपने डेटटाइम ऑब्जेक्ट से unixtimestamp भी प्राप्त कर सकते हैं) – artragis

+0

बेशक । मुझे लगता है कि यह समस्या भी इस तथ्य से उपजी है कि PHP एक साधारण कार्य करने के लिए दस लाख अलग-अलग तरीकों को प्रदान करता है। मेरा मुख्य बिंदु 'डेटटाइम 'का उपयोग करना था और यह मूल रूप से आईएसओ स्वरूपित तिथि से एक उदाहरण बनाने के लिए मूल निर्माता है जिसे आप वैसे भी वापस प्राप्त करेंगे। इस तरह आप सीधे उदाहरण से पढ़ रहे/लिख रहे हैं। इसे MySQL से टाइमस्टैम्प के रूप में पढ़ने के लिए, आप 'createFromFormat' का उपयोग करेंगे, और फिर जब आप इसे * डेटाबेस * लिख रहे हों तो आपको इसे वापस प्रारूपित करना होगा। अनावश्यक ओवरहेड, आईएमओ। –

1

अपने प्रश्न का नहीं एक सटीक जवाब है, लेकिन मैं DateTime से अधिक Timestamp का चयन करेंगे, क्योंकि मैं विश्वास एक Integer मूल्य पर काम और अधिक लागत प्रभावी (CPU के प्रसंस्करण समय को मापने), बल्कि DateTime मूल्यों प्रसंस्करण है।

मैं जब मैं एक Binary Machine पर Numbers है ज्यादा सहज महसूस करते हैं, बल्कि Strings या Objects रही है।

मानव बनाम मशीन

के मामले understandability में, मैं कहना चाहता हूँ जब मैं एक कंप्यूटर के लिए एक कार्यक्रम लिख रहा हूँ, मैं विचार करेगा कि मुझे लगता है कि एक Machine काम करने के लिए बना रही हूँ उस पर, हालांकि, उस परत पर एक अमूर्तता मनुष्यों को बेहतर समझने में मदद कर सकती है, हम इसका उपयोग क्यों नहीं करते हैं जब Performance कोई समस्या नहीं है?

मुझे याद नहीं है कि किसने कहा या कहां सुना, लेकिन किसी ने People hate Computers, but they should hate Programmers की तरह कुछ कहा, और मैं पूरी तरह से इसके साथ सहमत हूं। तो, एक इंसान के रूप में मैं अभी भी उस मशीन का सम्मान करता हूं और उन कार्यक्रमों को बनाने की कोशिश करता हूं जो कंप्यूटर के लिए अधिक समझ में आता है। :)

अद्यतन:

बेहतर चित्र लिए, यह अनुमान हम 'तिथियां', प्रसंस्करण प्रति मिनट 10,000 गुना, सही से निपटने के लिए एक कार्यक्रम है?

// it LOOKS Better 
$date = new DateTime(); 
$date->setDate(1986, 3, 24); // March 24, 1986 
echo $date->format('Y-m-d'); 

// it WORKS Better 
echo date("Y-m-d", mktime(0, 0, 0, 3, 24, 1986)); // March 24, 1986 

Let कहते हैं कि मैं प्रति सप्ताह एक घंटे के लिए इस कोड को देखो, और कहते हैं कि वहाँ 10,000 लोगों को कि वे उस 24/7/365 के साथ सौदा करना चाहिए और निश्चित रूप से मैं संभाल करने वाला नहीं हूँ यह बताने के लिए है कि, यह एक मशीन के लिए एक काम है।

वैसे, मैं फिर से कहूंगा कि अगर Performance कोई समस्या नहीं है, तो हम प्रोग्रामर के लिए इसे और अधिक समझदार क्यों नहीं बनाते? अगर हमें इससे अधिक लाभ उठाने की ज़रूरत है, तो प्रोग्रामर को कोड को Works बेहतर देखें, Looks नहीं! :)

+1

आपके उत्तर के लिए धन्यवाद। मैं कहूंगा कि मैं "मानव द्वारा समझने योग्य लेखन कार्यक्रम" को पसंद करता हूं क्योंकि हर कोई "कंप्यूटर द्वारा समझने योग्य" कुछ लिख सकता है। इसके अलावा, एसक्यूएल प्रश्नों का परिणाम एक स्ट्रिंग में होता है, जिसका मतलब है कि प्रत्येक बार जब आप php स्क्रिप्ट में दिनांक के साथ सौदा करते हैं तो रूपांतरण। और PHP को बहुत ही लागत प्रभावी भाषा (जावा या .NET के लिए समान) के रूप में नहीं जाना जाता है – artragis

+0

@artragis हे, मैंने आपकी टिप्पणी के संबंध में उत्तर अपडेट किया है। :) – Mahdi

+1

आपके उत्तर को ऊपर उठाया लेकिन इसे स्वीकार नहीं किया। मेरी समस्या यह है कि यह वास्तव में * पूर्णांक के साथ दिनांक, अवधि और इतने पर सौदा करने के लिए एक गड़बड़ है। केवल पूर्णांक के साथ गणना दिनांक अंतराल पहिया को फिर से शुरू कर रहा है लेकिन कम पठनीयता – artragis