PHP टाइमस्टैम्प डेटटाइम में


94

आप कैसे मैं एक strtotime को यह परिवर्तित कर सकते हैं पता है, या मूल्य के एक समान प्रकार में पारित करने के लिए है दिनांक समय वस्तु?

मेरे पास तारीख:

Mon, 12 Dec 2011 21:17:52 +0000

मैंने क्या कोशिश की है:

$time = substr($item->pubDate, -14);
$date = substr($item->pubDate, 0, strlen($time));

$dtm = new DateTime(strtotime($time));
$dtm->setTimezone(new DateTimeZone(ADMIN_TIMEZONE));
$date = $dtm->format('D, M dS');
$time = $dtm->format('g:i a');

उपरोक्त सही नहीं है। अगर मैं बहुत सारे अलग-अलग तारीखों के माध्यम से लूप करता हूं, तो सभी एक ही तारीख को।

जवाबों:


164

DateTimeऑब्जेक्ट बनाने के लिए आपको स्ट्रिंग को टाइमस्टैम्प में बदलने की आवश्यकता नहीं है (वास्तव में, इसका निर्माता आपको ऐसा करने की अनुमति नहीं देता है, जैसा कि आप बता सकते हैं)। आप बस के DateTimeरूप में अपनी तारीख स्ट्रिंग निर्माता में फ़ीड कर सकते हैं :

// Assuming $item->pubDate is "Mon, 12 Dec 2011 21:17:52 +0000"
$dt = new DateTime($item->pubDate);

कहा जा रहा है, यदि आपके पास एक टाइमस्टैम्प है जिसे आप एक स्ट्रिंग के बजाय उपयोग करना चाहते हैं, तो आप ऐसा कर सकते हैं DateTime::setTimestamp():

$timestamp = strtotime('Mon, 12 Dec 2011 21:17:52 +0000');
$dt = new DateTime();
$dt->setTimestamp($timestamp);

संपादित करें (2014-05-07):

मैं वास्तव में इस समय के बारे में पता नहीं था, लेकिन DateTimeनिर्माता सीधे टाइमस्टैम्प से उदाहरण बनाने का समर्थन करता हैइस दस्तावेज़ के अनुसार , आपको बस एक @चरित्र के साथ टाइमस्टैम्प को प्रस्तुत करना होगा :

$timestamp = strtotime('Mon, 12 Dec 2011 21:17:52 +0000');
$dt = new DateTime('@' . $timestamp);

यह बहुत अच्छा काम करता है। मैंने यह पहले कोशिश की थी, लेकिन इसे पर्याप्त मौका नहीं दिया होगा !!! धन्यवाद :))
JREAM

18
ध्यान दें कि new DateTime('@' . $timestamp) और $dt = new DateTime(); $dt->setTimestamp($timestamp)इसी तरह timezones के साथ सौदा नहीं है। अधिक जानकारी के लिए मेरा उत्तर @ stackoverflow.com/questions/12038558/… देखें।
जॉन सलेगर्स

43

जबकि @drrcknlsn यह दावा करने के लिए सही है कि एक टाइम स्ट्रिंग को डेटामाइम में बदलने के कई तरीके हैं, यह महसूस करना महत्वपूर्ण है कि ये विभिन्न तरीके टाइमज़ोन के साथ एक ही तरीके से व्यवहार नहीं करते हैं।


विकल्प 1 : DateTime('@' . $timestamp)

निम्नलिखित कोड पर विचार करें:

date_format(date_create('@'. strtotime('Mon, 12 Dec 2011 21:17:52 +0800')), 'c');

strtotimeबिट समाप्त समय क्षेत्र जानकारी, और date_createसमारोह जीएमटी मान लिया गया है ( Europe/Brussels)।

जैसे, आउटपुट निम्न होगा, चाहे मैं इसे किस सर्वर पर चलाऊं:

2011-12-12T13:17:52+00:00

विकल्प 2 : date_create()->setTimestamp($timestamp)

निम्नलिखित कोड पर विचार करें:

date_format(date_create()->setTimestamp(strtotime('Mon, 12 Dec 2011 21:17:52 +0800')), 'c');

आप उम्मीद कर सकते हैं कि यह एक ही आउटपुट का उत्पादन करे। हालाँकि, यदि मैं एक बेल्जियन सर्वर से इस कोड को निष्पादित करता हूं, तो मुझे निम्न आउटपुट मिलते हैं:

2011-12-12T14:17:52+01:00

date_createफ़ंक्शन के विपरीत , setTimestampविधि 'Europe/Brussels'GMT के बजाय सर्वर ( मेरे मामले में) के समय क्षेत्र को मानती है ।


स्पष्ट रूप से अपना समय क्षेत्र निर्धारित करना

यदि आप यह सुनिश्चित करना चाहते हैं कि आपका आउटपुट आपके इनपुट के समय क्षेत्र से मेल खाता है, तो इसे स्पष्ट रूप से सेट करना सबसे अच्छा है।

निम्नलिखित कोड पर विचार करें:

date_format(date_create('@'. strtotime('Mon, 12 Dec 2011 21:17:52 +0800'))->setTimezone(new DateTimeZone('Asia/Hong_Kong')), 'c')

अब, निम्नलिखित कोड पर भी विचार करें:

date_format(date_create()->setTimestamp(strtotime('Mon, 12 Dec 2011 21:17:52 +0800'))->setTimezone(new DateTimeZone('Asia/Hong_Kong')), 'c')

क्योंकि हम स्पष्ट रूप से इनपुट के मिलान के लिए आउटपुट का समय क्षेत्र निर्धारित करते हैं, दोनों समान (सही) आउटपुट बनाएंगे:

2011-12-12T21:17:52+08:00

27

संभवतः सबसे सरल उपाय सिर्फ:

DateTime::createFromFormat('U', $timeStamp);

जहां 'यू' का अर्थ यूनिक्स युग है। डॉक्स देखें: http://php.net/manual/en/datetime.createfromformat.php


3
यह विधि
टाइमजोन को

2
@BoukeVersteegh और कौन सा नहीं है?
forsberg

2
@BoukeVersteegh यह एक यूनिक्स टाइमस्टैम्प है!, यह आपको ऑब्जेक्ट बनाते समय टाइमज़ोन समस्याओं से मुक्त करता है । बस ->setTimezoneकॉल करने से पहले बेहतर समय-सीमा निर्धारित करने के लिए उपयोग करें->format()
लेखाकार م

1
@BoukeVersteegh PHP मैनुअल से इस बड़े नोट की जाँच करें "$ timezone पैरामीटर और वर्तमान समयक्षेत्र को तब अनदेखा किया जाता है जब $ time पैरामीटर या तो UNIX टाइमस्टैम्प हो (जैसे @ 946684800) या एक timezone निर्दिष्ट करता है (उदाहरण 2010-01-28T15: 00: 00 ०० + ०२: ००)। ’’
लेखाकार

1
यूनिक्स टाइमस्टैम्प में
टाइमज़ोन

0

यह मेरा समाधान है:

    function changeDateTimezone($date, $from='UTC', $to='Asia/Tehran', $targetFormat="Y-m-d H:i:s")
    {
        $date = new DateTime($date, new DateTimeZone($from));
        $date->setTimeZone(new DateTimeZone($to));
        return $date->format($targetFormat);
    }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.