Strtotime () dd / mm / YYYY प्रारूप के साथ काम नहीं करता है


167

मैं वास्तव में strtotime()फ़ंक्शन को पसंद करता हूं , लेकिन उपयोगकर्ता मैनुअल समर्थित तिथि स्वरूपों का पूरा विवरण नहीं देता है। strtotime('dd/mm/YYYY')काम नहीं करता है, यह केवल mm/dd/YYYYप्रारूप के साथ काम करता है ।

अगर मेरे पास dd/mm/YYYYप्रारूप में तारीख है , तो मैं इसे कैसे बदल सकता हूं YYYY-mm-dd? मैं explode()फ़ंक्शन का उपयोग करके कर सकता हूं , लेकिन मुझे लगता है कि बेहतर समाधान हैं।


7
आपको इसे पार्स करने के लिए वास्तव में इसे "YYYY-mm-dd" प्रारूप में बदलने की आवश्यकता नहीं है - आपको इसे "dd-mm-YYYY" में बदलने की आवश्यकता है, जिसके साथ किया जा सकता हैstr_replace('/', '-', $date);
Gavin Coates

जवाबों:


399

यहाँ सरलीकृत समाधान है:

$date = '25/05/2010';
$date = str_replace('/', '-', $date);
echo date('Y-m-d', strtotime($date));

परिणाम:

2010-05-25

strtotimeप्रलेखन पढ़ता है:

में दिनांक d / m / y या DMY प्रारूपों विभिन्न घटकों के बीच विभाजक को देखकर disambiguated कर रहे हैं: यदि विभाजक एक स्लेश है ( / ), तो अमेरिकी d / m / y मान लिया जाता है; जबकि यदि विभाजक पानी का छींटा ( - ) या डॉट ( ) है, तो यूरोपीय डमी प्रारूप मान लिया गया है।


2
@Web लॉजिक मैं strtotime () फ़ंक्शन के डिफ़ॉल्ट प्रारूप को समझ नहीं सकता, अगर मैं strtotimr ('01 -01-2010 ') लिखता हूं, तो यह इसे dd-mm-YYYY या mm-dd-YYYY प्रारूप के रूप में समझता है?
सिमोन

3
यदि आप इसके साथ परीक्षण करते हैं: echo date('Y-m-l', strtotime('01-01-2010'));परिणाम है 2010-01-Friday। तो अंत में आने वाला दिन, इस बात पर निर्भर करता है कि आप dateफ़ंक्शन को दिनांक प्रारूप कैसे निर्दिष्ट करते हैं ।

1
जबकि आपने यहां जो पोस्ट किया है वह सही है और उपयोगकर्ताओं के सवाल का जवाब देता है - यह वास्तविक समस्या को हल करने का एक गोल चक्कर है। स्ट्रेटोटाइम () के लिए प्रारूप "dd / mm / yy" में किसी तिथि को ठीक से पार्स करने के लिए, आपको "/" को "-" से बदलना होगा। इसलिए आपको केवल उत्तर की पहली दो पंक्तियों की आवश्यकता है: $date = '25/05/2010'; $date = str_replace('/', '-', $date); आपकी समस्या को हल करने के लिए अतिरिक्त पंक्ति आवश्यक नहीं है।
गाविन

यह तभी सही है जब दिन> 12: $ तारीख = '1/2/34' हो; // फ़रवरी 2034 की प्रतिध्वनि की तारीख ('डी एम वाई', स्ट्रेटोटाइम ($ तारीख)); // ०२ जनवरी २०३४
कुरुदत्त ५

धन्यवाद दोस्त। सचमुच मेरा दिन बन गया।
बिंगप्रभू

64

आप DateTime :: createFromFormat के साथ कस्टम प्रारूप (PHP 5.3 के रूप में) से दिनांक पार्स कर सकते हैं

$timestamp = DateTime::createFromFormat('!d/m/Y', '23/05/2010')->getTimestamp();

(एक तरफ: !यूनिक्स टाइमस्टैम्प के लिए गैर-निर्दिष्ट मानों को रीसेट करने के लिए उपयोग किया जाता है, अर्थात समय मध्यरात्रि होगा।)


