2012-02-19 15 views
7

मैं अगर यह काम करने के लिए जा रहा था, इससे पहले कि मैं मैं कैसे दिनांक और समय को संभालने की एक पूर्ण विकसित refactor पर चला गया पूछना चाहता था।यूटीसी में दिनांक और समय भंडारण और उन्हें PHP में स्थानीय समय परिवर्तित/MySQL

मेरे सवाल फ्रेम करने के लिए, यहाँ मेरी समस्या ... मैं "कार्रवाई" एक इतिहास तालिका में उपयोगकर्ता द्वारा उठाए गए स्टोर है। इन कार्यों में उन पर एक टाइमस्टैम्प है। उपयोगकर्ता दुनिया भर से हो सकते हैं, और इसलिए अलग-अलग समय क्षेत्र हैं। मैं इतिहास में वस्तुओं को प्रदर्शित करना चाहता हूं और किसी के स्थानीय टाइमज़ोन में टाइमस्टैम्प दिखा सकता हूं।

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

क्या यह मेरी समस्या के लिए काम करेगा?

  1. मेरे सर्वर समय क्षेत्र लॉस एंजिल्स

  2. MySQL में एक टाइमस्टैम्प के रूप में स्टोर timestamps हो जाएगा। मेरी समझ यह है कि टाइमस्टैंप हमेशा यूटीसी के रूप में संग्रहीत होता है। रिकॉर्ड्स डिफ़ॉल्ट रूप से create_date के रूप में संग्रहीत किए जाएंगे या मैं स्पष्ट रूप से UTC_TIMESTAMP() सेट कर दूंगा। आकस्मिक रूप से, डीबी में सभी रिकॉर्ड यूटीसी होंगे।

  3. उपयोगकर्ता द्वारा लॉग इन मैं अपने समय क्षेत्र हड़पने होगा (मैं एक उपयोगकर्ता सेटिंग के रूप में db में संग्रहीत कर) है। इस उदाहरण के लिए, मान लें कि यह व्यक्ति न्यूयॉर्क में है।

यहां मेरा प्रश्न है। क्या इनमें से कोई काम होगा?

  1. क) इतिहास डेटा पकड़ो। सभी टाइमस्टैम्प स्वचालित रूप से यूटीसी से लॉस एंजिल्स समय में परिवर्तित हो जाएंगे। पूर्वानुमान इतिहास आइटम, लॉस एंजिल्स टाइमस्टैम्प को न्यूयॉर्क टाइमस्टैम्प और गूंज में परिवर्तित करें।

या

  1. ख) न्यूयॉर्क के लिए php समय क्षेत्र "date_default_timezone_set" सेट करें। इतिहास डेटा पकड़ो। सर्वर द्वारा लॉस एंजिल्स समय में सभी टाइमस्टैम्प अभी भी लॉस एंजिल्स समय हैं। पूर्वानुमान इतिहास आइटम, बस टाइमस्टैम्प गूंजें क्योंकि "date_default_timezone_set" स्वचालित रूप से लॉस एंजिल्स टाइमस्टैम्प को न्यूयॉर्क में परिवर्तित कर देगा।

विल विकल्प 4 बी काम करता है? लॉस एंजिल्स समय से न्यूयॉर्क के समय में बदलने का कोई बेहतर तरीका है?

क्या सामान्य रूप से ऐसा करने का कोई बेहतर तरीका है?

+3

यूटीसी में स्टोर, उपयोगकर्ता को स्थानीय प्रदर्शित करना प्रचलित समाधान है। –

उत्तर

5

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

<?php 

$timeStampFromDatabase = 1325448000; // 01 Jan 2012 20:00:00 GMT 

date_default_timezone_set('America/Los_Angeles'); 
echo date('r', $timeStampFromDatabase); // Sun, 01 Jan 2012 12:00:00 -0800 

date_default_timezone_set('Asia/Hong_Kong'); 
echo date('r', $timeStampFromDatabase); // Mon, 02 Jan 2012 04:00:00 +0800 

आप तेज़ी से अपने समय क्षेत्र बदलने के लिए और एक दिनांक स्वरूप में उत्पादन टाइम स्टांप जारी है और वे PHP में सेट समय क्षेत्र पर आधारित "परिवर्तित" हो जाएगा कर सकते हैं। यह बहुत आसान है, आपको कोई विशेष हैंडलिंग करने की आवश्यकता नहीं है, और इससे कोई फर्क नहीं पड़ता कि आप टाइमज़ोन कहां सेट करते हैं, जब तक आप आउटपुट तिथियों से पहले ऐसा करते हैं, लेकिन आप टाइमज़ोन सेट करने से पहले उन्हें पढ़ सकते हैं।

+1

