php डेटाइम को UTC में परिवर्तित करते हैं


90

मुझे UTC को किसी भी समय लायब्रेरी का उपयोग किए बिना UTC को एक दिनांक समय स्टैम्प परिवर्तित करने के लिए एक आसान तरीका की आवश्यकता है (जो भी टाइमज़ोन है)।

जवाबों:


30

GetTimezone और setTimezone का प्रयास करें , उदाहरण देखें

(लेकिन यह एक वर्ग का उपयोग करता है)

अपडेट करें:

किसी भी वर्ग के बिना आप कुछ इस तरह की कोशिश कर सकते हैं:

$the_date = strtotime("2010-01-19 00:00:00");
echo(date_default_timezone_get() . "<br />");
echo(date("Y-d-mTG:i:sz",$the_date) . "<br />");
echo(date_default_timezone_set("UTC") . "<br />");
echo(date("Y-d-mTG:i:sz", $the_date) . "<br />");

नोट: आपको टाइमज़ोन को वापस मूल पर सेट करना पड़ सकता है


55
आपको gmdateडिफ़ॉल्ट समयक्षेत्र को UTC में बदलने के बजाय बस उपयोग करना चाहिए । क्योंकि gmdateस्वचालित रूप से यूटीसी का उपयोग करता है।
प्रहार

29
-1 क्योंकि आप इसके लिए वैश्विक डिफ़ॉल्ट टाइमज़ोन को बदलना नहीं चाहते हैं। यह सिर्फ अनपेक्षित दुष्प्रभावों के लिए पूछता है।
वार्ड बेकर

@Phill 'sz' यहाँ क्या है?
शाहिद करीमी

2
मुझे लगता है कि यह "यम-एमटीजी ..." के बजाय "यम-डीटीजी ..." होना चाहिए
एलेक्स

यह मेरे लिए लार्वा परियोजना में काम नहीं कर रहा है। उसी तारीख को इसकी वापसी
धर्मेंद्र तुली

109

का प्रयोग करें strtotime (स्थानीय समय के रूप में व्याख्या) दिया स्ट्रिंग से एक टाइमस्टैम्प उत्पन्न करने के लिए और उपयोग gmdate एक फ़ॉर्मेट यूटीसी तिथि वापस के रूप में यह मिलता है।

उदाहरण

जैसा कि अनुरोध किया गया है, यहाँ एक सरल उदाहरण है:

echo gmdate('d.m.Y H:i', strtotime('2012-06-28 23:55'));

7
एक छोटा सा उदाहरण शायद?
चेरोविम

2
@cherouvim यह आवश्यक नहीं है, लेकिन किसी भी तरह एक जोड़ा ... आशा है कि यह मदद करता है।
प्रहार

5
gmdate () उन PHP फ़ंक्शंस में से एक है जो मैं चाहता हूं कि मैं बहुत समय पहले ठोकर खाई थी। nl2br, कोई भी?
चार्ली श्लिसेर

1
GMT और UTC हमेशा समान नहीं होते हैं।
जय शेठ

1
@poke GMT दिन की बचत के समय का सम्मान करता है, UTC नहीं करता है और इसीलिए इसका उपयोग किया जाता है इसलिए आपको कुछ और करने की आवश्यकता नहीं है
Necro

72

दिनांक समय का उपयोग करना:

$given = new DateTime("2014-12-12 14:18:00");
echo $given->format("Y-m-d H:i:s e") . "\n"; // 2014-12-12 14:18:00 Asia/Bangkok

$given->setTimezone(new DateTimeZone("UTC"));
echo $given->format("Y-m-d H:i:s e") . "\n"; // 2014-12-12 07:18:00 UTC

प्रश्न कहता है कि टाइमस्टैम्प को टाइमस्टैम्प में बदलें, और डेटटाइम इनपुट के रूप में टाइमस्टैम्प को स्वीकार नहीं करता है। आपको इसे किसी तरह एक स्ट्रिंग में बदलना होगा और फिर इसे वापस बदलना होगा।
felwithe


