2011-09-01 11 views
27

द्वारा टाइमज़ोन सेट करना जावास्क्रिप्ट का उपयोग करके मुझे पता है कि मेरे उपयोगकर्ता टाइमज़ोन यूटीसी +3 है।php: यूटीसी ऑफसेट

अब मैं इस ज्ञान के साथ दिनांक समय वस्तु बनाने के लिए करना चाहते हैं:

$usersNow = new DateTime('now', new DateTimeZone("+3")); 

मैं एक respsonse के रूप में प्राप्त करते हैं:

'Unknown or bad timezone (+2)' 

क्या मैं गलत कर रहा हूँ? मैं कैसे ठीक कर सकता हूं?

उत्तर

35

की आवश्यकता है कि कैसे इस बारे में ...

$original = new DateTime("now", new DateTimeZone('UTC')); 
$timezoneName = timezone_name_from_abbr("", 3*3600, false); 
$modified = $original->setTimezone(new DateTimezone($timezoneName)); 
+0

नहीं कर सकते हैं +3 केवल एक उदाहरण है। – shealtiel

+0

यूटीएफ ऑफ़सेट – minaz

+0

+1 का उपयोग करने के लिए संपादित किया गया है ताकि एक और + 3 ^^ (बस मजाक कर रहा हो, आपका जवाब सही है)। –

1

जहां तक ​​मैं DateTimeZone पर दस्तावेज़ों से कह सकता हूं, आपको एक वैध समय क्षेत्र पारित करने की आवश्यकता है और यहां valid हैं। others देखें, कुछ आपकी मदद कर सकता है।

0

DateTimeZone एक समयक्षेत्र एक offest नहीं

+8

और कैसे मैं एक समय क्षेत्र केवल यूटीसी जानने ऑफसेट सेट कर सकते हैं? – shealtiel

+0

@shealtiel आप –

1

आप इस

http://php.net/manual/en/function.strtotime.php

<?php 
    echo strtotime("now"), "\n"; 
    echo strtotime("10 September 2000"), "\n"; 
    echo strtotime("+5 hours"); 
    echo strtotime("+1 day"), "\n"; 
    echo strtotime("+1 week"), "\n"; 
    echo strtotime("+1 week 2 days 4 hours 2 seconds"), "\n"; 
    echo strtotime("next Thursday"), "\n"; 
    echo strtotime("last Monday"), "\n"; 
    ?> 
+0

यह काम कर सकता है। सही समय की गणना करने के लिए मुझे वास्तव में टाइमज़ोन नाम की आवश्यकता नहीं है। तो "+3 घंटे" चाल ठीक करेगा – shealtiel

8

तुमने कहा था की कोशिश की:

जावास्क्रिप्ट का उपयोग करके मुझे पता है कि मेरे उपयोगकर्ता टाइमज़ोन यूटीसी +3 है। सकारात्मक मूल्यों यूटीसी के पश्चिम गिरने के साथ

var offset = new Date().getTimezoneOffset(); 

यह वर्तमान मिनट में यूटीसी से ऑफसेट देता है,:

आप शायद कुछ इस तरह भाग गया। यह नहीं एक समय क्षेत्र लौटाता है!

एक समय क्षेत्र ऑफ़सेट नहीं है। एक समय क्षेत्र में एक ऑफ़सेट है। इसमें कई अलग ऑफसेट हो सकते हैं। अक्सर दो ऑफ़सेट होते हैं, एक मानक समय के लिए और एक डेलाइट सेविंग टाइम के लिए। एक एकल संख्यात्मक मूल्य अकेले इसका प्रतिनिधित्व नहीं कर सकता है। एक समय क्षेत्र के

  • उदाहरण: "America/New_York"
    • संगत मानक ऑफसेट: UTC-5
    • संगत दिन के उजाले ऑफसेट: UTC-4

