मैं PHP में दो DateTime वस्तुओं की तुलना कैसे करूं 5.2.8?


294

PHP दस्तावेज़ीकरण पर एक नज़र रखने के बाद, DateTimeऑब्जेक्ट के निम्नलिखित दो तरीके मेरी समस्या को हल करने के लिए दोनों प्रतीत होंगे:

  • दिनांक समय :: अंतर : अंतर प्राप्त करें और इसका उपयोग करें जो यह निर्धारित करने के लिए कि अधिक प्राचीन है।
  • दिनांक समय :: getTimestamp : UNIX टाइमस्टैम्प प्राप्त करें और उन की तुलना करें।

इन दोनों विधियों को डोको में संस्करण> = 5.3 में उपलब्ध होने के रूप में चिह्नित किया गया है (और, आश्चर्य की बात नहीं है, अगर मैं उन्हें कॉल करने की कोशिश करता हूं तो मुझे लगता है कि वे मौजूद नहीं हैं)। मुझे 5.2.8 के लिए कोई विशिष्ट दस्तावेज नहीं मिल रहा है इसलिए मुझे यकीन नहीं है कि अगर मेरे संस्करण में समान विधियां हैं। मैं है Google पर समस्या और समाधान, जिनमें से कोई भी मेरी बहुत ही सरल आवश्यकताओं का जवाब की एक उदार सीमा पाया:

  • मैं दो DateTime वस्तुओं की तुलना कैसे करूँ?
  • मुझे पिछले PHP संस्करणों के लिए डोको कहां मिल सकता है? विशेष रूप से संस्करण 5.2.8?

कुछ संदर्भ के लिए, मेरे पास निम्नलिखित कोड हैं:

$st_dt = new DateTime(verifyParam ('start_date'));
$end_dt = new DateTime(verifyParam ('end_date'));

// is the end date more ancient than the start date?
if ($end_dt < $start_dt) 

जाहिरा तौर पर इस आदमी पर कोई तुलना ऑपरेटर नहीं है।

संपादित करें

जाहिरा तौर पर मेरी धारणाएं पूरी तरह से झूठी थीं (इतने प्रभावी ढंग से दर्शाने के लिए मिलन का धन्यवाद)। एक तुलना ऑपरेटर है और यह ठीक धन्यवाद काम करता है। कभी-कभी मुझे एक कंपाइलर की याद आती है। बग ऊपर दिए गए कोड में है, मुझे यकीन है कि आप इसे बहुत तेजी से पाएंगे जितना मैंने किया :)।


1
संकलक की कमी के बारे में - "E_ALL" में "error_reporting" सेट करें और आपको "सूचना: अपरिभाषित चर: start_dt in ..." जैसे नोटिस मिलेंगे।
मिलीन ए। राडदेव '

5
इसके अलावा, कृपया, अपने संस्करणों पर htmlentities का उपयोग करें $_POST, या बिल्ली का बच्चा मारा जाएगा।
क्लेमेंट हेरमैन

2
और त्रुटि कहां है? : पी, मैं यह भी U_U कर रहा हूँ। अग्रिम में धन्यवाद!
अरस्तू

2
@castarco I $ st_dt को इनिशियलाइज़ करता है, लेकिन मैं एक uninitialised $ start_dt से तुलना करता हूं। अपने चर नामों की जाँच करें और शायद मिलन के सुझाव का पालन करें और अपरिभाषित चर चेतावनियों को प्राप्त करने के लिए E_ALL में error_reporting सेट करें। :)
RedBlueThing

जवाबों:


432

निम्न पुष्टि करता है कि दिनांक समय वर्ग के लिए तुलना ऑपरेटर हैं:

dev:~# php
<?php
date_default_timezone_set('Europe/London');

$d1 = new DateTime('2008-08-03 14:52:10');
$d2 = new DateTime('2008-01-03 11:11:10');
var_dump($d1 == $d2);
var_dump($d1 > $d2);
var_dump($d1 < $d2);
?>
bool(false)
bool(true)
bool(false)
dev:~# php -v
PHP 5.2.6-1+lenny3 with Suhosin-Patch 0.9.6.2 (cli) (built: Apr 26 2009 20:09:03)
Copyright (c) 1997-2008 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2008 Zend Technologies
dev:~#

