Μετατροπή συμβολοσειράς σε Date και DateTime

Αν έχω ένα αλφαριθμητικό PHP με τη μορφή mm-dd-YYYY (για παράδειγμα, 10-16-2003), πώς μπορώ να το μετατρέψω σωστά σε Date και στη συνέχεια σε DateTime με τη μορφή YYYY-mm-dd; Ο μόνος λόγος που ρωτάω για την Ημερομηνία και την Ημερομηνία-Χρόνο είναι επειδή χρειάζομαι το ένα σε ένα σημείο και το άλλο σε ένα άλλο σημείο.

Λύση

Χρησιμοποιήστε την strtotime() για την πρώτη ημερομηνία και στη συνέχεια την date('Y-m-d') για να την μετατρέψετε πίσω:

$time = strtotime('10/16/2003');

$newformat = date('Y-m-d',$time);

echo $newformat;
// 2003-10-16

Σημειώστε ότι υπάρχει διαφορά μεταξύ της χρήσης της κάθετης φοράς / και της παύλας - στη συνάρτηση strtotime(). Για να παραθέσω ένα απόσπασμα από το php.net:

Ημερομηνίες σε μορφή m/d/y ή d-m-y διαχωρίζονται με την εξέταση της συνάρτησης διαχωριστικό μεταξύ των διαφόρων στοιχείων: εάν ο διαχωριστής είναι ένα κάθετος (/), τότε η αμερικανική m/d/y είναι ενώ αν ο διαχωριστής είναι ένα παύλα (-) ή μια τελεία (.), τότε το θεωρείται η ευρωπαϊκή μορφή d-m-y.

Σχόλια (8)

Πρέπει να είστε προσεκτικοί με τις μορφές m/d/Y και m-d-Y. Η PHP θεωρεί ότι το / σημαίνει m/d/Y και το - σημαίνει d-m-Y. Θα περιέγραφα ρητά τη μορφή εισόδου σε αυτή την περίπτωση:

$ymd = DateTime::createFromFormat('m-d-Y', '10-16-2003')->format('Y-m-d');

Με αυτόν τον τρόπο δεν είστε έρμαιο των διαθέσεων μιας συγκεκριμένης ερμηνείας.

Σχόλια (4)
$d = new DateTime('10-16-2003');

$timestamp = $d->getTimestamp(); // Unix timestamp
$formatted_date = $d->format('Y-m-d'); // 2003-10-16

Επεξεργασία: μπορείτε επίσης να περάσετε μια DateTimeZone στον κατασκευαστή DateTime() για να εξασφαλίσετε τη δημιουργία της ημερομηνίας για την επιθυμητή ζώνη ώρας, όχι την προεπιλεγμένη του διακομιστή.

Σχόλια (2)