2011-03-22 14 views
9

मैं PHP 5.3 पर विकसित कर रहा हूं।php dateTime :: 5.2 में createFromFormat?

हालांकि हमारा उत्पादन सर्वर 5.2.6 है।

मैं

$schedule = '31/03/2011 01:22 pm'; // example input 
if (empty($schedule)) 
    $schedule = date('Y-m-d H:i:s'); 
else { 
    $schedule = dateTime::createFromFormat('d/m/Y h:i a', $schedule); 
    $schedule = $schedule->format('Y-m-d H:i:s'); 
} 
echo $schedule; 

उपयोग किया गया है हालांकि कि समारोह 5.2

में उपलब्ध नहीं है क्या सबसे आसान तरीका है (एक php उन्नयन का कोई मौका नहीं) इस के आसपास पाने के लिए है।

उत्तर

19

बस अगले कोड शामिल

function DEFINE_date_create_from_format() 
    { 

function date_create_from_format($dformat, $dvalue) 
    { 

    $schedule = $dvalue; 
    $schedule_format = str_replace(array('Y','m','d', 'H', 'i','a'),array('%Y','%m','%d', '%I', '%M', '%p') ,$dformat); 
    // %Y, %m and %d correspond to date()'s Y m and d. 
    // %I corresponds to H, %M to i and %p to a 
    $ugly = strptime($schedule, $schedule_format); 
    $ymd = sprintf(
     // This is a format string that takes six total decimal 
     // arguments, then left-pads them with zeros to either 
     // 4 or 2 characters, as needed 
     '%04d-%02d-%02d %02d:%02d:%02d', 
     $ugly['tm_year'] + 1900, // This will be "111", so we need to add 1900. 
     $ugly['tm_mon'] + 1,  // This will be the month minus one, so we add one. 
     $ugly['tm_mday'], 
     $ugly['tm_hour'], 
     $ugly['tm_min'], 
     $ugly['tm_sec'] 
    ); 
    $new_schedule = new DateTime($ymd); 

    return $new_schedule; 
    } 
} 

if(!function_exists("date_create_from_format")) 
DEFINE_date_create_from_format(); 
+0

यह एक महान उत्तर है। वास्तव में अधिक upvotes मिलना चाहिए! धन्यवाद – andreapier

+0

डेटटाइम 'एम' के लिए समर्थन: '' '$ sched_format = str_replace (सरणी ('एम', 'वाई', 'एम', 'डी', 'एच', 'मैं', 'ए'), सरणी ('% बी', '% वाई', '% एम', '% डी', '% I', '% एम', '% पी'), $ dformat); '' – kenorb

+0

एक छोटी सी बग है, क्योंकि 'एच' को% H (24-घंटे प्रारूप) में बदल दिया जाना चाहिए, न कि% I (12-घंटे प्रारूप)। तो यहां बेहतर लाइन है: '' '$ sched_format = str_replace (सरणी ('एम', 'वाई', 'एम', 'डी', 'एच', 'मैं', 'ए'), सरणी ('% बी ','% वाई ','% एम ','% डी ','% एच ','% एम ','% पी '), $ dformat); '' – kenorb

9

क्योंकि strtotime डी/एम/वाई और date_create_from_format के साथ सामना करते समय खराब प्रदर्शन करता है, strptime आपकी एकमात्र उम्मीद हो सकती है। यह कुछ सुंदर पुरानीस्कूल चीजें करता है, जैसे वर्षों से निपटने की तरह, जैसे कि वे 1 9 00 से वर्षों की संख्या हैं और महीनों के साथ सौदा करते हैं जैसे कि जनवरी महीने शून्य था। यहाँ कुछ भयानक उदाहरण कोड sprintf का उपयोग करता है की तारीख कुछ में दिनांक समय समझता पुनः एकत्रित करने का है:

$schedule = '31/03/2011 01:22 pm'; 
// %Y, %m and %d correspond to date()'s Y m and d. 
// %I corresponds to H, %M to i and %p to a 
$ugly = strptime($schedule, '%d/%m/%Y %I:%M %p'); 
$ymd = sprintf(
    // This is a format string that takes six total decimal 
    // arguments, then left-pads them with zeros to either 
    // 4 or 2 characters, as needed 
    '%04d-%02d-%02d %02d:%02d:%02d', 
    $ugly['tm_year'] + 1900, // This will be "111", so we need to add 1900. 
    $ugly['tm_mon'] + 1,  // This will be the month minus one, so we add one. 
    $ugly['tm_mday'], 
    $ugly['tm_hour'], 
    $ugly['tm_min'], 
    $ugly['tm_sec'] 
); 
echo $ymd; 
$new_schedule = new DateTime($ymd); 
echo $new_schedule->format('Y-m-d H:i:s'); 

अगर यह काम करता है, तो आप एक ही है, सही दिनांक और समय दो बार मुद्रित देखना चाहिए।

+0

जिज्ञासा से बाहर, आपके कोड और 'else { $ शेड्यूल = str_replace ('/', '-', $ शेड्यूल) के बीच क्या अंतर है; $ शेड्यूल = तिथि ('वाई-एम-डी एच: आई: एस', स्ट्रेटोटाइम ($ शेड्यूल)); } ' – Hailwood

+0

