PHP'nin DateTime sınıfında DateTime-> date'a neden erişemiyorum?


95

DateTimeAşağıdaki kodu çalıştırmayı denersem sınıfı kullanarak :

$mydate = new DateTime();
echo $mydate->date;

Bu hata mesajını geri alacağım

Uyarı: Tanımsız özellik: DateTime :: $ date ...

Bu mantıklı değil çünkü var_dump()değişken üzerinde çalışırken , $mydatebu özelliğin var olduğunu ve halka açık olduğunu açıkça gösterir:

var_dump($mydate);

object(DateTime)[1]
  public 'date' => string '2012-12-29 17:19:25' (length=19)
  public 'timezone_type' => int 3
  public 'timezone' => string 'UTC' (length=3)

Bu PHP içinde bir hata mı yoksa yanlış bir şey mi yapıyorum? PHP 5.4.3 kullanıyorum.


1
İyi soru. Bir an anlamadığımı düşündüm ... hiçbir şey.
normalmike

Yanıtlar:


149

Bu bilinen bir sorundur .

var_dump()Tarihin mevcut olması aslında buradaki desteğin bir yan etkisidir - derick@php.net

Bazı nedenlerden dolayı, mülke erişememeniz gerekiyor ama yine de var_dumpgösteriyorsunuz. Tarihi gerçekten bu formatta almak istiyorsanız, DateTime::format()işlevi kullanın .

echo $mydate->format('Y-m-d H:i:s');

1
Neden tam olarak bu biçimi istemezsiniz? MySQL'in tarihler için sahip olduğu formatla aynıdır.
Elia Iliashenko

@HelgaIliashenko Anladığımdan emin değilim. Hiç kimsenin bu tam formatı istemeyeceğini söylemedim.
jeremy

Var_dump veya print_r kullanılıyorsa bu aynıdır.
AndyGaskell

15

Güncelleme: PHP7.3'te davranış değişti, orijinal cevap artık çalışmıyor. Tüm PHP sürümleriyle aynı sonuçları elde etmek için. > = 7.3, aşağıdaki kodu kullanabilirsiniz:

$dt = new DateTime();
$date = $dt->format('Y-m-d\TH:i:s.v');

Kayıt için orijinal cevap:

Aramanın yanı sıra DateTime::format()yansımayı kullanarak tesise erişebilirsiniz:

<?php

$dt = new DateTime();
$o = new ReflectionObject($dt);
$p = $o->getProperty('date');
$date = $p->getValue($dt);

Bu, kullanmaktan biraz daha hızlıdır, format()çünkü format()zaten biçimlendirilmiş bir zaman damgasını biçimlendirir. Özellikle bir döngüde birçok kez yaparsanız.

Ancak bu, PHP'nin belgelenmiş bir davranışı değildir, her an değişebilir.



1
@ TechCare99 :) Bence hiç böyle çalışmamalı, bu bir hack'ti. Bir alternatif için 7.4'ü kontrol etmeniz gerekiyor, bugünlerde çok fazla php yapmıyor ama kontrol edecek. Bana bildirdiğiniz için teşekkürler!
hek2mgl


2

Diğer yanıtların da belirttiği gibi, PHP ile ilgili, bugün itibariyle çözülmemiş bir sorundur, ancak eğer bu bir 'yan etkisi' ise var_dump()o kadar emin değilim ..

echo ((array) new DateTime())['date']; // Works in PHP 7.

Ne Emin üzereyim olmasıdır eğer özellikleri DateTimeanlamına nerede bizim tarafımızdan kullanılacak kullanıma sunulmadan olurdu. Ancak birçok dahili sınıf gibi bunlar da değildir ve kodunuzu düzeltmek için "hacky" veya "glitchy" yöntemlerine güvenmemelisiniz. Bunun yerine API'larını kullanmalısınız .

echo (new DateTime())->format('Y-m-d H:i:s');

Memnun kalmazsanız sınıfı genişletebilir veya belki de sizin için genişleten Carbon'u kullanabilirsiniz .

echo (new Carbon())->toDateTimeString();

Bir var_dump()nesnenin sahte çıktısını nasıl yaratırsanız, şuna bakın:__debugInfo()


2

DateTime öğesinin tarih özelliği korunmaktadır.

Tarihi format işlevi ile görüntüleyebilirsiniz.

<?php

try {
    $time = new DateTime();
    echo($time->format("Y-m-d H:i:s"));
} catch (Exception $e) {
}

Veya diziye dönüştürebilirsiniz:

<?php

try {
    $time = (array) new DateTime();
    var_dump($time["date"]);
} catch (Exception $e) {
}

DateTime nesnesinin date özelliğine neden erişemediğini öğrenmek istedi ... Depolanan bir Datetime değerlerini nerede biçimlendirmek istediğini görüyorsunuz? "Ymd H: i: s" tarih varsayılan olarak cadı biçimidir!
filipe

Nesneden diziye dönüştürme - önerdiğiniz gibi - muhtemelen gitmenin en kolay yoludur.
Jeffz

0

Mülk tarihini sormadan önce bir var_Dump kullanırsanız , her şey sorunsuz çalışır:

$mydate = new DateTime();
var_Dump($mydate);
echo '<br>';
echo $mydate->date;

Bu şunları sağlar:

object(DateTime)#1 (3) { ["date"]=> string(26) "2017-04-11 08:44:54.000000" ["timezone_type"]=> int(3) ["timezone"]=> string(16) "America/New_York" }
2017-04-11 08:44:54.000000

Böylece, mülk tarihinin nesne için bile var olduğunu görüyorsunuz. Bu davranışı anlayamıyorum. Sadece var_Dump'a yorum yapın ve hatayı tekrar alacaksınız.


error_reporting (0); echo date ("Ymd H: i: s", strtotime ($ mydate-> tarih));
Kaushik Das
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.