यदि आप PHP 5.3 का उपयोग नहीं करना चाहते (या नहीं कर सकते हैं), तो उपलब्ध दिनांक / समय स्वरूपों की पूरी सूची जो स्ट्रेटोटाइम स्वीकार करता है, दिनांक प्रारूप मैनुअल पेज पर सूचीबद्ध है । यह पृष्ठ उस तथ्य का अधिक अच्छी तरह से वर्णन करता है, जो कि m/d/Yअनुमान से अधिक है d/m/Y(लेकिन आप कर सकते हैं, जैसा कि यहां दिए गए उत्तर में बताया गया है, उपयोग d-m-Y, d.m.Yया d\tm\tY)।


अतीत में, मैंने str_replaceएक अन्य उत्तर में उल्लेखित क्विक का भी सहारा लिया है , साथ ही डेट स्ट्रिंग को किसी अन्य प्रारूप में स्वयं-पार्स करना जैसे

$subject   = '23/05/2010';
$formatted = vsprintf('%3$04d/%2$02d/%1$02d', sscanf($subject,'%02d/%02d/%04d'));
$timestamp = strtotime($formatted);

17

यह कई समस्याओं का एक अच्छा समाधान है:

function datetotime ($date, $format = 'YYYY-MM-DD') {

    if ($format == 'YYYY-MM-DD') list($year, $month, $day) = explode('-', $date);
    if ($format == 'YYYY/MM/DD') list($year, $month, $day) = explode('/', $date);
    if ($format == 'YYYY.MM.DD') list($year, $month, $day) = explode('.', $date);

    if ($format == 'DD-MM-YYYY') list($day, $month, $year) = explode('-', $date);
    if ($format == 'DD/MM/YYYY') list($day, $month, $year) = explode('/', $date);
    if ($format == 'DD.MM.YYYY') list($day, $month, $year) = explode('.', $date);

    if ($format == 'MM-DD-YYYY') list($month, $day, $year) = explode('-', $date);
    if ($format == 'MM/DD/YYYY') list($month, $day, $year) = explode('/', $date);
    if ($format == 'MM.DD.YYYY') list($month, $day, $year) = explode('.', $date);

    return mktime(0, 0, 0, $month, $day, $year);

}

16

STRTOTIME राइटअप नोट से:

M / d / y या dmy स्वरूपों में तिथियां अलग-अलग घटकों के बीच विभाजक को देखकर अव्यवस्थित होती हैं: यदि विभाजक स्लैश (/) है, तो अमेरिकी m / d / y मान लिया जाता है; जबकि यदि विभाजक पानी का छींटा (-) या डॉट (।) है, तो यूरोपीय डमी प्रारूप मान लिया गया है।

यह बहुत ही सरल है।


हम इसे लागू कर सकते हैं क्योंकि वे त्रुटि नहीं देंगे लेकिन जब मैंने जाँच की $tऔर $t1अलग परिणाम दिखा रहे हैं। मैंने ऐसे ही चेक किया। $t=strtotime(date('d-m-Y'));और $t1=strtotime(date('m/d/Y'));
vusan

3

सबसे तेज़ शायद होना चाहिए

false!== ($date !== $date=preg_replace(';[0-2]{2}/[0-2]{2}/[0-2]{2};','$3-$2-$1',$date))

यदि प्रारूप उचित नहीं लगता है तो यह गलत हो जाएगा, लेकिन यह उस तारीख की वैधता की जांच नहीं करेगा जो वैध है


2

मुझे बेहतर समाधान नहीं मिला है। आप उपयोग कर सकते हैं explode(), preg_match_all()आदि

मेरे पास इस तरह एक स्थिर सहायक कार्य है

class Date {

    public static function ausStrToTime($str) {
        $dateTokens = explode('/', $str);
        return strtotime($dateTokens[1] . '/' . $dateTokens[0] . '/' . $dateTokens[2]); 

    }

}

शायद इसके लिए एक बेहतर नाम है, लेकिन मैं उपयोग ausStrToTime()करता हूं क्योंकि यह ऑस्ट्रेलियाई तिथियों के साथ काम करता है (जो कि मैं अक्सर सौदा करता हूं, एक ऑस्ट्रेलियाई होने के नाते)। एक बेहतर नाम शायद मानकीकृत नाम होगा, लेकिन मुझे यकीन नहीं है कि वह क्या है।


2

