2008-09-26 12 views
13

वहाँ देखने के लिए जाँच करने के लिए करता है, तो दिनांक/समय वैध आप इन जाँच करने के लिए आसान होगा लगता होगा है एक रास्ता है:php जांच, अजीब तारीख रूपांतरण

क्या वास्तव में हो जाता है मैं हूँ इस: में

echo date('Y-m-d', strtotime($date)); 

परिणाम: "1999/11/30",

है ना? मैं 0000-00-00 से 1999-11-30 तक गया ???

मुझे पता है कि मैं यह देखने के लिए तुलना कर सकता हूं कि तारीख उन मानों में से एक है जो मेरे पास है, लेकिन यह जांचने का एक बहुत ही मजबूत तरीका नहीं है। क्या यह देखने का कोई अच्छा तरीका है कि मेरे पास वैध दिनांक है या नहीं? किसी को भी यह जांचने के लिए एक अच्छा काम है?

संपादित करें: लोग पूछ रहे हैं मैं क्या चल रहा हूँ: चल रहा है पीएचपी 5.2.5 (CLI) (बनाया: Jul 23 2008 11:32:27) पर लिनक्स स्थानीय होस्ट 2.6.18-53.1.14.el5 # 1 एसएमपी बुध मार्च 5 11:36:49 ईएसटी 2008 i686 i686 i386 जीएनयू/लिनक्स

+0

PHP का कौन सा संस्करण यह है? – Swati

+0

इसे आज़माएं: http://php.net/manual/en/function.checkdate.php –

+0

स्ट्रेटोटाइम ("0000-00-00 00:00:00") 32 बिट सिस्टम पर गलत लौटाता है। \t स्ट्रेटोटाइम ("0000-00-00 00:00:00") 64 बिट सिस्टम पर -62169955200 रिटर्न। –

उत्तर

22

php.net से

<?php 
function isValidDateTime($dateTime) 
{ 
    if (preg_match("/^(\d{4})-(\d{2})-(\d{2}) ([01][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])$/", $dateTime, $matches)) { 
     if (checkdate($matches[2], $matches[3], $matches[1])) { 
      return true; 
     } 
    } 

    return false; 
} 
?> 
2

गूंज दिनांक ('वाईएम-डी', स्ट्रेटोटाइम ($ तारीख));

परिणामों में: "1999/11/30"

strtotime का परिणाम 943,920,000 है - यह सेकंड, मोटे तौर पर की संख्या है, Unix epoch 1999- करने के लिए (स्थान है जहाँ से समय मापा जाता है) के बीच 11-30।

वहाँ एक प्रलेखित mysql bugmktime(), localtime(), strtotime() पर सभी इस अजीब मूल्य लौटने जब आप (सहित "0000-00-00 00:00:00") एक पूर्व युग समय की कोशिश है।

के बाद से समय स्टाम्प 1970 से शुरू कर दिया है, मुझे नहीं लगता कि यह वैसे भी में काम करने की अपेक्षा की है: जुड़े हुए धागे पर कुछ बहस है कि क्या यह वास्तव में एक बग है के रूप में नहीं है।

नीचे एक समारोह है कि मैं "0000-00-00 00:00 परे तुलना, आदि के लिए एक टाइमस्टैम्प है, जो आप करने के लिए कुछ काम का हो सकता है इस तरह के ऊपर के रूप में datetimes परिवर्तित दिनांकों के लिए उपयोग करते हैं: 00 "

/** 
* Converts strings of the format "YYYY-MM-DD HH:MM:SS" into php dates 
*/ 
function convert_date_string($date_string) 
{ 
    list($date, $time) = explode(" ", $date_string); 
    list($hours, $minutes, $seconds) = explode(":", $time); 
    list($year, $month, $day) = explode("-", $date); 
    return mktime($hours, $minutes, $seconds, $month, $day, $year); 
} 
+0

मैंने तिथि ('वाईएम-डी', कन्वर्ट_डेट_स्ट्रिंग ('0000-00-00 00:00:00') की कोशिश की) लेकिन फिर भी 1 999 की तारीख – SeanDowney

+0

