2013-03-28 12 views
11

mam postać, w którym termin jest podawany w postaci brytyjskiego i trzeba przekształcić goData DD/mm/rrrr do rrrr mm, dd PHP

yyyy-mm-dd 

np wprowadzona data to: 31/03/2013, którą chcę przekonwertować na '2013-03-31' dla wstawienia bazy danych.

Używam następujących składników, które dziwnie działa tylko czasami:

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

Czy istnieje lepszy sposób to zrobić?

+0

Dlaczego wymykasz się wartości daty ... czy faktycznie służy w jakimkolwiek celu? –

+0

Kiedy to nie działa poprawnie? Również ucieczka nie wydaje się dobrym pomysłem (a przynajmniej wydaje się bezużyteczna, jeśli format daty jest poprawny). Może powinieneś rozważyć użycie wyrażenia regularnego, aby sprawdzić początkowy format. – Uby

+1

@Darren powodem tego nie działa czasami dlatego, że PHP oczekuje, że data będzie w formacie US. Musisz go ponownie ułożyć przed przekazaniem go do 'strtotime()', jeśli w ogóle. http://stackoverflow.com/questions/4163641/php-using-strtotime-with-a-uk-date-format-dd-mm-yy – Tushar

Odpowiedz

15

Możesz chcieć użyć DateTime::createFromFormat:

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

Pomysł jest dobry, ale 'date_parse_from_format' zwraca' tablica', podczas gdy 'date' akceptuje' int' jako drugie wejście. – Voitcus

+0

Och, przepraszam, że już to zredagowałeś. – Voitcus

+0

@Voitcus Tak, właśnie zauważyłem po opublikowaniu odpowiedzi – sroes

3

po których dziwnie działa tylko czasami:

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

To nie jest inna krótsza droga to zrobić .... a używam tego przez całe moje życie .. nie zauważam żadnych dziwacznych rzeczy zachodzących z nim do teraz. Sprawdź, czy są jakieś inne rzeczy, które psują się

otherway zrobić to

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

W przypadku ukośników strtotime() oczekuje daty w formacie amerykańskim, a nie daty w formacie brytyjskim, dlatego może zepsuć niektóre wartości. – Tushar

+1

Zawsze się zastanawiam, czy 02.03.04 to 2 marca 2004 r., 4 marca 2002 r., 3 lutego 2004 r. Lub ... Myślę, że PHP zawsze bierze ostatnią możliwość, więc to nie jest to, co podano w danych wejściowych. – Voitcus

+0

@Tushar Dzięki, to ma sens, gdy patrzę na daty, w których to się zepsuło. –

1

PHP 5.3 i up

Zastosowanie DateTime::createFromFormat. To pozwala określić dokładną maskę - używając terminu() składni - do analizowania przychodzących dat ciąg z.

PHP 5.2 i niższe

Trzeba będzie przeanalizować elementy (rok, miesiąc, dzień, godzina, minuta, sekunda) ręcznie za pomocą substr() i przekazać wyniki do mktime() że zbudują ci znacznik czasu.

+0

On już używa 'strtotime()' – Uby

11

wypróbuj.

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

Pokonaj mnie. Zrobiłem inny z preg_replace (one-line). –

+0

Możesz również zrobić to bez żadnych funkcji, takich jak rozbijanie za pomocą notacji sznurkowej. –

0

Kilka alternatywnych metod. Zarówno wyjście 31.03.2013:

Metoda 1 - "Spójrz ma, nie ma funkcji"

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

Metoda 2 - regex

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

Spróbuj tego:

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

Wyjście: 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 

To zadziała

Powiązane problemy