Strtotime () không hoạt động với định dạng dd / mm / YYYY


167

Tôi thực sự thích strtotime()chức năng này, nhưng hướng dẫn sử dụng không cung cấp mô tả đầy đủ về các định dạng ngày được hỗ trợ. strtotime('dd/mm/YYYY')không hoạt động, nó chỉ hoạt động với mm/dd/YYYYđịnh dạng.

Nếu tôi có ngày ở dd/mm/YYYYđịnh dạng, làm thế nào tôi có thể chuyển đổi nó thành YYYY-mm-dd? Tôi có thể làm điều đó bằng cách sử dụng explode()chức năng, nhưng tôi nghĩ có những giải pháp tốt hơn.


7
Bạn thực sự không cần phải chuyển đổi nó sang định dạng "YYYY-mm-dd" để phân tích cú pháp - bạn chỉ cần thay đổi nó thành "dd-mm-YYYY", có thể được thực hiện vớistr_replace('/', '-', $date);
Gavin Coates

Câu trả lời:


399

Đây là giải pháp đơn giản hóa:

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

Kết quả:

2010-05-25

Các strtotimetài liệu đọc:

Ngày ở các định dạng m / d / y hoặc dmy được định nghĩa bằng cách nhìn vào dấu phân cách giữa các thành phần khác nhau: nếu dấu phân cách là dấu gạch chéo ( / ), thì giả sử m / d / y của Mỹ ; trong khi nếu dấu phân cách là dấu gạch ngang ( - ) hoặc dấu chấm ( . ), thì định dạng dmy châu Âu được giả sử.


2
@Web Logic tôi không thể hiểu được định dạng mặc định của hàm strtotime (), nếu tôi viết strtotimr ('01 -01-2010 '), nó có hiểu định dạng dd-mm-YYYY hoặc mm-dd-YYYY không?
Simon

3
Nếu bạn kiểm tra nó với: echo date('Y-m-l', strtotime('01-01-2010'));Kết quả là 2010-01-Friday. Vì vậy, ngày đến cuối cùng, tùy thuộc vào cách bạn chỉ định định dạng ngày cho datechức năng.

1
Mặc dù những gì bạn đã đăng ở đây là chính xác và trả lời câu hỏi của người dùng - đó là một cách giải quyết vấn đề thực tế. Để strtotime () phân tích đúng ngày theo định dạng "dd / mm / yy", bạn cần thay thế "/" bằng "-". Do đó, bạn chỉ thực sự cần hai dòng đầu tiên của câu trả lời: $date = '25/05/2010'; $date = str_replace('/', '-', $date); Dòng bổ sung là không cần thiết để giải quyết vấn đề của bạn.
Gavin Coates

Điều này chỉ đúng nếu ngày> 12: $ date = '1/2/34'; // Ngày 1 tháng 2 năm 2034 tiếng vang ('d M Y', strtotime ($ date)); // 02 tháng 1 năm 2034
Kurdtpage

Cảm ơn, bạn đời. Thực sự làm cho ngày của tôi.
BEingprabhU

64

Bạn có thể phân tích ngày từ một định dạng tùy chỉnh (kể từ PHP 5.3) với DateTime :: createFromFormat

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

(Ngoài ra: !Được sử dụng để đặt lại các giá trị không được chỉ định cho dấu thời gian Unix, tức là thời gian sẽ là nửa đêm.)


Nếu bạn không muốn (hoặc không thể) sử dụng PHP 5.3, thì danh sách đầy đủ các định dạng ngày / giờ khả dụng mà strtotime chấp nhận được liệt kê trên trang hướng dẫn Định dạng ngày . Trang đó mô tả kỹ hơn thực tế m/d/Yđược suy luận d/m/Y(nhưng bạn có thể, như được đề cập trong các câu trả lời ở đây, sử dụng d-m-Y, d.m.Yhoặc d\tm\tY).


Trước đây, tôi cũng đã sử dụng cách nhanh chóng str_replaceđược đề cập trong một câu trả lời khác, cũng như tự phân tích chuỗi ngày thành định dạng khác như

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

17

Đây là một giải pháp tốt cho nhiều vấn đề:

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

Từ ghi chú STRTOTIME Lưu ý:

Ngày ở các định dạng m / d / y hoặc dmy được định nghĩa bằng cách nhìn vào dấu phân cách giữa các thành phần khác nhau: nếu dấu phân cách là dấu gạch chéo (/), thì giả sử m / d / y của Mỹ; trong khi nếu dấu phân cách là dấu gạch ngang (-) hoặc dấu chấm (.), thì định dạng dmy châu Âu được giả sử.