दो ऑफसेट इसके अलावा, यह भी कहा कि में लिपटे समय क्षेत्र दो ऑफ़सेट के बीच संक्रमण के लिए दिनांक और समय है ताकि आप जानते हों कि वे कब ऐप करते हैं ly। समय के साथ ऑफ़सेट और संक्रमण कैसे बदल सकते हैं इसका एक ऐतिहासिक रिकॉर्ड भी है।

the timezone tag wiki में "समय क्षेत्र! = ऑफसेट" भी देखें।

अपने उदाहरण मामले में, आप शायद जावास्क्रिप्ट से -180 के एक मूल्य प्राप्त किया, एक वर्तमान UTC + 3 की भरपाई का प्रतिनिधित्व। लेकिन यह उस समय के विशेष बिंदु के लिए ऑफसेट है! यदि आप minaz's answer का पालन करते हैं, तो आपको एक समय क्षेत्र मिलेगा जो यह मानता है कि यूटीसी + 3 हमेशा सही ऑफसेट है। यह काम करेगा यदि वास्तविक समय क्षेत्र "Africa/Nairobi" जैसा कुछ है जिसने कभी भी यूटीसी + 3 को छोड़कर कुछ भी उपयोग नहीं किया है। लेकिन आप सभी जानते हैं कि आपका उपयोगकर्ता "Europe/Istanbul" में हो सकता है, जो गर्मियों में यूटीसी + 3 और सर्दियों में यूटीसी + 2 का उपयोग करता है।

+3

यह उत्तर रास्ता अधिक अपवर्तनीय है। @shealtiel चुनौती का बहुत विस्तृत स्पष्टीकरण सामना कर रहा है। –

1

किसी भी व्यक्ति के लिए जो इस पर आता है, मुझे एक ही समस्या का सामना करना पड़ रहा था, इसलिए अंत में मैंने डेटटाइम कक्षा को बढ़ाया और __construct() विधि को ओवरज़ोन के बजाय ऑफसेट (मिनटों में) स्वीकार करने के लिए ओवरराइड किया।

वहाँ से, अपने कस्टम __construct() बाहर काम करता है क्या ऑफसेट घंटे और मिनट (जैसे -660 = +11: 00) में है और उसके बाद parent::__construct() का उपयोग करता है मेरी तारीख सौंपने के लिए, कस्टम मेरी ऑफसेट, वापस मूल करने के लिए शामिल करने के लिए स्वरूपित दिनांक समय।

क्योंकि मैं हमेशा अपने आवेदन में यूटीसी बार साथ काम कर रहा हूँ, मेरी कक्षा भी घटाकर ऑफसेट, तो आधी रात यूटीसी गुजर और एक -660 की भरपाई मुझे 11:00

मेरे समाधान है दिखाएगा द्वारा UTC समय को संशोधित करता है यहाँ विस्तृत: https://stackoverflow.com/a/35916440/2301484

0

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

public static function applyHourOffset(DateTime $dateTime, int $hourOffset):DateTime 
{ 
    $dateWithTimezone = clone $dateTime; 

    $sign = $hourOffset < 0 ? '-' : '+'; 
    $timezone = new DateTimeZone($sign . abs($hourOffset)); 
    $dateWithTimezone->setTimezone($timezone); 

    return $dateWithTimezone; 
} 

नोट: मैं स्वीकार किए जाते हैं जवाब की वजह से उत्पादन में एक टूटना था।

0

मुझे जॉय रिवेरा के लिंक के समाधान के लिए निर्देशित किया गया था। दूसरों ने जो कहा है, वैसे ही टाइमज़ोन ऑफसेट नहीं है, आपको वैध टाइमज़ोन की आवश्यकता है। एम एम प्रारूप:

यह वही है मैं अपने आप को

$singapore_time = new DateTime("now", new DateTimeZone('Asia/Singapore')); 


var_dump($singapore_time); 

के लिए उपयोग कर रहा हूँ मैं अपने आप को यह बहुत अधिक सुविधाजनक YYYY-MM-YYY HH के साथ काम करने के लिए मिल गया है है। उदाहरण।

$original = new DateTime("2017-05-29 13:14", new DateTimeZone('Asia/Singapore')); 
संबंधित मुद्दे