Gün ışığından yararlanma ile PHP tarih konular

3 Cevap php

Ben bende bazı PHP kodu kadar kırpma çok garip bir hata var. Sayfa kurslarına öğrenci kayıtları yönetiyor. Sayfada öğrencinin derslerin bir tablo olduğunu ve her satır bir tarih vardır: bunlar tamamlandığında onlar değerlendirmesini geçtiğinde ve onların sertifika aldı ne zaman, kayıtlı ne zaman.

Tablo veri (DB çizim verileri) PHP tarafından oluşturulan ve Javascript aslında tablo haline getirmektedir. PHP çıktısı şöyle JS kodu:

var e = new Enrolment();
e.contactId = 5801;
e.enrolId = 14834;
e.courseId = 3;
e.dateEnrolled = new Date(1219672800000);
e.dateCompleted = new Date(-1000);  // magic value meaning they haven't completed.
e.resultDate = new Date(1223647200000);
e.certDate = new Date(1223560800000);
e.result = 95;
e.passed = true;
enrolments[14834] = e;

Veritabanında, tüm tarih alanları DATE (değil DATETIME) alanları olarak depolanır.

Hata tarihleri ​​bir gün kapalı olarak görüntülenen ediliyor olmasıdır. Ben burada hiç yok ise bu (sunucu saati bir saat kapalı anlamına gelir), sunucu günışığı tasarrufu olan bir alanda olmak ile yapmak çok şey olduğunu şüpheli olur. Bu veri hazırlama ve işleme, iki farklı saat dilimleri yapılıyor özellikle nasıl, bir çok şeyi açıklıyor. Yani: sunucu kişinin 15 Ağustos günü gece yarısı tamamlanan müşteriye söyleyerek, ve müşteri yorumlama olduğu 14 Nisan 11:00 ve bu nedenle 14 Ağustos görüntüleme gibi.

Ama burada kafa karıştırıcı parçası: sadece resultDate ve certDate alanları için bunu yapıyor! Ben benim yerel sunucuya verileri kopyaladığınız ve dateEnrolled alan aynı ise üretim sunucu aslında, sadece bu iki alan için farklı bir zaman damgası (1 saat kapalı bir) gönderme olduğunu bulduk.

Burada veritabanından aynı kod ve verileri kullanarak çıkış bulunuyor:

// local server (timezone GMT+1000)
e.dateEnrolled = new Date(1219672800000);   // 26 Aug 2008 00:00 +10:00
e.dateCompleted = new Date(-1000);
e.resultDate = new Date(1223647200000);     // 11 Oct 2008 00:00 +10:00
e.certDate = new Date(1223560800000);       // 10 Oct 2008 00:00 +10:00

// production server (timezone GMT+1100)
e.dateEnrolled = new Date(1219672800000);   // 26 Aug 2008 00:00 +10:00
e.dateCompleted = new Date(-1000);
e.resultDate = new Date(1223643600000);     // 10 Oct 2008 23:00 +10:00 **
e.certDate = new Date(1223557200000);       // 09 Oct 2008 23:00 +10:00 **

Bu Yaz Saati sorumluydu olmamak ile ilgili bir sorun olup olmadığını anlamak, ancak dateEnrolled aynı nasıl fark edebilir?

Bir unix zaman damgası MySQL tarih dönüştürür PHP kodu şudur:

list ($year, $month, $day) = explode ('-', $mysqlDT);
$timestamp = mktime (0,0,0, $month, $day, $year);

Bunu düzeltmek konusunda herhangi bir fikir?

3 Cevap

Eğer yerele özgü olan mktime kullanmak Thats çünkü. Yani 00:00:00 1970/01/01 GMT gelen saniye sayıya dönüştürmek olacak ve bu bir zaman dilimi ile 1 saat ofset olduğunu.

Ayrıca javascript tarayıcıda değil, web sayfası olarak aynı zaman dilimini kullanıyor unutulmamalıdır.

e.resultDate = new Date(year, month - 1, day);

Bu tarih, her zaman dilimi her izleyici için aynı olduğundan emin olun.

Yoksa gmmktime kullanmak ve Tarih UTC yöntemleri kullanabilirsiniz.

O bir tarih ancak diğer değil yukarı emme yüzden Tamam, ben sadece anladım. Yaz saati Ağustos ayında yürürlükte değildi. facepalm

, Sizin app timezone ayarı apache.conf kullanarak. Htaccess veya ini_set () ini date.timezone ayarlayın.