सही ढंग से निर्धारित करें कि क्या तारीख स्ट्रिंग उस प्रारूप में एक वैध तारीख है


183

मुझे एक एपीआई से एक तारीख स्ट्रिंग मिल रही है, और यह रूप में स्वरूपित है yyyy-mm-dd

मैं वर्तमान में स्ट्रिंग प्रारूप को मान्य करने के लिए एक regex का उपयोग कर रहा हूं, जो ठीक काम करता है, लेकिन मैं कुछ मामलों को देख सकता हूं जहां यह स्ट्रिंग के अनुसार एक सही प्रारूप हो सकता है लेकिन वास्तव में एक अमान्य दिनांक है। यानी 2013-13-01, उदाहरण के लिए।

क्या PHP में एक बेहतर तरीका है जैसे कि एक स्ट्रिंग लें 2013-13-01और बताएं कि क्या यह प्रारूप के लिए वैध तिथि है या नहीं yyyy-mm-dd?



2
यहाँ उत्तर वैसे भी बेहतर है।
सेबस्टियन

जवाबों:


452

आप DateTimeइस उद्देश्य के लिए कक्षा का उपयोग कर सकते हैं :

function validateDate($date, $format = 'Y-m-d')
{
    $d = DateTime::createFromFormat($format, $date);
    // The Y ( 4 digits year ) returns TRUE for any integer with any number of digits so changing the comparison from == to === fixes the issue.
    return $d && $d->format($format) === $date;
}

[ इस उत्तर से लिया गया कार्य । Php.net पर भी । मूल रूप से Glavić द्वारा लिखित । ]


परीक्षण के मामलों:

var_dump(validateDate('2013-13-01'));  // false
var_dump(validateDate('20132-13-01')); // false
var_dump(validateDate('2013-11-32'));  // false
var_dump(validateDate('2012-2-25'));   // false
var_dump(validateDate('2013-12-01'));  // true
var_dump(validateDate('1970-12-01'));  // true
var_dump(validateDate('2012-02-29'));  // true
var_dump(validateDate('2012', 'Y'));   // true
var_dump(validateDate('12012', 'Y'));  // false

डेमो!


14
यदि आप PHP 5.2.x का उपयोग कर रहे हैं, तो आपको स्ट्रिंग की तारीख प्राप्त करने के लिए strtotimeयूनिक्स टाइमस्टैम्प का उपयोग करना चाहिए date('Y-m-d', $t)। फिर आप उनकी तुलना इस उत्तर की तरह करें।
पेड्रोनामेल

2
@pedromanoel: मानक डेटाटाइम इनपुट के लिए आप उपयोग कर सकते हैं strtotime, लेकिन गैर-मानक प्रारूपों के लिए जो strtotimeपहचान नहीं करता है, आपको कुछ अन्य समाधान की आवश्यकता होगी। और php संस्करण 5.2 समर्थन के लिए जनवरी 2011 को बंद कर दिया गया, 5.3 समर्थन के लिए अगस्त 2014 पर बंद कर दिया गया।
Glavić

2
इस तारीख पर विचार करेंvar_dump( validateDate('2012-2-9'));
शासन करें

4
फ़ंक्शन सही ढंग से काम करता है। यह गलत है क्योंकि आपके द्वारा निर्दिष्ट थ्रोट प्रारूप गलत था। यदि आप अग्रणी शून्य के बिना दिन और महीने का उपयोग करना चाहते हैं, तो प्रारूप 'Y-n-j'@reignsly होना चाहिए ।
अमल मुरली

1
@ एंटनीडायंड्रिया: नहीं, यह उस हिस्से के बिना काम नहीं करेगा। क्योंकि $dआप में यह गलत नहीं होगा कि यह तारीख दें, जिसमें 13 वें महीने (2013-13-01) जैसे ओवरफ्लो वाले हिस्से हैं। लेकिन यह वास्तव में निर्भर करता है कि आप क्या चाहते हैं। यदि आपको उदाहरण के validateDate('2015-55-66')लिए वैध होने की आवश्यकता है, तो हां, आपको केवल यह जांचने की आवश्यकता है $dकि वस्तु है या नहीं।
Glavić

81

निर्धारित करें कि क्या कोई स्ट्रिंग एक तारीख है