'date_default_timezone_set' का उपयोग डिफ़ॉल्ट समय क्षेत्र को सेट करने के लिए किया जाता है। मैं इसे एक से अधिक बार सेट नहीं करता। मुझे लगता है कि 'डेटटाइम' ऑब्जेक्ट बनाना बेहतर है और 'डेटटाइम :: सेटटाइमज़ोन()' का उपयोग करें: http://www.php.net/manual/en/function.date-timezone-set.php – CodeZombie

+0

वैसे मैं केवल था बिंदु को चित्रित करने के लिए इसे बदलना। मुझे लगता है कि यह केवल एक बार आवेदन में सेट किया जाएगा, लेकिन आप इसे कई बार स्विच कर सकते हैं। यदि आप इसे स्विच करने में सावधान हैं, तो आप इसे हमेशा बदल सकते हैं और फिर उसे वापस किसी भी समस्या के बिना पिछले मान में बदल सकते हैं। – drew010

+1

सहायता के लिए एक टन धन्यवाद। date_default_timezone_set फ़ंक्शन के संबंध में थोड़ा नया प्रश्न। क्या यह एक सेटिंग है जो केवल वर्तमान उपयोगकर्ता को प्रभावित करती है या यह वैश्विक प्रणाली परिवर्तनीय है? यदि यह वैश्विक वैर है, तो क्या यह विभिन्न समय क्षेत्रों में सभी उपयोगकर्ताओं के बीच समस्याएं पैदा नहीं कर सकता है? – jsheir

3

दुर्भाग्य से, "date_default_timezone_set" जिस तरह से मैंने सोचा था, उस तरह काम नहीं कर रहा था। पिछले उदाहरण के अनुसार, यह काम करेगा यदि मैं जिन तिथियों के साथ काम कर रहा था वे पहले से ही यूनिक्स टाइमस्टैम्प प्रारूप में थे। हालांकि, उन्हें "वाई-एम-डी एच: आई: एस" में स्वरूपित किया गया था और एकमात्र चीज जो बदल जाएगी जीएमटी ऑफ़सेट थी, जो स्पष्ट रूप से काम नहीं करती थी।

कुछ घंटों के बाद, यहां मैं समय रूपांतरणों को संभालने में सक्षम था।

$datetime = new DateTime($date_to_convert); 
$usertimezone = new DateTimeZone($_SESSION['timezone']); //each user has their own timezone i store in a session (i.e. - "Americas/Los_Angeles") 
$datetime->setTimezone($usertimezone); 
echo $datetime->format("Y-m-d H:i:s"); 

मुझे लगता है कि मैं भी निम्न कर सकते थे:

Pseudo code 
strtotime($datetime) 
date_default_timezone_set($user_timezone) 
echo date(format, $datetime) 

ऊपर, मुझे लगता है, यह देखते हुए $ user_timezone में तर्क है संभाल करने के लिए तिथि समारोह मजबूर होना पड़ा। हिंडसाइट में, मुझे प्रत्येक $ डेटाटाइम -> unix_timestamp -> $ datetime_converted का अनुवाद करना होगा, जो मैंने जो करना चुना उससे कहीं ज्यादा बेहतर नहीं लगता है।

1

हमेशा अपने टाइमस्टैम्प को डेटाबेस में यूटीसी के रूप में स्टोर करें। यह समय-समय पर एक टाइमज़ोन और डेलाइट बचत स्वतंत्र बिंदु है। अपने समय क्षेत्र के उपयोगकर्ता को यह वापस दिखाने के लिए, कार्य करें:

$users_timezone = 'Europe/London'; // See PHP documentation for names that can be used. 
$date = new DateTime(); 
$date->setTimestamp($timestamp_from_database); 
$date->setTimezone(new DateTimeZone($users_timezone)); 
echo $date->format("H:ia jS F Y"); 
0

डिफ़ॉल्ट रूप से, यूनिक्स टाइमस्टैम्प यूटीसी में हमेशा से रहे। यदि हम यूटीसी में हमारे डेटाबेस में टाइमस्टैम्प स्टोर करते हैं, तो हमें केवल निम्नलिखित PHP स्क्रिप्ट का उपयोग करने की आवश्यकता है:

<?php 

$TZ_UTC = new DateTimeZone('UTC'); //-->Database Timezone; 
$TZ_LOCAL = new DateTimeZone('America/New_York'); //-->Expected Local Timezone from user settings; 

//--Example Database Query-- 
while($row = mysqli_fetch_array($result, MYSQLI_ASSOC)) { 
    //---If we want to show UTC timezone directy---- 
    echo $row['action_timestamp']; 

    //---If we want to show LOCAL timezone from user settings---- 
    $dateObj = new DateTime($row['action_timestamp'], $TZ_UTC); 
    $dateObj->setTimezone($TZ_LOCAL); //--> Here is the conversion! 
    echo $dateObj->format("Y-m-d H:i:s T"); 
} 
?> 
संबंधित मुद्दे