दिनांक_l18n () के साथ स्थानीय समय पर टाइमस्टैम्प परिवर्तित करना


15

मुझे एक वर्डप्रेस क्रोन नौकरी मिली है जो समय-समय पर एक ईमेल भेजती है और टाइमस्टैम्प को बचाती है जब इसे एक विकल्प के रूप में भेजा गया था, और मैं सेटिंग्स पृष्ठ पर एक तिथि प्रदर्शित करना चाहूंगा। कुछ इस तरह, "अंतिम ईमेल 'x' पर भेजा गया था"। मैं अमेरिका के पश्चिमी तट पर हूं, इसलिए हमारा समय वर्तमान में यूटीसी से सात घंटे की है।

दिनांक_i18n () से मेरा अपेक्षित उत्पादन, इसे टाइमस्टैम्प से गुजरते हुए, UTC से सात घंटे के समायोजन के साथ स्थानीय रूप से स्वरूपित तिथि होगी। हालाँकि, यह UTC में समय देता है। यहां तक ​​कि वर्तमान समय को प्राप्त करने की कोशिश करने से वह नहीं लौटता है जो मुझे लगता है कि अपेक्षित आउटपुट होगा।

उदाहरण के लिए: echo date_i18n('F d, Y H:i');आउटपुट अप्रैल 05, 2013 11:36 अपेक्षित रूप से, लेकिन echo date_i18n('F d, Y H:i',time());आउटपुट 05 अप्रैल, 2013 18:36।

क्या यह जानबूझकर है? मैं एक स्थानीय समय की तारीख से एक स्थानीय स्वरूपित तारीख को कैसे वापस कर सकता हूं? किसी भी मदद के लिए धन्यवाद।


क्या आपने सेटिंग-जनरल में अपना समय क्षेत्र निर्धारित किया है?
vancoder

हाँ, लॉस एंजिल्स के लिए।
एंड्रयू बार्टेल

जवाबों:


31

मुझे पता है कि मुझे तीन महीने की देरी हो रही है, लेकिन आप जो फ़ंक्शन चाहते हैं वह वर्डप्रेस है get_date_from_gmt()

फ़ंक्शन Y-m-d H:i:sपहले पैरामीटर के रूप में GMT / UTC तिथि को स्वीकार करता है , और दूसरे पैरामीटर के रूप में आपका वांछित दिनांक प्रारूप। सेटिंग स्क्रीन पर सेट होते ही यह आपकी तारीख को स्थानीय समय-क्षेत्र में बदल देगा।

उदाहरण उपयोग:

echo get_date_from_gmt( date( 'Y-m-d H:i:s', $my_unix_timestamp ), 'F j, Y H:i:s' );


2
किलर थैंक्स, अभी-अभी मेरे नोटिफिकेशन में यह पॉपअप देखा। मैंने इसे सही उत्तर पर स्विच किया।
एंड्रयू बार्टल

1
मैंने तिथि और समय विन्यास जोड़ा: echo get_date_from_gmt ( date( 'Y-m-d H:i:s', $my_timestamp ), get_option('date_format') . ' - '. get_option('time_format') );
नाबिल कादिमी

@ नबिलादिमी यह एक महान जोड़ है, लेकिन यह अभी भी स्ट्रिंग को सही भाषा में अनुवाद नहीं करता है। एक फ़ंक्शन के लिए मेरा उत्तर देखें जो कॉन्फ़िगर की गई भाषा, समयक्षेत्र और दिनांक प्रारूप के सभी तीन को ध्यान में रखता है।
फ्लि‍म

5

से कोडेक्स :

current_time ('टाइमस्टैम्प') का उपयोग ब्लॉग के स्थानीय समय को वापस करने के लिए समय () के बदले में किया जाना चाहिए। वर्डप्रेस में, PHP का समय () हमेशा यूटीसी लौटेगा और करंट_टाइम ('टाइमस्टैम्प', ट्रू) को कॉल करने के समान है।