को PHP में समय-आधारित कार्यों के अजीब व्यवहार पर PHP बग रिपोर्ट मिली 0000-00 .. मूल्य के लिए। उस धागे पर कुछ बहस है कि यह वास्तव में एक बग है, जैसे कि लोग कभी भी 1 9 70 से पहले की तारीख की गणना करना चाहते हैं! – ConroyP

+0

यह कोई बग नहीं है: https://bugs.php.net/bug.php?id=45647 – Izkata

1

सुसंगत परिणाम उम्मीद मत कीजिए जब आप सीमा से बाहर कर रहे हैं:

सीएफ strtotime

सीएफ Gnu Calendar-date-items .html

"सांख्यिक महीनों के लिए, आईएसओ 8601 प्रारूप 'साल के महीने दिन' की अनुमति दी है, जहां साल किसी भी धनात्मक संख्या है, महीने एक है 01 और 12, और दिन के बीच संख्या संख्या 01 और 31 के बीच संख्या है।एक आगे शून्य के मौजूद होने पर एक संख्या दस से भी कम है होना चाहिए। "

तो '0000-00-00' अजीब परिणाम देता है, जो तार्किक है!


" इसके अतिरिक्त, सभी प्लेटफ़ॉर्म नकारात्मक टाइमस्टैम्प का समर्थन करते हैं, इसलिए आपकी दिनांक सीमा हो सकती है जो यूनिक्स युग से पहले तक सीमित नहीं है। इसका मतलब है कि उदा। % ई,% टी,% R और% विकास तथा दिनांकों जनवरी 1, 1970 से पहले विंडोज पर काम नहीं करेगा, कुछ लिनक्स वितरण, और कुछ अन्य ऑपरेटिंग सिस्टम (वहाँ अधिक हो सकता है)। "

सीएफ strftime


उपयोग checkdate समारोह के बजाय (और अधिक मजबूत):

महीने: महीने 1 और 12 के बीच के बीच है।

दिन: दिन महीने के लिए दिन की अनुमति संख्या के भीतर है। लीप वर्ष पर विचार किया जाता है।

वर्ष: वर्ष 1 और 32767 समावेशी के बीच है।

1

यदि आप बस एक MySQL दिनांक फ़ील्ड के लिए बिना दिनांक रूपांतरण को संभालना चाहते हैं, तो आप इस महान कोड को मेरे द्वारा संशोधित कर सकते हैं। इस फ़ंक्शन को निष्पादित किए बिना PHP के मेरे संस्करण पर मुझे हर बार "0000-00-00" मिलता है। कष्टप्रद। फ़ील्ड को रिक्त होना करने के लिए