7
धन्यवाद मिलन, लगता है जैसे मुझे सिर्फ मेरी गलत धारणाओं को हटाने की जरूरत थी और अचानक मेरे कोड में चमकती बग मेरे लिए स्पष्ट हो गई।
RedBlueThing

2
हम्म, यह दिलचस्प है। शायद कुछ बिंदु पर हम उपयोगकर्ता-परिभाषित कक्षाओं में ऑपरेटरों को अधिभारित करने में सक्षम होंगे।
आयनू जी। स्टेन

1
से php.net/manual/en/language.operators.comparison.php निर्मित कक्षाओं का अपना तुलना परिभाषित कर सकते हैं, विभिन्न वर्गों रहे हैं uncomparable, एक ही कक्षा - सरणियों (PHP 4) के रूप में एक ही तरह से तुलना गुण, पीएचपी 5 अपनी है स्वयं स्पष्टीकरण
शाऊल २

7
घंटे के सेट और इसके सेट के साथ एक
डेटाइम की

1
TiMESPLiNTER, मेरा मानना ​​है कि यदि आप केवल तारीखों की तुलना करने में रुचि रखते हैं तो आप इस तथ्य को नजरअंदाज कर सकते हैं कि घंटे अलग-अलग हैं, और इस तरह DateTimeएक ही तारीख के साथ दो एस की तुलना में समान नहीं होगा जब आप मानते हैं कि उन्हें चाहिए। आप उनकी तुलना करने से पहले ऑब्जेक्ट के समय घटकों को शून्य से स्पष्ट रूप से निर्धारित करके इसे माप सकते हैं।
जेसन

52

से आधिकारिक दस्तावेज :

PHP 5.2.2 के रूप में, डेटटाइम ऑब्जेक्ट्स की तुलना ऑपरेटर के उपयोग से की जा सकती है ।

$date1 = new DateTime("now");
$date2 = new DateTime("tomorrow");

var_dump($date1 == $date2); // false
var_dump($date1 < $date2); // true
var_dump($date1 > $date2); // false

5.2.2 से पहले PHP के संस्करणों के लिए (वास्तव में किसी भी संस्करण के लिए), आप अंतर का उपयोग कर सकते हैं ।

$datetime1 = new DateTime('2009-10-11'); // 11 October 2013
$datetime2 = new DateTime('2009-10-13'); // 13 October 2013

$interval = $datetime1->diff($datetime2);
echo $interval->format('%R%a days'); // +2 days

3
मुझे यह उत्तर सबसे अच्छा लगता है क्योंकि यह केवल व्यवहार की जांच करने और परिणाम मानने की अपेक्षा मैनुअल को उद्धृत करता है। SO अनुमान लगाने की जगह नहीं है। ब्रावो रॉबर्टो।
cprn

3
@roberto DateTime :: diff केवल PHP 5.3 में जोड़ा गया है
NeXuS

30

आप युगों सेकंड की तुलना भी कर सकते हैं:

$d1->format('U') < $d2->format('U')

स्रोत: http://laughingmeme.org/2007/02/27/looking-at-php5s-datetime-and-datetimezone/ (डेटाइम के बारे में काफी रोचक लेख)


16
formatएक स्ट्रिंग का उत्पादन करने वाले सावधान रहें , ताकि एक स्ट्रिंग तुलना हो। 1000000000 युग (लगभग 9 सितंबर, 2001) के बाद यह मुश्किल से एक समस्या है, लेकिन अगर आपको इससे पहले की तारीखों से निपटना है, तो आप अलग-अलग संख्या की लंबाई के कारण समस्याओं का सामना कर सकते हैं। या तो परिणामों को संख्याओं में परिवर्तित करें (उन्हें भी काम घटाकर), या जैसे वास्तव में छांटने योग्य प्रारूप का उपयोग करें c
मैक्सर्ट