मैंने ddmmyy फॉर्मेट को date("Y-m-d"फॉर्मेट में बदलने की कोशिश की लेकिन जब मैं सीधे पास हुआ तो काम नहीं कर रहा थाddmmyy =date('dmy')

तब एहसास हुआ कि यह yyyy-mm-dd प्रारूप में होना चाहिए। व्यवस्थित करने के लिए प्रतिस्थापन का उपयोग किया

$strParam = '20'.substr($_GET['date'], 4, 2).'-'.substr($_GET['date'], 2, 2).'-'.substr($_GET['date'], 0, 2);  

फिर पास किया गया date("Y-m-d",strtotime($strParam));

इसने काम कर दिया!


2

$srchDate = date_format(date_create_from_format('d/m/Y', $srchDate), 'Y/m/d');

यह आपके काम आएगा। आप स्ट्रिंग को एक कस्टम दिनांक स्वरूप में परिवर्तित करते हैं, जहाँ आप PHP को निर्दिष्ट कर सकते हैं कि स्ट्रिंग का मूल प्रारूप क्या है जो इसे दिया गया था। अब जब यह एक तारीख प्रारूप है, तो आप इसे PHP के डिफ़ॉल्ट तिथि प्रारूप में बदल सकते हैं, जो कि MySQL द्वारा उपयोग किया जाता है।


सबसे साफ और बेहतरीन समाधान
मार्को मार्सला

1

क्या आप डेटाबेस से यह मान प्राप्त कर रहे हैं? यदि हां, तो इसे डेटाबेस में प्रारूपित करने पर विचार करें ( date_formatउदाहरण के लिए mysql में उपयोग करें )। यदि नहीं, तो मान को विस्फोट करना सबसे अच्छा शर्त हो सकता है, क्योंकि स्ट्रेटोटाइम सिर्फ dd / mm / yyyy मूल्यों की सराहना नहीं करता है।


1

यदि आप जानते हैं कि यह dd / mm / YYYY में है, तो आप कर सकते हैं:

    $regex = '#([/d]{1,2})/([/d]{1,2})/([/d]{2,4})#';
    $match = array();
    if (preg_match($regex, $date, $match)) {
        if (strlen($match[3]) == 2) {
            $match[3] = '20' . $match[3];
        }
        return mktime(0, 0, 0, $match[2], $match[1], $match[3]);
    }
    return strtotime($date);

यह प्रपत्र d / m / YY या dd / mm / YYYY (या दोनों के किसी भी संयोजन) में दिनांक का मिलान करेगा ...

यदि आप सिर्फ / से अधिक विभाजकों का समर्थन करना चाहते हैं, तो आप regex को बदल सकते हैं:

    $regex = '#([\d]{1,2})[/-]([\d]{1,2})[/-]([\d]{2,4})#';

और फिर किसी भी वर्ण को आप [/-]बिट में जोड़ना चाहते हैं (ध्यान दें, - चरित्र को अंतिम होना चाहिए)


निश्चित रूप से अपने regex का उपयोग कर किया जाना चाहिए \dदशमलव अंक के बजाय [/d]के लिए आगे स्लैश या घ चरित्र
सुबह

1

यह समाधान सरल और विस्फोट से अधिक सुरुचिपूर्ण है:

$my_date = str_replace("/", ".", $my_date);
$my_date = strtotime($my_date);
$my_date = date("Y-m-d", $my_date);

आपको यह जानने की जरूरत नहीं है कि आप किस प्रारूप में तारीख प्राप्त कर रहे हैं, लेकिन अगर यह स्लैश के साथ आता है तो उन्हें पूर्ण स्टॉप से ​​बदल दिया जाता है और इसे स्ट्रेटोटाइम द्वारा यूरोपीय माना जाता है।


0

सबसे सरल उपाय यह है:

$date    = '07/28/2010';
$newdate = date('Y-m-d', strtotime($date));

3
ये गलत है। प्रश्न स्पष्ट रूप से dd / mm / yyyy इनपुट से संबंधित है।
मैट फ्लेचर

0

इस समाधान का उपयोग कर रहा हूँ, भले ही अग्रणी शून्य वहाँ हो।

<?php
 $date = '05/05/2017';
 $date = str_replace('/', '-', $date);
 $date = date('Y-m-d', strtotime($date));

 echo $date;
?>

0

$ date_info = '20 / 02/2019 '; इको डेट ('Ym-d', strtotime (str_replace ('/', '-', $ date_info)));


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