इसे इस्तेमाल करे:

define( 'MY_TIMEZONE', (get_option( 'timezone_string' ) ? get_option( 'timezone_string' ) : date_default_timezone_get() ) );
date_default_timezone_set( MY_TIMEZONE );
echo date_i18n('F d, Y H:i', 1365194723);

यह स्क्रिप्ट की अवधि के लिए डिफ़ॉल्ट PHP दिनांक को WP के timezone_string विकल्प में उपलब्ध है, यदि उपलब्ध है।


1
सही है, लेकिन क्या होगा अगर मेरे पास एक मनमाना टाइमस्टैम्प है? एक दो दिन पहले से कहें, मुझे यूटीसी समय के बजाय समायोजित समय कैसे मिलेगा?
एंड्रयू बार्टेल

काम date_i18n('F d, Y H:i', $your_timestamp)नहीं करता है?
vancoder

नहींं, यहां तक ​​कि 2012 के साथ एक वैनिला WP स्थापित करने की कोशिश की, बस इस echo date_i18n('F d, Y H:i',1365194723)बयान को index.php के शीर्ष पर चल रहा है , जो मुझे यूएस वेस्ट कोस्ट समय के बजाय UTC देता है।
एंड्रयू बार्टेल

आप सही हैं, ऐसा लगता है कि date_i18n मुख्य रूप से तिथियों के समायोजन के बजाय स्थानीय स्वरूपण के लिए है। मैंने अपना उत्तर अपडेट कर दिया है।
21

हाँ, मैं मैन्युअल रूप से टाइमज़ोन सेट करने से बचने की उम्मीद कर रहा था, लेकिन अगर यह एकमात्र तरीका है, तो यह हो। उत्तर के रूप में चिह्नित, मदद के लिए धन्यवाद।
एंड्रयू बर्टेल

2

date_i18n($format, $timestamp)लोकेल के अनुसार प्रारूप, लेकिन समय क्षेत्र नहीं। get_date_from_gmt($datestring, $format)समयक्षेत्र के अनुसार प्रारूप, लेकिन स्थान नहीं। दोनों समयक्षेत्र और स्थान के अनुसार प्रारूपण प्राप्त करने के लिए , मैं निम्नलिखित कार्य कर रहा हूं:

function local_date_i18n($format, $timestamp) {
    $timezone_str = get_option('timezone_string') ?: 'UTC';
    $timezone = new \DateTimeZone($timezone_str);

    // The date in the local timezone.
    $date = new \DateTime(null, $timezone);
    $date->setTimestamp($timestamp);
    $date_str = $date->format('Y-m-d H:i:s');

    // Pretend the local date is UTC to get the timestamp
    // to pass to date_i18n().
    $utc_timezone = new \DateTimeZone('UTC');
    $utc_date = new \DateTime($date_str, $utc_timezone);
    $timestamp = $utc_date->getTimestamp();

    return date_i18n($format, $timestamp, true);
}

उदाहरण कार्यक्रम:

$format = 'F d, Y H:i';
$timestamp = 1365186960;
$local = local_date_i18n($format, $timestamp);
$gmt = date_i18n($format, $timestamp);
echo "Local: ", $local, " UTC: ", $gmt;

लॉस एंजिल्स के समय क्षेत्र के लिए आउटपुट:

स्थानीय: 05 अप्रैल, 2013 11:36 यूटीसी: अप्रैल 05, 2013 18:36

संदर्भ:


0

अपने टाइमस्टैम्प में टाइमज़ोन ऑफसेट जोड़ें।

$offset = get_option( 'gmt_offset' ) * HOUR_IN_SECONDS;
return date_i18n( get_option( 'date_format' ), $ts + $offset );

या और अच्छा;

$tz = new DateTimeZone( get_option( 'timezone_string' ) );
$offset_for_that_time = timezone_offset_get ( $tz , new DateTime("@{$ts}") );
return date_i18n ( get_option( 'date_format' ), $ts + offset_for_that_time );