1
@MaxArt आप अलग स्ट्रिंग लंबाई के कारण समस्याओं पर विस्तार से बता सकते हैं? संख्यात्मक संदर्भों में तार के बारे में मैनुअल: "यदि स्ट्रिंग में कोई भी वर्ण नहीं है '।', 'e', ​​या 'E' और संख्यात्मक मान पूर्णांक प्रकार की सीमाओं में फिट बैठता है (जैसा कि PHP_INT_MAX द्वारा परिभाषित है), स्ट्रिंग। एक पूर्णांक के रूप में मूल्यांकन किया जाएगा। अन्य सभी मामलों में इसका मूल्यांकन एक फ्लोट के रूप में किया जाएगा। " भविष्य की तारीखें (लगभग 2038) 32-बिट पूर्णांक पर हस्ताक्षर किए गए अतिप्रवाह कर सकती हैं, लेकिन पुरानी तारीखों के साथ क्या समस्या है?
एड्रियन गुंटर

1
@ AdrianGünter समस्या यह है कि हम एक संख्यात्मक संदर्भ में नहीं होंगे, लेकिन हम तार के साथ सौदा करेंगे । संख्यात्मक, लेकिन फिर भी तार। तो एक स्ट्रिंग तुलना की जाएगी।
मैक्सर्ट


2
@ FrédéricMarchal हाँ, मुझे वास्तव में बाद में पता चला कि मेरी पिछली टिप्पणी वास्तव में गलत है। PHP के पास इन मामलों के इलाज के लिए वास्तव में एक दुष्ट तरीका है, कोई अन्य भाषा (जैसा कि मुझे पता है) संख्याओं में डाली जाती है जब आपके पास तुलना करने के लिए दो तार होते हैं। यदि आप वास्तव में एक शाब्दिक तुलना करना चाहते हैं तो यह वास्तव में आपके कोड को खराब कर देता है।
मैक्सआर्ट

20

यदि आप दिनांक और समय की तुलना करना चाहते हैं, तो आप इसका उपयोग कर सकते हैं:

$d1->format("Y-m-d") == $d2->format("Y-m-d")

5
आप रीसेट समय भी सेट कर सकते हैं। $d1->setTime(0, 0, 0);
15

3

PHP 7.x के रूप में, आप निम्नलिखित का उपयोग कर सकते हैं:

$aDate = new \DateTime('@'.(time()));
$bDate = new \DateTime('@'.(time() - 3600));

$aDate <=> $bDate; // => 1, `$aDate` is newer than `$bDate`

0
$elapsed = '2592000';
// Time in the past
$time_past = '2014-07-16 11:35:33';
$time_past = strtotime($time_past);

// Add a month to that time
$time_past = $time_past + $elapsed;

// Time NOW
$time_now = time();

// Check if its been a month since time past
if($time_past > $time_now){
    echo 'Hasnt been a month';    
}else{
    echo 'Been longer than a month';
}

टाइमस्टैम्प की कुछ सीमाएँ हैं, आप इस stackoverflow.com/a/7229760/2652018
स्टील ब्रेन

जानकर अच्छा लगा! यह सिर्फ समय की तुलना करने के लिए एक सरल तरीके के लिए था।
काइल कोट

-1

यह आपकी मदद कर सकता है।

$today = date("m-d-Y H:i:s");
$thisMonth =date("m");
$thisYear = date("y");
$expectedDate = ($thisMonth+1)."-08-$thisYear 23:58:00";


if (strtotime($expectedDate) > strtotime($today)) {
    echo "Expected date is greater then current date";
    return ;
} else
{
 echo "Expected date is lesser then current date";
}

टाइमस्टैम्प की कुछ सीमाएं हैं, आप इस stackoverflow.com/a/7229760/2652018
स्टील ब्रेन

@SteelBrain आपको लगता है कि टाइमस्टैम्प सीमा से ऊपर कोड परेशान करता है, जो सभी वर्तमान तिथि समय है, कृपया कोड को फिर से पढ़ें, यह मूल रूप से $ $ की उम्मीद करता है जो हमेशा चालू महीने में होगा। मुझे नहीं लगता कि इसलिए हमें इस मामले में टाइमस्टैम्प सीमा के बारे में सोचना चाहिए।
तरुण गुप्ता

मुझे पता है, लेकिन यह अनुशंसित तरीका नहीं है, (मैंने नीचे नहीं किया :-))
स्टील ब्रेन

क्या आप कोई अनुशंसित तरीका सुझा सकते हैं
तरुण गुप्ता

ज़रूर, $today = new DateTime("now"); $time = DateTime::createFromFormat('d-m-Y',"26-October-1998"); if ($today > $time){echo "today is greater";}else{echo "other time is greater";}चीयर्स
स्टील ब्रेन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.