अगर किसी तिथि सीमा में है, तो कैसे जांचें?


86

यदि आप एक है, तो $start_dateऔर $end_date, आप कैसे जांच कर सकते हैं उपयोगकर्ता द्वारा दिए गए एक तारीख है कि सीमा के भीतर फॉल्स?

जैसे

$start_date = '2009-06-17';

$end_date = '2009-09-05';

$date_from_user = '2009-08-28'; 

फिलहाल तारीखें कड़ी हैं, क्या यह उन्हें टाइमस्टैम्प पूर्णांक में बदलने में मदद करेगा?


यह मदद करता है, तो आप किसी भी तारीख हेरफेर कार्यों के लिए उपयोग होगा वहाँ हैं।
ChrisF

3
यूनिक्स टाइमस्टैम्प के रूप में टाइमस्टैम्प सीमा के साथ जस्ट बेयरेरॉफ़, एपोक में शुरू होता है, जो 1 जनवरी, 1970 (1970-01-01) है, इसलिए आप 1970 से पहले की तारीखों के परीक्षण के लिए मज़ेदार व्यवहार कर सकते हैं।
शादि अलमोसरी

1
@ शदी आपको पता है कि NEGATIVE नंबर जैसी कोई चीज़ है, है ना?
जेरेमी लोगान

@fiXedd एक ही मूल समस्या है, हालांकि मौजूद है - यहां तक ​​कि नकारात्मक टाइमस्टैम्प की अनुमति भी, 32 बिट टाइमस्टैम्प 1902 से पहले की तारीखों का प्रतिनिधित्व नहीं कर सकते।
फ्रैंक किसान

जवाबों:


122

उन्हें टाइम स्टाम्प्स में कनवर्ट कर रहा है ठीक जाने का रास्ता, का उपयोग कर strtotime , जैसे

$start_date = '2009-06-17';

$end_date = '2009-09-05';

$date_from_user = '2009-08-28';

check_in_range($start_date, $end_date, $date_from_user);


function check_in_range($start_date, $end_date, $date_from_user)
{
  // Convert to timestamp
  $start_ts = strtotime($start_date);
  $end_ts = strtotime($end_date);
  $user_ts = strtotime($date_from_user);

  // Check that user date is between start & end
  return (($user_ts >= $start_ts) && ($user_ts <= $end_ts));
}

बहुत अच्छा काम करता है। धन्यवाद।
3

47

यदि आपके पास PHP 5.3+ है तो डेटटाइम क्लास का उपयोग करें। उपयोग करने में आसान, बेहतर कार्यक्षमता।

DateTime आंतरिक रूप से टाइमज़ोन का समर्थन करता है, अन्य समाधानों के साथ आपको संभालना है।

<?php    
/**
 * @param DateTime $date Date that is to be checked if it falls between $startDate and $endDate
 * @param DateTime $startDate Date should be after this date to return true
 * @param DateTime $endDate Date should be before this date to return true
 * return bool
 */
function isDateBetweenDates(DateTime $date, DateTime $startDate, DateTime $endDate) {
    return $date > $startDate && $date < $endDate;
}

$fromUser = new DateTime("2012-03-01");
$startDate = new DateTime("2012-02-01 00:00:00");
$endDate = new DateTime("2012-04-30 23:59:59");

echo isDateBetweenDates($fromUser, $startDate, $endDate);

आप संभवतः इसे एक फ़ंक्शन में बदल देंगे जो तीन पैरामीटर लेता है, और एक बूलियन वापस लौटाता है। परीक्षण करना बहुत आसान होना चाहिए?
पुराना छिपकली

मैं कहूंगा कि फ़ंक्शन के 2012-02-01बीच सही होना चाहिए 2012-02-01 ... 2014-04-30 23:59:59
सलमान एक

2
मैं हमेशा DateTimeस्केच्य समय के कार्यों पर एहसान करता हूं जो PHP आउट-ऑफ-द-बॉक्स प्रदान करता है। इस चेक के भीतर प्रारंभ और समाप्ति तिथि को शामिल करने के लिए बहुत ही सरलता से वापसी मूल्यreturn $date >= $startDate && $date <= $endDate;
zanderwar

@zanderway आप एक "दिन" की तुलना करने के लिए चूक और सेकंड की तुलना नहीं कह रहे हैं? $ startDate में सेकंड निर्दिष्ट हैं, इसलिए मुझे आश्चर्य है कि क्या "> =" वास्तव में आवश्यक है?
पीजे ब्रूनेट

46

तुलना करने के लिए टाइमस्टैम्प में बदलना आवश्यक नहीं है, यह देखते हुए कि तार को 'YYYY-MM-DD' विहित प्रारूप में दिनांक के रूप में मान्य किया गया है।

