2011-03-22 10 views
9

Tôi đã phát triển trên php 5.3.php dateTime :: createFromFormat in 5.2?

Tuy nhiên, máy chủ sản xuất của chúng tôi là 5.2.6.

tôi đã được sử dụng

$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; 

Tuy nhiên chức năng mà không có sẵn trong 5.2

cách dễ nhất để làm được việc này (không có cơ hội nâng cấp php) là gì.

Trả lời

19

chỉ bao gồm các mã tiếp theo

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

Đây là một câu trả lời tuyệt vời. Nên thực sự nhận được nhiều upvotes! Cảm ơn – andreapier

+0

Hỗ trợ cho DateTime 'M': '' '$ schedule_format = str_replace (mảng ('M', 'Y', 'm', 'd', 'H', 'i', 'a'), mảng ('% b', '% Y', '% m', '% d', '% I', '% M', '% p'), $ dformat); '' ' – kenorb

+0

Có một lỗi nhỏ, vì 'H' nên được thay thế thành% H (định dạng 24 giờ), không phải% I (định dạng 12 giờ). Vì vậy, đây là dòng cải tiến: '' '$ schedule_format = str_replace (mảng ('M', 'Y', 'm', 'd', 'H', 'i', 'a'), mảng ('% b ','% Y ','% m ','% d ','% H ','% M ','% p '), $ dformat); '' ' – kenorb

9

strtotime kém khi đối mặt với D/M/Y và date_create_from_format không khả dụng, strptime có thể là hy vọng duy nhất của bạn ở đây. Nó làm một số điều khá cũ, giống như đối phó với những năm như thể họ là số năm kể từ năm 1900 và đối phó với tháng như thể tháng một là tháng không. Dưới đây là một số ví dụ mã khủng khiếp mà sử dụng sprintf để lắp ráp lại ngày vào một cái gì đó DateTime hiểu:

$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'); 

Nếu nó hoạt động, bạn sẽ thấy giống nhau, đúng ngày và thời gian in hai lần.

+0

ngoài sự tò mò, sự khác biệt giữa mã của bạn và 'else { $ schedule = str_replace ('/', '-', $ schedule); $ schedule = date ('Y-m-d H: i: s', strtotime ($ lịch)); } ' – Hailwood

+0

Đây có lẽ là giải pháp tốt nhất trừ khi bạn có thể kiểm soát nhiều hơn đầu vào và đảm bảo bạn đang sử dụng [Định dạng ngày và giờ được hỗ trợ] (http://www.php.net/manual/en/datetime.formats. php). – Jacob

+0

'strtotime' không hiểu D/M/Y. Nó chỉ có thể xử lý Y/M/D và M/D/Y. Nếu bạn cố gắng vượt qua một D/M/Y với nó, nó sẽ thất bại. 'strtotime ('20/02/2003 ')' trả về 'false'. Bạn sẽ phải vượt qua ''20 .03.2003'' (lưu ý các dấu chấm!) Để nhận dạng đó được nhận diện, không phải là định dạng ngày bạn mong đợi. – Charles

6

Tôi nghĩ rằng đó là sạch hơn nhiều để mở rộng các lớp DateTime và thực hiện createFromFormat() mình như thế này: -

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')); 

này sẽ làm việc trong tất cả các phiên bản của PHP > = 5.2.0.

Xem ở đây cho một bản demo http://3v4l.org/djucq

+0

Công trình này' FANTASTIC' cảm ơn bạn !! ! – degenerate

+0

Điều này không hoạt động ở 5.2.x với định dạng không phải là tiếng Anh thông thường như 'd/m/Y', nhưng nó hoạt động nếu bạn thay thế '/' bằng '-'. – morgar

+0

Như 5.2.x đạt [EOL] (http://php.net/eol.php) gần 6 năm trước, tôi không quá lo lắng về nó. Cảm ơn vì đã cho tôi biết. – 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 

tôi đã có vấn đề tương tự với máy chủ sản xuất tại 5.2, vì vậy tôi đã sử dụng datetime trên để tạo một đối tượng và sau đó thay đổi định dạng theo ý thích của mình như trên.

-1

Date and Time chỉ

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

ISO8601 không dấu hai chấm

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

ISO8601 với dấu hai chấm dạng

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

Salesforce ISO8601

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

Hy vọng điều này sẽ giúp bạn tiết kiệm thời gian!

+0

Chỉ cần đọc câu hỏi, xin vui lòng tha thứ cho tôi, có nghĩa là để đăng trên câu hỏi áp dụng nhưng đã vui mừng cuối cùng đã giải quyết vấn đề và không có ý tưởng làm thế nào để xóa này, xấu của tôi. –

0

Vì điều này không thực sự cho thấy cách chuyển đổi YYYY: DDD: HH: MM: SS thành giây bằng cách sử dụng tùy chọn "z", bạn phải tạo các hàm của riêng bạn để chuyển đổi DOY thành tháng và ngày trong tháng. Đây là những gì tôi đã làm:

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>"; 

Kết quả đầu ra trên trang cho thấy nó hoạt động vì tôi có thể chuyển đổi lại giây thành giá trị nhập ban đầu. unix giây: 1483140203 12/30/2016 23:23:23

Các vấn đề liên quan