function ConvertDateString ($DateString) 
{ 
    list($year, $month, $day) = explode("-", $DateString); 
    return date ("Y-m-d, mktime (0, 0, 0, $month, $day, $year)); 
} 
1

इस संस्करण की अनुमति देता है dd/mm/yy या dd/mm/yyyy प्रारूप में दिनांक है, एकल अंक घंटे के लिए अनुमति देते हैं, वैकल्पिक AM/PM कहते हैं, और कुछ सूक्ष्म खामियों को सही समय मैच में।

अभी भी कुछ रोगजनक समय जैसे '23: 14 पूर्वाह्न 'की अनुमति देता है।

function isValidDateTime($dateTime) { 
    if (trim($dateTime) == '') { 
     return true; 
    } 
    if (preg_match('/^(\d{1,2})\/(\d{1,2})\/(\d{2,4})(\s+(([01]?[0-9])|(2[0-3]))(:[0-5][0-9]){0,2}(\s+(am|pm))?)?$/i', $dateTime, $matches)) { 
     list($all,$mm,$dd,$year) = $matches; 
     if ($year <= 99) { 
      $year += 2000; 
     } 
     return checkdate($mm, $dd, $year); 
    } 
    return false; 
} 
-1
<?php 

function is_date($str) { 
    $stamp = strtotime($str); 

    if (!is_numeric($stamp)) { 
     return FALSE; 
    } 
    $month = date('m', $stamp); 
    $day = date('d', $stamp); 
    $year = date('Y', $stamp); 

    if (checkdate($month, $day, $year)) { 
     return TRUE; 
    } 
    return FALSE; 
} 
?> 
+1

यह 31 अगस्त या 31 अप्रैल को कुछ किनारे के मामलों के साथ काम नहीं करता है। उदाहरण के लिए दिनांक ("वाई-एम-डी", स्ट्रेटोटाइम ("31.2.2012")) "2012-03-02" में परिणाम होता है जो चेकडेट सत्यापन को पास करता है भले ही उपयोगकर्ता ने वैध दिनांक इनपुट नहीं किया हो। –

0

मैं सिर्फ बदलते दिया है मार्टिन ऊपर का जवाब है, जो तारीख में किसी भी प्रकार को मान्य और प्रारूप आप की तरह में वापस आ जाएगी।

स्क्रिप्ट स्ट्रैटाइम ("10-10-2012", स्ट्रेटोटाइम ($ डीटी)) की नीचे पंक्ति संपादित करके प्रारूप को बस बदलें;

<?php 
echo is_date("13/04/10"); 

function is_date($str) { 
    $flag = strpos($str, '/'); 

    if(intval($flag)<=0){ 
     $stamp = strtotime($str); 
    } else { 
     list($d, $m, $y) = explode('/', $str);  
     $stamp = strtotime("$d-$m-$y"); 
    } 
    //var_dump($stamp) ; 

    if (!is_numeric($stamp)) { 
     //echo "ho" ; 
     return "not a date" ;   
    } 

    $month = date('n', $stamp); // use n to get date in correct format 
    $day = date('d', $stamp); 
    $year = date('Y', $stamp); 

    if (checkdate($month, $day, $year)) { 
     $dt = "$year-$month-$day" ; 
     return strftime("%d-%b-%Y", strtotime($dt)); 
     //return TRUE; 
    } else { 
     return "not a date" ; 
    } 
} 
?> 
0
<?php 
function is_valid_date($user_date=false, $valid_date = "1900-01-01") { 
    $user_date = date("Y-m-d H:i:s",strtotime($user_date)); 
    return strtotime($user_date) >= strtotime($valid_date) ? true : false; 
} 

echo is_valid_date("00-00-00") ? 1 : 0; // return 0 

echo is_valid_date("3/5/2011") ? 1 : 0; // return 1 
+1

जो "हालिया" तिथियों के लिए काम करेगा, लेकिन अगर मेरे पास शुरुआती नब्बे की तारीख है तो यह हमेशा झूठी – SeanDowney

+0

@SeanDowney संपादित हो जाएगी, जो आपकी "शुरुआती नब्बे के दिनांक" के लिए सत्य वापस आना चाहिए। – Josue

5

यहाँ उल्लेख किया है: https://bugs.php.net/bug.php?id=45647

यहाँ कोई बग है, 00-00-00 का मतलब 2000-00-00, जो 1999-12-00 है, है जो 1999/11/30। कोई बग, बिल्कुल सामान्य नहीं।

और के रूप में कुछ परीक्षण के साथ दिखाया गया, रोलिंग पीछे की ओर सामान्य व्यवहार है, अगर एक छोटे से बेचैन:

>> date('Y-m-d', strtotime('2012-03-00')) 
string: '2012-02-29' 
>> date('Y-m-d', strtotime('2012-02-00')) 
string: '2012-01-31' 
>> date('Y-m-d', strtotime('2012-01-00')) 
string: '2011-12-31' 
>> date('Y-m-d', strtotime('2012-00-00')) 
string: '2011-11-30' 
+0

यिक्स! यह थोड़ा पागल है, लेकिन इसके बारे में पता होना अच्छा है – SeanDowney

0

मैं ExtJS अनुप्रयोगों से आ रही दिनांकों को मान्य करने के लिए निम्न कोड का इस्तेमाल किया है।

function check_sql_date_format($date) { 
    $date = substr($date, 0, 10); 
    list($year, $month, $day) = explode('-', $date); 
    if (!is_numeric($year) || !is_numeric($month) || !is_numeric($day)) { 
     return false; 
    } 
    return checkdate($month, $day, $year); 
} 
संबंधित मुद्दे