MySQL'de tarih saatine eklenirken PHP date () biçimi


324

date()Sonucu bir MySQL datetimetürü sütununa eklemek istersem PHP'deki işleve geçmek için doğru format nedir ?

Deniyorum date("Y-M-D G:i:s")ama bu her zaman "0000-00-00 00:00:00" ekler.


3
bugüne kadar bir parametre sağlamadığınız için, şu anki saati gerçekten kaydetmek istiyor musunuz?
Mark Elliot

Yanıtlar:


680

Sorun şu ki, kullandığınız 'M've 'D'metinsel bir gösterim olan MySQL, formatın sayısal bir temsilini bekliyor2010-02-06 19:30:13

Deneyin: date("Y-m-d H:i:s")sayısal eşdeğerleri kullanır.

düzenleme: anahtarlamalı Giçin Honu bir etkiye sahip olmayabilir ama, muhtemelen öncü 0s ile 24 saat formatını kullanmak istiyorum.


28
bu, herkesin ihtiyaç duyabileceği en yaygın tarih-saat biçimlerinden biri olmalıdır. php global veya tarih fonksiyonunun kendisinin bir parçası olmalıdır (örneğin, 'c', 'r')
billynoah

33
Neden bilmiyorum böyle değil. Her yığın taşmasına başvurmak zorundayım. tek. işleyen. zaman.
Mazatec

11
Buraya gelmek, kodumda böyle bir kullanım için arama yapmaktan daha hızlı.
MRodrigues

64
Sadece biçimi hatırlamak için şirin anımsatıcı düşündüm: " Y bizim m y d değil yedi His ". pek çok düzeyde çalışıyor :)
IzzEps

2
ISO 8601 ve RFC 2822 için olduğu gibi bunun için bir php shorthand olmalıdır
billynoah

105

Php'nin date()manuel sayfasının yorumlarından :

<?php $mysqltime = date ("Y-m-d H:i:s", $phptime); ?>

'Y' doğruydu - bu tam bir yıl, ancak 'M' üç karakterli bir ayken, 'm' iki basamaklı bir ay. 'D' yerine 'D' ile aynı sorun. 'G', 1 veya 2 haneli bir saattir; burada 'H', gerektiğinde her zaman önde 0'dır.


1
Teşekkürler @Pekka - Sen ve ben kabaca aynı temsilciye sahip olduğumu hatırlıyorum - oldukça aktifsin.
Tim Lytle

1
Evet, şu anda çok çalışıyorum ve SO arasında en sevdiğim eğlence :) tekrar değişecek.
Pekka

41

Burada alternatif bir çözüm var: PHP'de tarih damgası olarak bir tarih varsa, PHP ile işlemeyi atlayın ve DB'nin FROM_UNIXTIMEişlevi kullanarak dönüştürmeyi halletmesine izin verin .

mysql> insert into a_table values(FROM_UNIXTIME(1231634282));
Query OK, 1 row affected (0.00 sec)

mysql> select * from a_table;

+---------------------+
| a_date              |
+---------------------+
| 2009-01-10 18:38:02 |
+---------------------+

Bu zarif bir
çözüm.Teşekkürler

2
@trejder, Kim mysql bunu php yapmaktan daha hızlı olduğunu söyledi? PHP genellikle yapmak daha iyidir çünkü DB genellikle darboğaz ve asap içeri ve dışarı almak istiyorum .
Pacerier

1
@Pacerier, kötü oluşturulmuş bir DB'niz varsa veya daha sağlam etkili tek bir sorgu yerine çok fazla küçük sorgu çalıştırıyorsanız veya veritabanını yönetmek için ORM'ye güveniyorsanız birçok durumda darboğazdır. İyi endekslenmiş ilişkisel veritabanına sahip katı SQL yavaş değildir.
mopsyd

2
mopsyd, DB, darboğazdır çünkü yatay olarak ölçeklendirmek karmaşıklık gerektirir. Bunu, herhangi bir kod değişikliği yapmadan tüm dünyada çoğaltılabilen web sunucularıyla karşılaştırın.
Pacerier

1
Sorgu başarısız olursa, bir yere kaydedilir ve hata ayıklamanız gerekiyorsa, zaman damgasını okumak @ tim-lytle tarafından açıklanan biçimlendirilmiş tarih dizesinden daha zordur.
humbadlar

