दी गई तारीख की आज से तुलना करें


216

मेरा अनुसरण है

$var = "2010-01-21 00:00:00.0"

मैं आज की तारीख के मुकाबले इस तारीख की तुलना करना चाहता हूं (यानी मैं यह जानना चाहूंगा कि यह $varआज से पहले है या आज के बराबर है या नहीं)

मुझे किस फ़ंक्शन का उपयोग करने की आवश्यकता होगी?


5
मैं समय क्षेत्र भी निर्धारित करने का सुझाव
दूंगा

जवाबों:


289
strtotime($var);

इसे समय मूल्य में बदल देता है

time() - strtotime($var);

आप सेकंड के बाद से देता है $var

if((time()-(60*60*24)) < strtotime($var))

जांच करेगा कि क्या $varआखिरी दिन के भीतर है।


1
के लिए php 4 ने $ var = "2010-01-21 00: 00: 00.0" से अंतिम '.0' छोड़ दिया, अन्यथा
स्ट्रेटोटाइम

1
मैं PHP 7.1 का उपयोग कर रहा हूं। सबसेकंड भाग को केवल अनदेखा किया जाता है, क्योंकि रिटर्न सेकंड की संख्या के साथ पूर्णांक है।
डायगो मेलो

209

यह प्रारूप एक मानक स्ट्रिंग तुलना उदाहरण के लिए पूरी तरह से उपयुक्त है

if ($date1 > $date2){
  //Action
}

उस प्रारूप में आज की तारीख पाने के लिए, बस उपयोग करें date("Y-m-d H:i:s"):।

इसलिए:

$today = date("Y-m-d H:i:s");
$date = "2010-01-21 00:00:00";

if ($date < $today) {}

यह उस प्रारूप की सुंदरता है: यह अच्छी तरह से आदेश देता है। बेशक, आपकी सटीक परिस्थितियों के आधार पर, यह कम कुशल हो सकता है, लेकिन यह पूरी तरह से अधिक सुविधाजनक भी हो सकता है और अधिक रख-रखाव कोड को जन्म दे सकता है - हमें वास्तव में उस निर्णय को कॉल करने के लिए अधिक जानने की आवश्यकता होगी।

सही समयक्षेत्र के लिए, आप उपयोग कर सकते हैं, उदाहरण के लिए,

date_default_timezone_set('America/New_York');

उपलब्ध PHP Timezones को संदर्भित करने के लिए यहां क्लिक करें


2
यह भी समयक्षेत्र को अनदेखा करता है
Aushr

@anushr, यदि समय की तुलना में समय की जरूरत है, तो समय का अंतर तुलना करने से पहले की तारीख में जोड़ा जा सकता है। यह अभी भी mm/dd/yyyyप्रारूप में दो दिनांक समय स्ट्रिंग्स को दिनांक में परिवर्तित करने और फिर इसकी तुलना करने की कोशिश करने से अधिक तेज़ है । यह हमेशा मुझे चिंतित करता है जब डेवलपर्स के पास अपने सिस्टम में कई समय क्षेत्र में तारीखें होती हैं। मुझे लगता है कि आपके सिस्टम में तिथियों को स्टोर करना बेहतर होता है, हमेशा सिंगल टाइम ज़ोन में और फिर जो भी टाइमज़ोन आवश्यक हो उसे प्रदर्शित करें। मैंने 1998 के आसपास yyyy-mm-ddप्रारूप (या yyyymmdd) का उपयोग करना शुरू किया जब मुझे एहसास हुआ कि यह एसक्यूएल सर्वर में भी बहुत तेज है।
एएए

59

हेयर यू गो:

function isToday($time) // midnight second
{
    return (strtotime($time) === strtotime('today'));
}

isToday('2010-01-22 00:00:00.0'); // true

इसके अलावा, कुछ और सहायक कार्य:

function isPast($time)
{
    return (strtotime($time) < time());
}

function isFuture($time)
{
    return (strtotime($time) > time());
}

अजीब पिछड़े तर्क और विलुप्त बूलियन क्यों? क्यों न केवल "वापसी स्ट्रेटोटाइम ($ समय) == स्ट्रेटटाइम ('आज')", "रिटर्न स्ट्रेटटाइम ($ समय)> समय ()", और "वापसी स्ट्रेटटाइम ($ समय) <समय" () "" क्यों नहीं?
बॉबी जैक