14

यदि आपके पास इस प्रारूप में एक तारीख है YYYY-MM-HH dd: mm: ss, तो आप वास्तव में अपने "डेटाटाइम स्ट्रिंग" के अंत में एक UTC जोड़कर php को धोखा दे सकते हैं और इसे बदलने के लिए strtotime का उपयोग कर सकते हैं।

date_default_timezone_set('Europe/Stockholm');
print date('Y-m-d H:i:s',strtotime("2009-01-01 12:00"." UTC"))."\n";
print date('Y-m-d H:i:s',strtotime("2009-06-01 12:00"." UTC"))."\n";

यह इसे प्रिंट करेगा:

2009-01-01 13:00:00
2009-06-01 14:00:00

और जैसा कि आप देख सकते हैं कि यह दिन के उजाले की बचत की समस्या का भी ध्यान रखता है।

इसे हल करने के लिए थोड़ा अजीब तरीका .... :)


मैं वास्तव में समझ नहीं पा रहा हूं कि ओपी ने आपका सुझाव क्यों नहीं लिया:D
php_nub_qq

@php_nub_qq शायद इसलिए क्योंकि यह पूरी स्क्रिप्ट के लिए टाइमज़ोन को बदलकर काम करता है, जो वांछित नहीं हो सकता है और इसके अनपेक्षित परिणाम हो सकते हैं।
felwithe

@felwithe यदि यह पहली पंक्ति को नहीं छोड़ता है, जो सिर्फ प्रदर्शन के लिए है
php_nub_qq

11

स्थानीय समय क्षेत्र स्ट्रिंग को UTC स्ट्रिंग में बदलें।
उदा न्यूजीलैंड टाइम ज़ोन

$datetime = "2016-02-01 00:00:01";
$given = new DateTime($datetime, new DateTimeZone("Pacific/Auckland"));
$given->setTimezone(new DateTimeZone("UTC"));
$output = $given->format("Y-m-d H:i:s"); 
echo ($output);
  • NZDT: UTC + 13: 00
    अगर $ डेटाइम = "2016-02-01 00:00:01", $ आउटपुट = "2016-01-31 11:00:01";
    अगर $ डेटाइम = "2016-02-29 23:59:59", $ आउटपुट = "2016-02-29 10:59:59";
  • NZST: UTC + 12: 00
    अगर $ डेटाइम = "2016-05-01 00:00:01", $ आउटपुट = "2016-04-30 12:00:01";
    अगर $ डेटाइम = "2016-05-31 23:59:59", $ आउटपुट = "2016-05-31 11:59:59";

https://en.wikipedia.org/wiki/Time_in_New_Zealand


5

यदि आप PHP के दिनांक समय वर्ग का उपयोग करने में कोई आपत्ति नहीं करते हैं , जो PHP 5.2.0 के बाद से उपलब्ध है, तो ऐसे कई परिदृश्य हैं जो आपकी स्थिति के लिए उपयुक्त हो सकते हैं:

  1. यदि आपके पास एक $givenDtDateTime ऑब्जेक्ट है जिसे आप UTC में बदलना चाहते हैं तो यह इसे UTC में बदल देगा:

    $givenDt->setTimezone(new DateTimeZone('UTC'));
    
  2. यदि आपको $givenDtबाद में मूल की आवश्यकता है , तो आप वैकल्पिक रूप से क्लोन किए गए ऑब्जेक्ट के रूपांतरण से पहले दिए गए DateTime ऑब्जेक्ट को क्लोन करना चाहते हैं:

    $utcDt = clone $givenDt;
    $utcDt->setTimezone(new DateTimeZone('UTC'));
    
  3. यदि आपके पास केवल एक डेटाइम स्ट्रिंग है, उदाहरण के लिए $givenStr = '2018-12-17 10:47:12', तो आप पहले एक डेटाइम ऑब्जेक्ट बनाते हैं, और फिर इसे कनवर्ट करते हैं। ध्यान दें कि $givenStrयह PHP के कॉन्फ़िगर किए गए टाइमज़ोन में है।

    $utcDt = (new DateTime($givenStr))->setTimezone(new DateTimeZone('UTC'));
    
  4. यदि दिए गए डेटाइम स्ट्रिंग आपके PHP कॉन्फ़िगरेशन में एक से अलग कुछ समयक्षेत्र में है, तो सही टाइमज़ोन की आपूर्ति करके डेटाटाइम ऑब्जेक्ट बनाएं ( टाइमज़ोन PHP समर्थन की सूची देखें )। इस उदाहरण में हम एम्स्टर्डम में स्थानीय समयक्षेत्र मान रहे हैं:

    $givenDt = new DateTime($givenStr, new DateTimeZone('Europe/Amsterdam'));
    $givenDt->setTimezone(new DateTimeZone('UTC'));
    