यह शायद सबसे अच्छा समाधान है जब तक कि आप इनपुट पर अधिक नियंत्रण नहीं रख सकें और सुनिश्चित करें कि आप [समर्थित दिनांक और समय प्रारूप] (http://www.php.net/manual/en/datetime.formats) का उपयोग कर रहे हैं। php)। – Jacob

+0

'स्ट्रेटोटाइम' डी/एम/वाई को समझ में नहीं आता है। यह केवल वाई/एम/डी और एम/डी/वाई संभाल सकता है। यदि आप इसे डी/एम/वाई पास करने का प्रयास करते हैं, तो यह असफल हो जाएगा। 'स्ट्रेटोटाइम ('20/02/2003') 'रिटर्न' झूठा '। उस प्रारूप को पहचानने के लिए आपको '20 .03.2003 '' (डॉट्स नोट करें!) पास करना होगा, जो आपके द्वारा अपेक्षित दिनांक प्रारूप नहीं है। – Charles

6

मुझे लगता है कि यह बहुत क्लीनर है इस तरह अपने आप को दिनांक समय वर्ग का विस्तार करने और createFromFormat() लागू: -

class MyDateTime extends DateTime 
{ 
    public static function createFromFormat($format, $time, $timezone = null) 
    { 
     if(!$timezone) $timezone = new DateTimeZone(date_default_timezone_get()); 
     $version = explode('.', phpversion()); 
     if(((int)$version[0] >= 5 && (int)$version[1] >= 2 && (int)$version[2] > 17)){ 
      return parent::createFromFormat($format, $time, $timezone); 
     } 
     return new DateTime(date($format, strtotime($time)), $timezone); 
    } 
} 

$dateTime = MyDateTime::createFromFormat('Y-m-d', '2013-6-13'); 
var_dump($dateTime); 
var_dump($dateTime->format('Y-m-d')); 

यह पीएचपी के सभी संस्करणों में काम करेंगे > = 5.2.0।

एक डेमो http://3v4l.org/djucq

+0

यह काम करता है' फैंटास्टिक 'धन्यवाद !! ! – degenerate

+0

यह एक सामान्य गैर अंग्रेजी प्रारूप जैसे 'डी/एम/वाई' के साथ 5.2.x में काम नहीं करता है, लेकिन अगर आप '-' को '-' से बदलते हैं तो यह काम करता है। – morgar

+0

लगभग 6 साल पहले 5.2.x पहुंच गया [ईओएल] (http://php.net/eol.php) मैं इसके बारे में बहुत चिंतित नहीं हूं। वैसे भी मुझे बताने के लिए धन्यवाद। – vascowhite

-1
$your_datetime_object=new DateTime($date); 
$date_format_modified=date_format($your_datetime_object,'D M d Y');//Change the format of date time 

मैं 5.2 पर उत्पादन सर्वर के साथ इसी तरह की समस्या थी के लिए यहाँ देखें, तो मैं एक वस्तु बनाने के लिए और फिर जैसा कि ऊपर मेरी पसंद के हिसाब से स्वरूप बदलने के ऊपर datetime इस्तेमाल किया।

-1

दिनांक और समय केवल

$dateTime = DateTime::createFromFormat('Y-m-d\TH:i:s', '2015-04-20T18:56:42'); 

ISO8601 कोई कोलन

$dateTime = DateTime::createFromFormat('Y-m-d\TH:i:sO', '2015-04-20T18:56:42+0000'); 

कोलन के साथ ISO8601

$date = $dateTime->format('c'); 

Salesforce ISO8601 प्रारूप

DateTime::createFromFormat('Y-m-d\TH:i:s.uO', '2015-04-20T18:56:42.000+0000'); 

आशा है कि यह किसी को समय बचाएगा!

+0

बस प्रश्न पढ़ें, कृपया मुझे क्षमा करें, लागू प्रश्न पर पोस्ट करने के लिए, लेकिन इस मुद्दे को हल करने के लिए उत्साहित था और मुझे पता नहीं था कि यह कैसे खराब है, मेरे बुरे। –

0

चूंकि यह वास्तव में नहीं दिखा रहा है कि वाई वाई वाई वाई: डीडीडी: एचएच: एमएम: एसएस टाइम टू यूनिक्स सेकेंड "जेड" विकल्प का उपयोग करके आपको DOY को महीने में और महीने के महीने में बदलने के लिए अपने कार्यों को बनाना होगा। यह मैं क्या किया है:

function _IsLeapYear ($Year) 
{ 
    $LeapYear = 0; 
    # Leap years are divisible by 4, but not by 100, unless by 400 
    if (($Year % 4 == 0) || ($Year % 100 == 0) || ($Year % 400 == 0)) { 
     $LeapYear = 1; 
    } 
    return $LeapYear; 
} 

function _DaysInMonth ($Year, $Month) 
{ 

    $DaysInMonth = array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31); 

    return ((_IsLeapYear($Year) && $Month == 2) ? 29 : $DaysInMonth[$Month - 1]); 
} 

function yydddhhssmmToTime($Year, $DOY, $Hour, $Min, $Sec) 
{ 
    $Day = $DOY; 
    for ($Month = 1; $Day > _DaysInMonth($Year, $Month); $Month++) { 
    $Day -= _DaysInMonth($Year, $Month); 
    } 

    $DayOfMonth = $Day; 

    return mktime($Hour, $Min, $Sec, $Month, $DayOfMonth, $Year); 
} 

$timeSec = yydddhhssmmToTime(2016, 365, 23, 23, 23); 
$str = date("m/d/Y H:i:s", $timeSec); 
echo "unix seconds: " . $timeis . " " . $str ."<br>"; 

पृष्ठ पर उत्पादन अपने काम करने से पता चलता बाद से मैं मूल इनपुट मानों के लिए वापस सेकंड वापस बदल सकते हैं। यूनिक्स सेकंड: 1483140203 12/30/2016 23:23:23

संबंधित मुद्दे