27

MySQL DATETIME sütununa eklemek bir değişken oluşturmak için aşağıdaki PHP kodunu kullanın.

$datetime = date_create()->format('Y-m-d H:i:s');

Bu, sunucunun geçerli Tarih ve Saatini tutar.


12
$date_old = '23-5-2016 23:15:23'; 
//Date for database
$date_for_database = date ("Y-m-d H:i:s", strtotime($date_old));

//Format should be like 'Y-m-d H:i:s'`enter code here`

2
Bu kod soruyu cevaplayabilse de, soruyu neden ve / veya nasıl cevapladığı konusunda ek bağlam sağlamak uzun vadeli değerini önemli ölçüde artıracaktır. Lütfen biraz açıklama eklemek ve biçimlendirme sorunlarınızı çözmek için cevabınızı düzenleyin .
Toby Speight

9

Zaman damgasını MySQL DATETIME sütununa biçimlendir:

strftime('%Y-%m-%d %H:%M:%S',$timestamp);

8

MySQL tarih saatini PHP ile biçimlendirme

$date = "'".date('Y-m-d H:i:s', strtotime(str_replace('-', '/', $_POST['date'])))."'";

8

Bu işlevi kullanıyorum (PHP 7)

function getDateForDatabase(string $date): string {
    $timestamp = strtotime($date);
    $date_formated = date('Y-m-d H:i:s', $timestamp);
    return $date_formated;
}

PHP'nin eski sürümleri (PHP <7)

function getDateForDatabase($date) {
    $timestamp = strtotime($date);
    $date_formated = date('Y-m-d H:i:s', $timestamp);
    return $date_formated;
}

Cevabınızı oyladım çünkü ilk satırı düzenledikten sonra işe yaradı; function getDateForDatabase(string $date) : string {için function getDateForDatabase($date) {tip bildirimleri hata durum neden söyleyecek kadar PHP bilmiyorum.
Chris Pink

"GetDateForDatabase () için geçirilen bağımsız değişken 1, verilen dize, dize örneği olmalı" - girişim bir dize,
Chris Pink

7

Zaman damgası kullanmıyorsanız PHP'den date () yöntemini kullanmanıza gerek yoktur. Eğer datepostedbir datetime sütundur, böyle geçerli tarih ekleyebilirsiniz:

$db->query("INSERT INTO table (dateposted) VALUES (now())");

2
Bu yaklaşımı paylaştığınız için teşekkürler. Şimdiye kadar gördüğüm en kolay yöntem.
Shondeslitch

2

Bu beni basit bir cevap aramaya itiyor. Sonunda tüm girdi yakalamak ve doğru ya da en azından geçerli ve kontrol edilebilir iyi bir SQL dize vermek gibi görünüyor bu işlevi yaptı. 1999-12-31 ise, muhtemelen yanlıştır, ancak MySQL'de kötü bir hata atmaz.

function MakeSQLDate($date) {
    if (is_null($date)) {
        //use 1999-12-31 as a valid date or as an alert
        return date('Y-m-d', strtotime('1999-12-31'));
    }

    if (($t = strtotime($date)) === false) {
        //use 1999-12-31 as a valid date or as an alert
        return date('Y-m-d', strtotime('1999-12-31'));
    } else {
        return date('Y-m-d H:i:s', strtotime($date));
    }
}

1

DateTimePHP7 + 'da sınıf kullanma :

function getMysqlDatetimeFromDate(int $day, int $month, int $year): string {
    $dt = new DateTime();
    $dt->setTimezone(new DateTimeZone('UTC'));
    $dt->setDate($year, $month, $day);
    $dt->setTime(0, 0, 0, 0); // set tine to midnight

    return $dt->format("Y-m-d H:i:s");
}

1

Kabul edilen cevaba küçük bir ek: Veritabanı datetimeUTC olarak saklanırsa (her zaman yaptığım), gmdate("Y-m-d H:i:s")yerine kullanmalısınız date("Y-m-d H:i:s").

Ya da, bazı cevapların önerdiği gibi, MySQL'in her şeyi işlemesine izin vermeyi tercih ederseniz UTC_TIMESTAMP, aynı sonuçla MySQL'i eklerdim.

Not: Şu anki zamana ilişkin soruyu anladım.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.