function checkIsAValidDate($myDateString){
    return (bool)strtotime($myDateString);
}

2
यह न केवल मान्य दिनांक स्वरूपों की एक पूरी श्रृंखला को मान्य करता है yyyy-mm-dd
EWit

10
@ मिचेलियर ऐसा इसलिए है क्योंकि php 2015-02-30एक वैध तारीख के रूप में देखता है क्योंकि जब दिया गया दिन दिए गए महीने (या नकारात्मक) php रोल की संख्या की तुलना में अगले महीने तक बढ़ जाता है। चूंकि तारीख की गारंटी है कि यह प्रारूप का है इसलिए yyyy-mm-ddइसे रिटर्न में बदलकर तय किया जा सकता है return (bool)strtotime($myDateString) && date("Y-m-d", strtotime($myDateString)) == $myDateString;
elitechief21

2
(bool)strtotime('s')सच क्यों निकलता है?
चपरासी

यह भी 1 checkIsAValidDate ("एफ") लौटाता है;
वैभव भानुशाली 16

हम $myDateString = str_replace("/", '-', $myDateString);वापसी से पहले उपयोग कर सकते हैं यदि दिनांक स्ट्रिंग में स्लैश (/) जैसे: - dd / mm / yyyy
यशराजसिंह जडेजा

37

Php prebuilt फ़ंक्शन के साथ सरल तरीके से उपयोग करें:

function checkmydate($date) {
  $tempDate = explode('-', $date);
  // checkdate(month, day, year)
  return checkdate($tempDate[1], $tempDate[2], $tempDate[0]);
}

परीक्षा

   checkmydate('2015-12-01'); //true
   checkmydate('2015-14-04'); //false

1
अच्छा सीधा समाधान, पहली बार काम किया, धन्यवाद :)
डेविड बेल

फिर से, एक परीक्षण का उपयोग करते समय, ifकेवल वापस लौटने के लिए trueया false, परीक्षण को स्वयं वापस करें।
विक्टर श्रोडर

4
यह मानता है कि $ tempDate सरणी में कम से कम 3 तत्व हैं।
person27 1