Nó đơn giản như vậy.


Chúng tôi có thể thực hiện điều đó vì họ sẽ không đưa ra lỗi nhưng khi tôi kiểm tra $t$t1đang hiển thị kết quả khác nhau. Tôi đã kiểm tra như thế này. $t=strtotime(date('d-m-Y'));$t1=strtotime(date('m/d/Y'));
vusan

3

nhanh nhất có lẽ nên

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

điều này sẽ trả về false nếu định dạng không giống với định dạng thích hợp, nhưng nó sẽ không kiểm tra xem ngày có hợp lệ không


2

Tôi đã không tìm thấy một giải pháp tốt hơn. Bạn có thể sử dụng explode(), preg_match_all()vv

Tôi có một chức năng trợ giúp tĩnh như thế này

class Date {

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

    }

}

Có lẽ có một cái tên tốt hơn cho điều đó, nhưng tôi sử dụng ausStrToTime()vì nó hoạt động với các ngày ở Úc (mà tôi thường đối phó, là một người Úc). Một cái tên tốt hơn có lẽ sẽ là tên được tiêu chuẩn hóa, nhưng tôi không chắc đó là cái gì.


2

Tôi đã cố gắng chuyển đổi định dạng ddmmyy sang date("Y-m-d"định dạng nhưng không hoạt động khi tôi trực tiếp vượt quaddmmyy =date('dmy')

sau đó nhận ra nó phải ở định dạng yyyy-mm-dd. sử dụng chuỗi con để tổ chức

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

sau đó được chuyển qua date("Y-m-d",strtotime($strParam));

nó đã làm việc!


2

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

Điều này sẽ làm việc cho bạn. Bạn chuyển đổi Chuỗi thành định dạng ngày tùy chỉnh trong đó bạn có thể chỉ định cho PHP định dạng ban đầu của Chuỗi là gì đã được cung cấp cho chuỗi đó. Bây giờ nó là định dạng ngày, bạn có thể chuyển đổi nó sang định dạng ngày mặc định của PHP, giống như định dạng được sử dụng bởi MySQL.


giải pháp sạch nhất và tốt nhất
Marco Marsala

1

Bạn có nhận được giá trị này từ cơ sở dữ liệu? Nếu vậy, hãy xem xét định dạng nó trong cơ sở dữ liệu ( date_formatví dụ sử dụng trong mysql). Nếu không, nổ tung giá trị có thể là đặt cược tốt nhất, vì strtotime dường như không đánh giá cao các giá trị dd / mm / yyyy.


1

Nếu bạn biết nó bằng dd / mm / YYYY, bạn có thể làm:

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

Nó sẽ khớp với ngày ở dạng d / m / YY hoặc dd / mm / YYYY (hoặc bất kỳ kết hợp nào của cả hai) ...

Nếu bạn muốn hỗ trợ nhiều dấu phân cách hơn chỉ /, bạn có thể thay đổi biểu thức chính thức thành:

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

Và sau đó thêm bất kỳ ký tự nào bạn muốn vào [/-]bit (Lưu ý, ký tự - cần phải là cuối cùng)


Chắc chắn regex của bạn nên được sử dụng \dcho các chữ số thập phân chứ không phải [/d]cho ký tự gạch chéo hoặc ký tự d .
chào mừng

1

Cách giải quyết này đơn giản và thanh lịch hơn là phát nổ:

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

Bạn không cần phải biết định dạng ngày bạn nhận được là gì, nhưng nếu nó đi kèm với dấu gạch chéo thì chúng được thay thế bằng các điểm dừng hoàn toàn và nó được coi là châu Âu theo strtotime.


0

Giải pháp đơn giản nhất là:

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

3
Cái này sai. Câu hỏi liên quan rõ ràng đến đầu vào dd / mm / yyyy.
Matt Fletcher

0

Đây là giải pháp tôi đang sử dụng ngay cả khi số 0 đứng đầu.

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

 echo $date;
?>

0

$ date_info = '20 / 02/2019 '; ngày echo ('Ym-d', strtotime (str numplace ('/', '-', $ date_info)));


0

Đơn giản như thế này

date('Y-m-d H:i:s', strtotime( str_replace('/', '-', $from_date ) ) );
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.