यह परीक्षण काम करेगा:

( ( $date_from_user >= $start_date ) && ( $date_from_user <= $end_date ) )

दिया हुआ:

$start_date     = '2009-06-17';
$end_date       = '2009-09-05';
$date_from_user = '2009-08-28';

नोट: इस तरह की तुलना "गैर-वैध" तारीखों के लिए अनुमति देता है जैसे (32 दिसंबर) '2009-13-32' और अजीब रूप से तैयार किए गए तार के लिए '2009/3/3', जैसे कि एक स्ट्रिंग तुलना समतुल्य नहीं होगी एक तारीख या टाइमस्टैम्प तुलना। यह तभी कार्य करता है जब तार में दिनांक मान एक संवैधानिक और नस्लीय प्रारूप में होते हैं।

स्पष्ट रूप से विस्तृत, यहाँ एक नोट जोड़ने के लिए संपादित करें

तक लगातार महीने हमेशा दो अक्षरों का होना चाहिए, दिन हमेशा दो अक्षरों का होना चाहिए, और विभाजक वर्ण हमेशा एक पानी का छींटा होना चाहिए:, मैं उदाहरण है कि तार तुलना की जा रही समान प्रारूप में होना चाहिए के लिए मतलब है। हम मज़बूती से "तार" की तुलना नहीं कर सकते हैं जो चार चरित्र वर्ष, दो चरित्र माह, दो चरित्र दिन नहीं हैं। अगर हम एक चरित्र और तार में दो चरित्र महीने का मिश्रण था, उदाहरण के लिए, हम अप्रत्याशित परिणाम जब हम तुलना में प्राप्त होता है '2009-9-30'करने के लिए '2009-10-11'। हम मानवीय रूप से "9" को "10" से कम के रूप में देखते हैं, लेकिन एक स्ट्रिंग तुलना की तुलना '2009-9'में अधिक दिखाई देगा '2009-1'। जरूरी नहीं कि हमें डैश सेपरेटर कैरेक्टर हों; हम बस के रूप में मज़बूती से तार में तुलना कर सकते हैं'YYYYMMDD'प्रारूप; यदि कोई विभाजक चरित्र है, तो उसे हमेशा होना चाहिए और हमेशा एक जैसा होना चाहिए।

CANONICAL द्वारा , मेरा मतलब है कि एक प्रारूप जिसके परिणामस्वरूप तार क्रमबद्ध होंगे जो दिनांक क्रम में क्रमबद्ध होंगे। यही है, स्ट्रिंग में "वर्ष" पहले, फिर "महीना", फिर "दिन" का प्रतिनिधित्व होगा। हम मज़बूती से स्ट्रिंग की तुलना 'MM-DD-YYYY'प्रारूप में नहीं कर सकते , क्योंकि यह विहित नहीं है। एक स्ट्रिंग तुलना MM(महीने) की तुलना में YYYY(वर्ष ) इससे पहले कि स्ट्रिंग तुलना बाएं से दाएं काम करती है।) 'YYYY-MM-DD' स्ट्रिंग प्रारूप का एक बड़ा लाभ यह है कि यह विहित है; इस प्रारूप में दर्शाई गई तारीखों की तुलना स्ट्रिंग्स के रूप में की जा सकती है।

[परिशिष्ट]

यदि आप php टाइमस्टैम्प रूपांतरण के लिए जाते हैं, तो सीमाओं के बारे में जागरूक रहें।

कुछ प्लेटफार्मों पर, php 1970-01-01 और / या बाद में 2038-01-19 से पहले टाइमस्टैम्प मूल्यों का समर्थन नहीं करता है। (यह यूनिक्स टाइमस्टैम्प 32-बिट पूर्णांक की प्रकृति है।) बाद के संस्करणों pf php (5.3?) को संबोधित करना चाहिए।

टाइमज़ोन भी एक मुद्दा हो सकता है, अगर आप स्ट्रिंग से टाइमस्टैम्प और टाइमस्टैम्प से स्ट्रिंग में परिवर्तित होने पर उसी टाइमज़ोन का उपयोग करने के लिए सावधान नहीं हैं।

HTH


1
यह एक दिलचस्प है।
इयोनू जी। स्टेन

1
हालांकि बिना कास्टिंग के आप समस्याओं में भाग सकते हैं यदि $ date_from_user, या $ start_date, या $ end_date के मूल्य दिनांक नहीं हैं .. अर्थात $ end_date = 'Balh Blah' .. निश्चित रूप से सही ढंग से काम करेंगे
माइक दिनेस्कु