2
@ person27:return sizeof($tmpDate) == 3 && checkdate($tmpDate[1]...
न्यूरिनो

@vineet - यह विफल रहता है। साल है 2, 20, 202, 2020या यहां तक कि अगर साल है 20201- यह सच हर बार देता है।
rolinger

16

निर्धारित करें कि क्या स्ट्रिंग एक तारीख है, भले ही स्ट्रिंग एक गैर-मानक प्रारूप हो

(strtotime किसी भी कस्टम प्रारूप को स्वीकार नहीं करता है)

<?php
function validateDateTime($dateStr, $format)
{
    date_default_timezone_set('UTC');
    $date = DateTime::createFromFormat($format, $dateStr);
    return $date && ($date->format($format) === $dateStr);
}

// These return true
validateDateTime('2001-03-10 17:16:18', 'Y-m-d H:i:s');
validateDateTime('2001-03-10', 'Y-m-d');
validateDateTime('2001', 'Y');
validateDateTime('Mon', 'D');
validateDateTime('March 10, 2001, 5:16 pm', 'F j, Y, g:i a');
validateDateTime('March 10, 2001, 5:16 pm', 'F j, Y, g:i a');
validateDateTime('03.10.01', 'm.d.y');
validateDateTime('10, 3, 2001', 'j, n, Y');
validateDateTime('20010310', 'Ymd');
validateDateTime('05-16-18, 10-03-01', 'h-i-s, j-m-y');
validateDateTime('Monday 8th of August 2005 03:12:46 PM', 'l jS \of F Y h:i:s A');
validateDateTime('Wed, 25 Sep 2013 15:28:57', 'D, d M Y H:i:s');
validateDateTime('17:03:18 is the time', 'H:m:s \i\s \t\h\e \t\i\m\e');
validateDateTime('17:16:18', 'H:i:s');

// These return false
validateDateTime('2001-03-10 17:16:18', 'Y-m-D H:i:s');
validateDateTime('2001', 'm');
validateDateTime('Mon', 'D-m-y');
validateDateTime('Mon', 'D-m-y');
validateDateTime('2001-13-04', 'Y-m-d');

एक परीक्षण का उपयोग करते समय, ifबस के अंदर लौटने के लिए trueया false, परीक्षण को स्वयं वापस करें।
विक्टर श्रोडर

लेकिन 2018-3-24 असत्य लौट रहा है, विधि 2018-3-24 प्राप्त होती है, जब प्रारूप 2018-03-24 रिटर्न लागू होता है; मैं कैसे दो तरह से सही हो सकता हूं?
एक्विलेस पेरेज़

12

यह विकल्प न केवल सरल है, बल्कि लगभग किसी भी प्रारूप को स्वीकार करता है, हालांकि गैर-मानक प्रारूपों के साथ यह छोटी गाड़ी हो सकती है।

$timestamp = strtotime($date);
return $timestamp ? $date : null;

यह स्वीकृत उत्तर होना चाहिए था! बहुत, बहुत सरल।
वेबमास्टर जी

2
यह ध्यान रखें कि यह ब्रिटिश (d / m / Y) प्रारूप के साथ काम नहीं करेगा क्योंकि यह मान लेगा कि यह अमेरिकी (m / d / Y) को परिवर्तित कर रहा है। यह तभी काम करेगा जब दिन 12 से कम हो!
सिल्वेस्टर सरस्वस

@ गलकी - मैंने इसका परीक्षण किया और यह कुछ मूल्यों को विफल करती है। यदि $ तारीख = '202-03-31' यह सही है। लेकिन यह एक वैध तारीख नहीं है। मैंने पाया कि यदि आप वर्ष को गैर-वैध वर्ष में बदल देते हैं तो यह हमेशा सही रहता है।
rolinger

@rolinger अजीब ... शायद यह 202AD देख रहा है? किस वर्ष का टाइमस्टैम्प 'स्ट्रेटोटाइम' देता है?
गलकी

@galki - निश्चित नहीं है, लेकिन 202एक नकारात्मक संख्या लौटाता है - जो अभी भी परीक्षण पास करता है।
rolinger

9

आप महीने की तारीख और वर्ष के लिए भी पार्स कर सकते हैं और फिर आप PHP फ़ंक्शन का उपयोग checkdate()कर सकते हैं जिसे आप यहां पढ़ सकते हैं: http://php.net/manual/en/function.checkdate.php

आप इसे भी आजमा सकते हैं:

$date="2013-13-01";

if (preg_match("/^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/",$date))
    {
        echo 'Date is valid';
    }else{
        echo 'Date is invalid';
    }

के मामले में (जैसा कि elitechief21 द्वारा टिप्पणी की गई है) फ़ंक्शन isValidDate ($ तारीख) {वापसी preg_match ("/ ^ [0-9] {4} - (0 [1-9] | 1 [0-2]) - (0) [1-9] | [1-2] [0-9] | 3 [0-1]) $ / ", $ तारीख) और& तारीख (" Ymd ", strtotime ($ date)) == $ तारीख; }
पेटुलावूड

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

9

यह जांचने का सबसे आसान तरीका है कि यदि दी गई तारीख वैध है, तो संभवतः इसका उपयोग करते हुए इसे यूनीटाइम में परिवर्तित कर दिया जाए strtotime, इसे दिए गए दिनांक के प्रारूप में स्वरूपित कर, फिर इसकी तुलना करें:

function isValidDate($date) { return date('Y-m-d', strtotime($date)) === $date; }

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


1
मुझे लगता है कि यह उत्तर बहुत कम गुणवत्ता वाला है, विशेष रूप से यह देखते हुए कि पहले से ही स्ट्रेटोटाइम उत्तर हैं।
ग्रम्प्युट्रॉन 19

4
यह सबसे छोटा उत्तर है और यह काम करता है। यह कहना थोड़ा कठोर है कि यह निम्न गुणवत्ता वाला है।
टिम रोजर्स

@ user4600953 - यह सबसे आसान है जो काम करता है। बहुत से लोग उपयोग करने के लिए कह रहे हैं checkdate()- लेकिन मुझे पता चल रहा है कि यदि वर्ष का कोई भी मूल्य हो, तो चेकडॉट विफल हो जाता है: 2, 20, 202, 2020, 20201- सभी सही हैं। मैं आपके समाधान के साथ जा रहा हूँ!
रॉलिंग

7

Cl-sah के उत्तर के साथ एकॉर्डिंग, लेकिन यह ध्वनि बेहतर, छोटी ...

function checkmydate($date) {
  $tempDate = explode('-', $date);
  return checkdate($tempDate[1], $tempDate[2], $tempDate[0]);
}

परीक्षा

checkmydate('2015-12-01');//true
checkmydate('2015-14-04');//false

यदि परीक्षण करने के लिए की आवश्यकता होगी count($tempDate) === 3, हालांकि
VDarricau

@Varricau नहीं तुम नहीं, चेकडैम बम होगा अगर वे गायब हैं, तो आप हर एक के लिए isset () लिख सकते हैं, लेकिन मैं बस चेतावनी को
दबाऊंगा

7

मेरे पास यह चीज है, यहां तक ​​कि PHP के साथ, मैं कार्यात्मक समाधान ढूंढना पसंद करता हूं । इसलिए, उदाहरण के लिए, @ मिगली द्वारा दिया गया उत्तर वास्तव में एक अच्छा, अत्यधिक लचीला और सुरुचिपूर्ण है।

लेकिन इसमें एक समस्या है: क्या होगा यदि आपको एक ही प्रारूप के साथ बहुत सारे डेटाइम तार को मान्य करने की आवश्यकता है? आपको सभी जगह प्रारूप को दोहराना होगा, जो DRY सिद्धांत के खिलाफ जाता है । हम प्रारूप को स्थिरांक में रख सकते हैं, लेकिन फिर भी, हमें हर फ़ंक्शन कॉल के तर्क के रूप में स्थिरांक को पास करना होगा।

लेकिन डर और नहीं! हम अपने बचाव के लिए करी का उपयोग कर सकते हैं ! PHP इस कार्य को सुखद नहीं बनाता है, लेकिन PHP के साथ करीने को लागू करना अभी भी संभव है:

<?php
function validateDateTime($format)
{
    return function($dateStr) use ($format) {
        $date = DateTime::createFromFormat($format, $dateStr);
        return $date && $date->format($format) === $dateStr;
    };
}

तो, हमने अभी क्या किया? मूल रूप से हमने फ़ंक्शन बॉडी को एक अनाम में लपेट दिया और इसके बजाय ऐसे फ़ंक्शन को वापस कर दिया। हम सत्यापन कार्य को इस तरह कह सकते हैं:

validateDateTime('Y-m-d H:i:s')('2017-02-06 17:07:11'); // true

हाँ, एक बड़ा अंतर नहीं है ... लेकिन असली शक्ति आंशिक रूप से लागू फ़ंक्शन से आती है , जिसे करी द्वारा संभव बनाया गया है:

// Get a partially applied function
$validate = validateDateTime('Y-m-d H:i:s');

// Now you can use it everywhere, without repeating the format!
$validate('2017-02-06 17:09:31'); // true
$validate('1999-03-31 07:07:07'); // true
$validate('13-2-4 3:2:45'); // false

कार्यात्मक प्रोग्रामिंग FTW!


2
एक भूस्खलन IMHO द्वारा सबसे अच्छा जवाब (अधिक से अधिक लचीलेपन के साथ ओपी की विशिष्ट समस्या को हल करता है और बाकी उत्तरों के रूप में कोड की समान मात्रा)
StubbornShowaGuy

IMHO यह वास्तव में बदसूरत प्रोग्रामिंग है, बस अपने मूल्यों को एक सरणी में रखें और उन्हें सत्यापित करने के लिए लूप करें, लेकिन कृपया ऐसा न करें!
टिम

मैं जिज्ञासु @Tim हूं, क्या आप हमें अपनी सरणी / पाश सत्यापन का उदाहरण दे सकते हैं?
विक्टर श्रोडर

5

मुझे डर है कि अधिकांश मतदान समाधान ( https://stackoverflow.com/a/19271434/3283279 ) ठीक से काम नहीं कर रहा है। चौथा परीक्षण मामला (var_dump (validateDate ('2012-2-25')); // गलत) गलत है। तिथि सही है, क्योंकि यह प्रारूप से मेल खाती है - मीटर एक महीने के साथ या अग्रणी शून्य के बिना अनुमति देता है (देखें: http://php.net/manual/en/datetime.createfromformat.php )। इसलिए एक तारीख 2012/02/25 प्रारूप में है Ymd और परीक्षण का मामला सही गलत नहीं होना चाहिए।

मेरा मानना ​​है कि बेहतर समाधान संभव त्रुटि का परीक्षण करने के लिए निम्नानुसार है:

function validateDate($date, $format = 'Y-m-d') {
    DateTime::createFromFormat($format, $date);
    $errors = DateTime::getLastErrors();

    return $errors['warning_count'] === 0 && $errors['error_count'] === 0;
}

3

इसके बारे में क्या खयाल है?

हम बस एक कोशिश-पकड़ ब्लॉक का उपयोग करते हैं।

$dateTime = 'an invalid datetime';

try {
    $dateTimeObject = new DateTime($dateTime);
} catch (Exception $exc) {
    echo 'Do something with an invalid DateTime';
}

यह दृष्टिकोण केवल एक दिनांक / समय प्रारूप तक सीमित नहीं है, और आपको किसी भी फ़ंक्शन को परिभाषित करने की आवश्यकता नहीं है।


यह डेटाइम मान के लिए काम नहीं करेगा 0000-00-00 00:00:00
नसीरुद्दीन VN

@ नसीरुद्दीन VN '0000-00-00 00:00:00'एक मान्य डेटाटाइम मान है। यह सिर्फ पहला मूल्य है। हालाँकि, डेटटाइम ऑब्जेक्ट की दिनांक गुण होगा '-0001-11-30 00:00:00'
जूलियन

1

परीक्षण रेगेक्स समाधान:

    function isValidDate($date)
    {
            if (preg_match("/^(((((1[26]|2[048])00)|[12]\d([2468][048]|[13579][26]|0[48]))-((((0[13578]|1[02])-(0[1-9]|[12]\d|3[01]))|((0[469]|11)-(0[1-9]|[12]\d|30)))|(02-(0[1-9]|[12]\d))))|((([12]\d([02468][1235679]|[13579][01345789]))|((1[1345789]|2[1235679])00))-((((0[13578]|1[02])-(0[1-9]|[12]\d|3[01]))|((0[469]|11)-(0[1-9]|[12]\d|30)))|(02-(0[1-9]|1\d|2[0-8])))))$/", $date)) {
                    return $date;
            }
            return null;
    }

यदि दिनांक अमान्य है या यह yyyy-mm-dd प्रारूप नहीं है, तो यह रिक्त हो जाएगा, अन्यथा यह दिनांक वापस कर देगा।



0
/*********************************************************************************
Returns TRUE if the input parameter is a valid date string in "YYYY-MM-DD" format (aka "MySQL date format")
The date separator can be only the '-' character.
*********************************************************************************/
function isMysqlDate($yyyymmdd)
{
    return checkdate(substr($yyyymmdd, 5, 2), substr($yyyymmdd, 8), substr($yyyymmdd, 0, 4)) 
        && (substr($yyyymmdd, 4, 1) === '-') 
        && (substr($yyyymmdd, 7, 1) === '-');
}

-1
    /**** date check is a recursive function. it's need 3 argument 
    MONTH,DAY,YEAR. ******/

    $always_valid_date = $this->date_check($month,$day,$year);

    private function date_check($month,$day,$year){

        /** checkdate() is a php function that check a date is valid 
        or not. if valid date it's return true else false.   **/

        $status = checkdate($month,$day,$year);

        if($status == true){

            $always_valid_date = $year . '-' . $month . '-' . $day;

            return $always_valid_date;

        }else{
            $day = ($day - 1);

            /**recursive call**/

            return $this->date_check($month,$day,$year);
        }

    }

1
बिना किसी स्पष्टीकरण के कोड बहुत उपयोगी नहीं है।
गर्ट अर्नोल्ड

-2

इसे आजमाइए:

$date = "2017-10-01";


function date_checker($input,$devider){
  $output = false;

  $input = explode($devider, $input);
  $year = $input[0];
  $month = $input[1];
  $day = $input[2];

  if (is_numeric($year) && is_numeric($month) && is_numeric($day)) {
    if (strlen($year) == 4 && strlen($month) == 2 && strlen($day) == 2) {
      $output = true;
    }
  }
  return $output;
}

if (date_checker($date, '-')) {
  echo "The function is working";
}else {
  echo "The function isNOT working";
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.