4

जैसा कि strtotime को विशिष्ट इनपुट प्रारूप की आवश्यकता होती है, DateTime :: createFromFormat का उपयोग किया जा सकता है ( php 5.3+ की आवश्यकता है )

// set timezone to user timezone
date_default_timezone_set($str_user_timezone);

// create date object using any given format
$date = DateTime::createFromFormat($str_user_dateformat, $str_user_datetime);

// convert given datetime to safe format for strtotime
$str_user_datetime = $date->format('Y-m-d H:i:s');

// convert to UTC
$str_UTC_datetime = gmdate($str_server_dateformat, strtotime($str_user_datetime));

// return timezone to server default
date_default_timezone_set($str_server_timezone);

4

मैं कुछ समय इस पद्धति का उपयोग करता हूं:

// It is not importnat what timezone your system is set to.
// Get the UTC offset in seconds:
$offset = date("Z");

// Then subtract if from your original timestamp:
$utc_time = date("Y-m-d H:i:s", strtotime($original_time." -".$offset." Seconds"));

समय के सभी सबसे काम करता है ।


3
यहां दो समस्याएं। पहले आपको ऑफसेट को जोड़ना नहीं चाहिए। दूसरा, यह काम नहीं करता है यदि स्थानीय समय क्षेत्र वर्तमान में डीएसटी पर है और वांछित तिथि डीएसटी पर नहीं है। ऑफसेट एक घंटे से बंद हो जाएगा। या ठीक इसके विपरीत। तो हाँ, यह उस समय का MOST काम करता है, लेकिन हमेशा नहीं।
अंजोन



0

प्रयत्न

प्रतिध्वनि की तारीख ('एफ डी वाई', स्ट्रेटोटाइम ('2010-01-19 00:00:00'));

उत्पादन होगा:

19 जनवरी 2010

आपको अन्य आउटपुट देखने के लिए प्रारूप समय बदलना चाहिए


0

किसी भी टाइमज़ोन से दूसरे टाइमस्टैम्प को प्रारूपित करने के लिए सामान्य प्रयोजन सामान्यीकरण फ़ंक्शन। किसी रिलेशनल डेटाबेस में अलग-अलग टाइमज़ोन से उपयोगकर्ताओं के डेटासेटिमैम्प को संग्रहीत करने के लिए बहुत उपयोगी है। डेटाबेस तुलना के लिए टाइमस्टैम्प को UTC के रूप में संग्रहीत करें और साथ उपयोग करेंgmdate('Y-m-d H:i:s')

/**
 * Convert Datetime from any given olsonzone to other.
 * @return datetime in user specified format
 */

function datetimeconv($datetime, $from, $to)
{
    try {
        if ($from['localeFormat'] != 'Y-m-d H:i:s') {
            $datetime = DateTime::createFromFormat($from['localeFormat'], $datetime)->format('Y-m-d H:i:s');
        }
        $datetime = new DateTime($datetime, new DateTimeZone($from['olsonZone']));
        $datetime->setTimeZone(new DateTimeZone($to['olsonZone']));
        return $datetime->format($to['localeFormat']);
    } catch (\Exception $e) {
        return null;
    }
}