@ बॉबी जैक: मेरे पास उन कार्यों में अधिक कार्यक्षमता थी, अतिरिक्त कोड को हटाना भूल गए। अब तय हो गया।
एलिक्स एक्सल

हेल्पर फंक्शन पर +1, विशेष रूप सेPast b / c मैं सिर्फ एक दौड़ा if(strtotime('2013-01-22 00:00:00.00') < time()){....}और वह मेरे लिए किया।
MDMoore313

47

BoBby Jack को पूरा करने के लिए, DateTime OBject का उपयोग, यदि आपके पास 5.2.2+ है:

if(new DateTime() > new DateTime($var)){
    // $var is before today so use it

}

यह सही नहीं है। यदि $ var वर्तमान दिन है (सटीक आधी रात के बाद), नया DateTime () बड़ा होगा तो नया DateTime ($ var) और यह सच नहीं है $ var आज से पहले है।
dxvargas

46

आप DateTimeवर्ग का उपयोग कर सकते हैं :

$past   = new DateTime("2010-01-01 00:00:00");
$now    = new DateTime();
$future = new DateTime("2021-01-01 00:00:00");

तुलना ऑपरेटर काम *:

var_dump($past   < $now);         // bool(true)
var_dump($future < $now);         // bool(false)

var_dump($now == $past);          // bool(false)
var_dump($now == new DateTime()); // bool(true)
var_dump($now == $future);        // bool(false)

var_dump($past   > $now);         // bool(false)
var_dump($future > $now);         // bool(true)

डेटाइम वस्तुओं से टाइमस्टैम्प मूल्यों को पकड़ना और उनकी तुलना करना भी संभव है:

var_dump($past  ->getTimestamp());                        // int(1262286000)
var_dump($now   ->getTimestamp());                        // int(1431686228)
var_dump($future->getTimestamp());                        // int(1577818800)
var_dump($past  ->getTimestamp() < $now->getTimestamp()); // bool(true)
var_dump($future->getTimestamp() > $now->getTimestamp()); // bool(true)

* ध्यान दें कि ===दो अलग-अलग डेटाइम ऑब्जेक्ट्स की तुलना करते हुए भी जब वे एक ही तारीख का प्रतिनिधित्व करते हैं, तो गलत रिटर्न देता है।


$futureअतीत बन गया है। : पी
mbomb007

मेरा, समय कैसे उड़ता है।
सलमान ए

13
$toBeComparedDate = '2014-08-12';
$today = (new DateTime())->format('Y-m-d'); //use format whatever you are using
$expiry = (new DateTime($toBeComparedDate))->format('Y-m-d');

var_dump(strtotime($today) > strtotime($expiry)); //false or true

यही कारण है कि $varओपी में भी मेरी बराबरी नहीं है
एलेक्सा

1
और आपको PHP (= 5.4 के लिए नया डेटाइम ()) -> प्रारूप ('Ym-d') चाहिए;
webrama.pl

6

मेरे अनुभव के आधार पर एक सावधानी, यदि आपके उद्देश्य में केवल तारीख शामिल है तो टाइमस्टैम्प को शामिल करने के लिए सावधान रहें । उदाहरण के लिए, आज कहते हैं "2016-11-09"। टाइमस्टैम्प से जुड़े तुलना यहाँ तर्क को शून्य कर देगी। उदाहरण,

//  input
$var = "2016-11-09 00:00:00.0";

//  check if date is today or in the future
if ( time() <= strtotime($var) ) 
{
    //  This seems right, but if it's ONLY date you are after
    //  then the code might treat $var as past depending on
    //  the time.
}

उपरोक्त कोड सही लगता है, लेकिन यदि यह केवल वह दिनांक है जिसकी आप तुलना करना चाहते हैं, तो, उपरोक्त कोड सही तर्क नहीं है। क्यों? क्योंकि, समय () और स्ट्रैटोटाइम () टाइमस्टैम्प को शामिल करेगा। यही है, भले ही दोनों तिथियां एक ही दिन पड़ती हैं, लेकिन समय में अंतर मायने रखेगा। नीचे दिए गए उदाहरण पर विचार करें:

//  plain date string
$input = "2016-11-09";

क्योंकि इनपुट सादा दिनांक स्ट्रिंग है, इस strtotime()पर प्रयोग करके $inputयह मान लिया जाएगा कि यह 2016-11-09 की मध्यरात्रि है। इसलिए, time()आधी रात के बाद कभी भी दौड़ना हमेशा $inputअतीत के रूप में माना जाएगा , भले ही वे एक ही दिन हों।

इसे ठीक करने के लिए, आप बस इस तरह कोड कर सकते हैं:

if (date("Y-m-d") <= $input)
{
    echo "Input date is equal to or greater than today.";
}

1
मुझे यकीन है कि ओपी ने इस पर विचार किया और यही कारण है कि उन्होंने अपने प्रश्न में `00: 00: 00.0 'शामिल किया
AaA

6

कुछ वर्षों बाद, मैं बॉबी जैक का दूसरा निरीक्षण करता हूं जो पिछले 24 घंटे आज नहीं है !!! और मुझे आश्चर्य है कि जवाब बहुत उखाड़ा गया ...

यह सुनिश्चित करने के लिए कि एक निश्चित तारीख कम है, बराबर या किसी अन्य से अधिक है, पहले आपको दिन की शुरुआत करने के लिए उन्हें "नीचे" चालू करना होगा। दूसरे शब्दों में, सुनिश्चित करें कि आप दोनों तिथियों में समान 00:00:00 समय के बारे में बात कर रहे हैं। यह बस और सुरुचिपूर्ण ढंग से किया जा सकता है:

strtotime("today") <=> strtotime($var)

अगर $var ओपी निर्दिष्ट की तरह 00:00:00 पर समय भाग है।

<=>आपको जो कुछ भी ज़रूरत है उसे बदलें (या इसे php 7 में इस तरह रखें)

इसके अलावा, जाहिर है, हम दोनों के लिए एक ही समयक्षेत्र के बारे में बात कर रहे हैं। समर्थित समयक्षेत्रों की सूची के लिए



4

जोशुआ के उत्तर पर w3schools से विस्तार:

//create objects for the dates to compare
$date1=date_create($someDate);
$date2=date_create(date("Y-m-d"));
$diff=date_diff($date1,$date2);
//now convert the $diff object to type integer
$intDiff = $diff->format("%R%a");
$intDiff = intval($intDiff);
//now compare the two dates
if ($intDiff > 0)  {echo '$date1 is in the past';}
else {echo 'date1 is today or in the future';}

आशा है कि ये आपकी मदद करेगा। Stackoverflow पर मेरी पहली पोस्ट!


1

दिनांक समय वस्तुओं की तुलना करें:

(मैंने 10 दिन चुने - 10 दिन से अधिक पुरानी कोई भी चीज "OLD" है, बाकी "NEW")

$now   = new DateTime();
$diff=date_diff($yourdate,$now);
$diff_days = $diff->format("%a");
if($diff_days > 10){
    echo "OLD! " . $yourdate->format('m/d/Y');
}else{
    echo "NEW! " . $yourdate->format('m/d/Y');
}

1

कुछ दिए गए उत्तर वर्तमान दिन को ध्यान में नहीं रखते हैं!

यहाँ मेरा प्रस्ताव है।

$var = "2010-01-21 00:00:00.0"
$given_date = new \DateTime($var);

if ($given_date == new \DateTime('today')) {
  //today
}

if ($given_date < new \DateTime('today')) {
  //past
}

if ($given_date > new \DateTime('today')) {
  //future
}

0

यदि आप समय के साथ काम करते हैं और कार्बन का उपयोग करते हैं आप सबसे अच्छे दोस्त हैं;

पैकेज स्थापित करें:

$theDay = Carbon::make("2010-01-21 00:00:00.0");

$theDay->isToday();
$theDay->isPast();
$theDay->isFuture();
if($theDay->lt(Carbon::today()) || $theDay->gt(Carbon::today()))

lt = से कम, gt = से अधिक

प्रश्न के रूप में:

$theDay->gt(Carbon::today()) ? true : false;

और भी बहुत कुछ;

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.