2013-03-28 21 views
11

Tôi có một hình thức mà trong đó một ngày là đầu vào ở định dạng Vương quốc Anh, và tôi cần phải chuyển nó sangngày Định dạng dd/mm/yyyy để yyyy-mm-dd PHP

yyyy-mm-dd 

ví dụ một ngày được nhập là: 31/03/2013 mà tôi muốn chuyển đổi thành '2013-03-31' để chèn cơ sở dữ liệu.

Tôi đang sử dụng sau đó kỳ lạ chỉ hoạt động đôi khi:

$dateInput = $mysqli->real_escape_string($_POST['date']); 
$show_date = date('Y-m-d', strtotime($dateInput)); 

Có cách nào tốt hơn để làm điều này?

+0

Tại sao bạn thoát giá trị ngày .... thực sự có phục vụ bất kỳ mục đích nào không? –

+0

Khi nào điều này không hoạt động đúng? Ngoài ra, thoát không có vẻ là một ý tưởng tốt (hoặc ít nhất nó có vẻ vô ích nếu định dạng ngày là chính xác). Có lẽ bạn nên cân nhắc sử dụng regex để kiểm tra định dạng ban đầu. – Uby

+1

@ Darren lý do điều này đôi khi không hoạt động vì PHP dự kiến ​​ngày ở định dạng Hoa Kỳ. Bạn phải sắp xếp lại nó trước khi giao nó cho 'strtotime()', nếu có. http://stackoverflow.com/questions/4163641/php-using-strtotime-with-a-uk-date-format-dd-mm-yy – Tushar

Trả lời

15

Bạn có thể muốn sử dụng DateTime::createFromFormat:

$show_date = DateTime::createFromFormat('d/m/Y', $dateInput)->format('Y-m-d'); 
+0

Ý tưởng là tốt, nhưng 'date_parse_from_format' trả về' mảng' trong khi 'ngày' chấp nhận' int' làm đầu vào thứ hai. – Voitcus

+0

Xin lỗi bạn đã chỉnh sửa nó. – Voitcus

+0

@Voitcus Vâng, tôi chỉ nhận thấy sau khi đăng câu trả lời – sroes

3

sau đó kỳ lạ chỉ hoạt động đôi khi:

$show_date = date('Y-m-d', strtotime($dateInput)); 

này là không có cách nào khác ngắn hơn để làm điều đó .... và Tôi đang sử dụng điều này tất cả cuộc sống của tôi .. havn't nhận thấy bất kỳ điều bizzare xảy ra với nó cho đến bây giờ .. kiểm tra nếu có một số những thứ khác đó là rối tung lên

otherway để làm điều đó là

$timestamp = strtotime(str_replace('/', '.', $dateInput)); 
$mysql_date = date('Y-m-d', $timestamp); 
+1

Với dấu gạch chéo, strtotime() hy vọng ngày định dạng của Hoa Kỳ, không phải là ngày định dạng ở Vương quốc Anh, đó là lý do tại sao nó sẽ làm hỏng một số giá trị. – Tushar

+1

Tôi luôn tự hỏi nếu 02/03/04 là ngày 2 tháng 3 năm 2004, ngày 4 tháng 3 năm 2002, ngày 3 tháng 2 năm 2004 hoặc ... Tôi nghĩ PHP luôn có khả năng cuối cùng, vì vậy đây không phải là điều được đưa ra trong đầu vào. – Voitcus

+0

@Tushar Cảm ơn, điều đó có ý nghĩa khi tôi nhìn vào những ngày nó đang vặn lên. –

1

PHP 5.3 và lên

Sử dụng DateTime::createFromFormat. Nó cho phép bạn chỉ định một mặt nạ chính xác - sử dụng ngày() Cú pháp - để phân tích ngày chuỗi đến với.

PHP 5.2 và thấp hơn

Bạn sẽ phải phân tích các yếu tố (năm, tháng, ngày, giờ, phút, giây) bằng tay sử dụng substr() và trao kết quả cho mktime() rằng sẽ xây dựng cho bạn một dấu thời gian.

+0

Anh ấy đã sử dụng 'strtotime()' – Uby

11

dùng thử.

$dateInput = explode('/','31/03/2013'); 
$ukDate = $dateInput[2].'-'.$dateInput[1].'-'.$dateInput[0]; 
+0

Đánh tôi với nó. Tôi đã làm một cái khác với preg_replace (một dòng). –

+0

Ngoài ra, bạn có thể thực hiện việc này mà không cần bất kỳ chức năng nào như phát nổ bằng ký pháp chuỗi ký tự. –

0

Hai phương pháp thay thế. Cả hai đầu ra 2013/03/31:

Phương pháp 1 - "Nhìn ma, không có chức năng"

<?php 
    $in = '31/03/2013'; 
    echo $in[6].$in[7].$in[8].$in[9].'-'.$in[3].$in[4].'-'.$in[0].$in[1]; 
    ?>  

Phương pháp 2 - regex

<?php 
    echo ($output = preg_replace('!^([0-9]{2})/([0-9]{2})/([0-9]{4})$!',"$3-$2-$1",$input)); 
?> 
0

Hãy thử điều này:

$dte = '28/03/2013'; 
$dt = new DateTime(); 
$date = $dt->createFromFormat('d/m/Y', $dte); 
echo $date->format('Y-m-d'); 

Đầu ra: 2013-03-28

0
$date_array = explode("/",$your_date); // split the array 
$var_day = $date_array[0]; //day seqment 
$var_month = $date_array[1]; //month segment 
$var_year = $date_array[2]; //year segment 
echo $new_date_format = "$var_year-$var_day-$var_month"; // join them together 

Thao tác này sẽ hoạt động

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