PHP की DateTime कक्षा में मैं DateTime-> तारीख तक क्यों नहीं पहुँच सकता?


94

DateTimeकक्षा का उपयोग करना , अगर मैं निम्नलिखित कोड चलाने की कोशिश करता हूं:

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

मुझे यह त्रुटि संदेश वापस मिल जाएगा

सूचना: अपरिभाषित संपत्ति: दिनांक समय :: $ दिनांक ...

जिसका कोई मतलब नहीं है क्योंकि जब var_dump()चर पर चल रहा है $mydate, यह स्पष्ट रूप से दिखाता है कि यह संपत्ति मौजूद है और सार्वजनिक रूप से सुलभ है:

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)

क्या यह PHP के भीतर एक बग है या मैं कुछ गलत कर रहा हूं? मैं PHP 5.4.3 का उपयोग कर रहा हूं।


1
अच्छा प्रश्न। मैंने एक पल के लिए सोचा कि मुझे समझ नहीं आया ... कुछ भी।
नियमित रूप से

जवाबों:


146

यह एक ज्ञात मुद्दा है

उपलब्ध होने की तारीख वास्तव में var_dump()यहाँ के लिए समर्थन का एक साइड-इफेक्ट है - derick@php.net

किसी कारण से, आप संपत्ति का उपयोग करने में सक्षम नहीं हैं, लेकिन var_dumpइसे वैसे भी दिखाता है। यदि आप वास्तव में उस प्रारूप में दिनांक प्राप्त करना चाहते हैं, तो DateTime::format()फ़ंक्शन का उपयोग करें ।

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

1
कोई यह सटीक प्रारूप क्यों नहीं चाहेगा? यह वही प्रारूप है जो MySQL के पास तिथियों के लिए है।
एलिया इलियासेंको

@HelgaIliashenko मुझे यकीन नहीं है कि मैं समझ गया हूँ। मैंने कभी नहीं कहा कि कोई इस सटीक प्रारूप को नहीं चाहेगा।
जेरेमी

Var_dump या print_r का उपयोग करने पर यह समान है।
एंडीगस्केल

15

कॉलिंग के अलावा DateTime::format()आप प्रतिबिंब का उपयोग करके संपत्ति तक पहुंच सकते हैं:

<?php

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

यह उपयोग करने की तुलना में थोड़ा तेज़ है format()क्योंकि format()प्रारूप एक टाइमस्टृंग है जो पहले ही स्वरूपित हो चुका है। खासकर यदि आप इसे कई बार लूप में करते हैं।

हालाँकि यह PHP का एक नियमित व्यवहार नहीं है। उपरोक्त टिप्पणियों में उल्लिखित @Nile के रूप में पहले से ही एक Bugreport दायर किया गया है।


2

जैसा कि अन्य उत्तरों से पता चलता है, यह PHP के साथ एक मुद्दा है जो आज के रूप में अनसुलझा है, लेकिन अगर यह 'साइड इफेक्ट' है, तो var_dump()मुझे यकीन नहीं है ..

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

मैं इस बारे में निश्चित हूं कि यदिDateTime हमारे द्वारा इस्तेमाल किए जाने वाले सामानों के गुणों को उपलब्ध कराया जाता तो यह उपलब्ध होता। लेकिन कई आंतरिक वर्गों की तरह वे नहीं हैं और आपको अपने कोड को ठीक करने के लिए "हैकी" या "गड़बड़" तरीकों पर भरोसा नहीं करना चाहिए। इसके बजाय आपको उनके एपीआई का उपयोग करना चाहिए ।

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

यदि आप संतुष्ट नहीं हैं तो आप कक्षा का विस्तार कर सकते हैं या शायद कार्बन का उपयोग कर सकते हैं जो इसे आपके लिए बढ़ाता है।

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

यदि आप घायल हो जाते हैं तो var_dump()किसी वस्तु के नकली उत्पादन को कैसे देखते हैं__debugInfo()


2

DateTime की दिनांक संपत्ति सुरक्षित है।

आप प्रारूप फ़ंक्शन के साथ दिनांक प्रदर्शित कर सकते हैं।

<?php

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

या आप सरणी में बदल सकते हैं:

<?php

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

वह जानना चाहता था कि वह डेटटाइम ऑब्जेक्ट की डेट प्रॉपर्टी तक क्यों नहीं पहुँच सका ... आप कहाँ देखते हैं कि वह एक संग्रहीत डेटाटाइम मानों को प्रारूपित करना चाहता था? "Ymd H: i: s" विचाराधीन रूप से दिनांक को प्रारूपित करता है!
फिलिपे

सरणी रूपांतरण के लिए वस्तु - जैसा कि आप सुझाव देते हैं - शायद जाने का सबसे आसान तरीका है।
जेफज़

0

अगर आप प्रॉपर्टी डेट पूछने से पहले सिर्फ एक var_Dump का उपयोग करते हैं तो सब कुछ ठीक काम करता है:

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

यह उद्धार करता है:

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

तो आप देखते हैं कि ऑब्जेक्ट के लिए संपत्ति की तारीख भी मौजूद है। मैं इस व्यवहार को समझ नहीं सकता। बस var_Dump पर टिप्पणी करें और आपको फिर से त्रुटि मिलेगी।


error_reporting (0); इको डेट ("Ymd H: i: s", strtotime ($ mydate-> date));
कौशिक दास
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.