0

यूटीसी को टाइमजोन, भाषा और वर्डप्रेस के विकल्पों में प्रारूप में स्ट्रिंग करना

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

उदाहरण के लिए, में गुजर "2019-05-30 18:06:01"(यूटीसी में) वापसी होगी "Maggio 30, 2019 10:06 am"

/**
 * Given a string with the date and time in UTC, returns a pretty string in the
 * configured language, format and timezone in WordPress' options.
 *
 * @param string $utc_date_and_time 
 *      e.g: "2019-05-30 18:06:01"
 *      This argument must be in UTC.
 * @return string 
 *      e.g: "Maggio 30, 2019 10:06 am"
 *      This returns a pretty datetime string in the correct language and
 *      following the admin's settings.
 */
function pretty_utc_date( string $utc_date ): string {
    if (! preg_match( '/^\d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d$/', $utc_date ) ) {
        /* I have not tested other formats, so only this one allowed. */
        throw new InvalidArgumentException( "Expected argument to be in YYYY-MM-DD hh:mm:ss format" );
    }

    $date_in_local_timezone = get_date_from_gmt( $utc_date );

    /* $date_in_local_timezone is now something like "2019-05-30 10:06:01"
     * in the timezone of get_option( 'timezone_string' ), configured in
     * WordPress' general settings in the backend user interface.
     */

    /* Unfortunately, we can't just pass this to WordPress' date_i18n, as that
     * expects the second argument to be the number of seconds since 1/Jan/1970
     * 00:00:00 in the timezone of get_option( 'timezone_string' ), which is not the
     * same as a UNIX epoch timestamp, which is the number of seconds since
     * 1/Jan/1970 00:00:00 GMT. */
    $seconds_since_local_1_jan_1970 =
        (new DateTime( $date_in_local_timezone, new DateTimeZone( 'UTC' ) ))
        ->getTimestamp();
    // e.g: 1559210761

    /* Administrators can set a preferred date format and a preferred time
     * format in WordPress' general settings in the backend user interface, we
     * need to retrieve that. */
    $settings_format = get_option( 'date_format' ) . ' '. get_option( 'time_format' );
    // $settings_format is in this example "F j, Y g:i a"

    /* In this example, the installation of WordPress has been set to Italian,
     * and the final result is "Maggio 30, 2019 10:06 am" */
    return date_i18n( $settings_format, $seconds_since_local_1_jan_1970 );

}

संदर्भ:

  • वर्डप्रेस के get_date_from_gmtडॉक्स
  • DateTimeZone php.net में डॉक्स
  • DateTime डॉक्ससहित php.net मेंgetTimestamp
  • वर्डप्रेस ' date_i18nडॉक्स
  • यह याद रखने योग्य है कि वर्डप्रेस date_default_timezone_set( 'UTC' );यूजर इंटरफेस में चुने गए टाइमजोन की परवाह किए बिना चलता है, इसलिए अंतर्निहित PHP फ़ंक्शन के व्यवहार का निर्धारण करते समय इसे ध्यान में रखें। Php.net में date_default_timezone_setडॉक्स देखें ।

-1

यह मेरी मशीन पर काम करने के लिए लगता है (कोई अन्य काम नहीं किया):

$tz = new DateTimeZone(get_option('timezone_string'));
$dtz = new DateTimeZone('GMT');
foreach($posts as $key => $post){
    $gmt_date = DateTime::createFromFormat('Y-m-d H:i:s', $post->PostDateGMT, $dtz);
    $gmt_date->setTimeZone($tz);
    $posts[$key]->PostDateGMT = $gmt_date->format('Y-m-d H:i:s');
}

मूल कोड: https://www.simonholywell.com/post/2013/12/convert-utc-to-local-time/

यह उपयोग नहीं कर date_l18n()रहा है, लेकिन मुझे लगता है कि कोई इसे बाद में उपयोग कर सकता है ...

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.