@ spencer7593, क्या आपके पास इस व्यवहार के लिए कुछ संदर्भ हैं?
इयोनू जी। स्टेन

2
मान्य करने के लिए आप चेकडेट () का उपयोग कर सकते हैं
meleyal

1
@ शेरगियो: हाँ, एक ही स्ट्रिंग तुलना समय के मूल्यों के लिए काम करती है, जब तक कि तार एक मानक विहित प्रारूप में होते हैं (यानी 24 घंटे की घड़ी, आधी रात को '00: 00: 00 'के रूप में दर्शाया जाता है, आधी रात से पहले का अंतिम रूप' 23:59:59 '। यह गारंटी देने के लिए कि स्ट्रिंग तुलना "काम" करेगी, आपको यह गारंटी देने की आवश्यकता है कि समय मान के स्ट्रिंग निरूपण एक गारंटीकृत प्रारूप में हैं।
spencer7593

4
$startDatedt = strtotime($start_date)
$endDatedt = strtotime($end_date)
$usrDatedt = strtotime($date_from_user)

if( $usrDatedt >= $startDatedt && $usrDatedt <= $endDatedt)
{
   //..falls within range
}

इसमें प्रारंभ दिनांक या अंतिम तिथि
TheTXI

ओपी ने समावेशी मैचों के लिए नहीं कहा।
जेरेमी लोगान

3

दोनों तिथियों को टाइमस्टैम्प में परिवर्तित करें

स्यूडोकोड:

if date_from_user > start_date && date_from_user < end_date
    return true

आप इसे संपादित करना चाह सकते हैं ताकि आप रेंज में start_date और end_date भी शामिल कर सकें। अभी अगर date_from_user बराबर है, तो इसे नहीं गिना जाएगा।
TheTXI

ओपी ने समावेशी या अनन्य सीमाओं को निर्दिष्ट नहीं किया, इसलिए मैं इसे छोड़ दूंगा कि कौन सी रणनीति का उपयोग करना है
Glen

3

आपके द्वारा प्रदान किए गए प्रारूप में, यह मानते हुए कि उपयोगकर्ता आपको मान्य तिथियां देने के लिए पर्याप्त स्मार्ट है, आपको पहले किसी तिथि को बदलने की आवश्यकता नहीं है, आप उन्हें तार के रूप में तुलना कर सकते हैं।


1
इस बिंदु तक कोड में तिथियां पहले ही मान्य की जा चुकी हैं
meleyal

3
$start_date="17/02/2012";
$end_date="21/02/2012";
$date_from_user="19/02/2012";

function geraTimestamp($data)
{
    $partes = explode('/', $data); 
    return mktime(0, 0, 0, $partes[1], $partes[0], $partes[2]);
}


$startDatedt = geraTimestamp($start_date); 
$endDatedt = geraTimestamp($end_date);
$usrDatedt = geraTimestamp($date_from_user);

if (($usrDatedt >= $startDatedt) && ($usrDatedt <= $endDatedt))
{ 
    echo "Dentro";
}    
else
{
    echo "Fora";
}

2

उन्हें दिनांक या टाइमस्टैम्प पूर्णांक में परिवर्तित करें और फिर $ date_from_user की जांच करें <= $ end_date और> = $ start_date


3
क्या आप स्पष्ट कर सकते हैं कि 'उन्हें तिथियों में परिवर्तित करें'? आप वह कैसे करेंगें? मैंने सोचा कि PHP का कोई दिनांक प्रकार नहीं है?
meleyal

2

आप यह कोशिश कर सकते हैं:

//custom date for example
$d1 = new DateTime("2012-07-08");
$d2 = new DateTime("2012-07-11");
$d3 = new DateTime("2012-07-08");
$d4 = new DateTime("2012-07-15");

//create a date period object
$interval = new DateInterval('P1D');
$daterange = iterator_to_array(new DatePeriod($d1, $interval, $d2));
$daterange1 = iterator_to_array(new DatePeriod($d3, $interval, $d4));
array_map(function($v) use ($daterange1) { if(in_array($v, $daterange1)) print "Bingo!";}, $daterange);

1
संस्करण नोट: iterator_to_array()PHP 5.1
रैप्टर

0

मुझे यह तरीका सबसे आसान लगा:

$start_date = '2009-06-17';
$end_date = '2009-09-05';
$date_from_user = '2009-08-28';

$start_date = date_create($start_date);
$date_from_user = date_create($date_from_user);
$end_date = date_create($end_date);

$interval1 = date_diff($start_date, $date_from_user);
$interval2 = date_diff($end_date, $date_from_user);

if($interval1->invert == 0){
  if($interval2->invert == 1){

     // if it lies between start date and end date execute this code

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