उपयोग:

$from = ['localeFormat' => "d/m/Y H:i A", 'olsonZone' => 'Asia/Calcutta'];

$to = ['localeFormat' => "Y-m-d H:i:s", 'olsonZone' => 'UTC'];

datetimeconv("14/05/1986 10:45 PM", $from, $to); // returns "1986-05-14 17:15:00"

0

वैकल्पिक रूप से आप यह कोशिश कर सकते हैं:

<?php echo (new DateTime("now", new DateTimeZone('Asia/Singapore')))->format("Y-m-d H:i:s e"); ?>

यह उत्पादन होगा:

2017-10-25 17:13:20 एशिया / सिंगापुर

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

यदि आप अपना क्षेत्र / देश दिखाना नहीं चाहते हैं, तो 'ई' निकालें।


0

प्राप्त करने के लिए इन चरणों का पालन UTC समय के किसी भी समय क्षेत्र उपयोगकर्ता की स्थानीय प्रणाली में सेट (यह वेब अनुप्रयोगों यूटीसी के लिए विभिन्न समय क्षेत्रों को बचाने के लिए के लिए आवश्यक हो जाएगा):

  1. जावास्क्रिप्ट (क्लाइंट-साइड):

    var dateVar = new Date();
    var offset = dateVar.getTimezoneOffset();
    //getTimezoneOffset - returns the timezone difference between UTC and Local Time
    document.cookie = "offset="+offset;
    
  2. Php (सर्वर-साइड):

    public function convert_utc_time($date)
    {
        $time_difference = isset($_COOKIE['offset'])?$_COOKIE['offset']:'';
        if($time_difference != ''){
            $time = strtotime($date);
            $time = $time + ($time_difference*60); //minutes * 60 seconds
            $date = date("Y-m-d H:i:s", $time);
        } //on failure of js, default timezone is set as UTC below
        return $date;
    }
    ..
    ..
    //in my function
    $timezone = 'UTC';
    $date = $this->convert_utc_time($post_date); //$post_date('Y-m-d H:i:s')
    echo strtotime($date. ' '. $timezone)
    

-1

Phill Pafford के उत्तर में सुधार के रूप में (मुझे उनकी 'Yd-mTG: i: sz' समझ में नहीं आई और उन्होंने टाइमज़ोन को वापस करने का सुझाव दिया)। इसलिए मैं इसे प्रस्तावित करता हूं (मैं सादे / पाठ में HMTL प्रारूप को बदलकर जटिल करता हूं ...):

<?php
header('content-type: text/plain;');
$my_timestamp = strtotime("2010-01-19 00:00:00");

// stores timezone
$my_timezone = date_default_timezone_get();
echo date(DATE_ATOM, $my_timestamp)."\t ($my_timezone date)\n";

// changes timezone
date_default_timezone_set("UTC");
echo date("Y-m-d\TH:i:s\Z", $my_timestamp)."\t\t (ISO8601 UTC date)\n";
echo date("Y-m-d H:i:s", $my_timestamp)."\t\t (your UTC date)\n";

// reverts change
date_default_timezone_set($my_timezone);
echo date(DATE_ATOM, $my_timestamp)."\t ($my_timezone date is back)\n"; 
?>

2
आपको अपने उत्तर को यह बताने के लिए संपादित करना चाहिए कि यह फिल के उत्तर पर कैसे सुधार करता है। आपने कोड में क्या बदलाव किया, और यह बेहतर क्यों है?
कोड़ी ग्रे

दो टाइमस्टैम्प को बदलने के लिए डिफ़ॉल्ट PHP टाइमज़ोन को बदलना एक हैक है जो काम करता है, लेकिन एक सुरुचिपूर्ण समाधान नहीं है।
कोपरोल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.