2012-04-17 17 views
13

तो मेरे पास एक टिप्पणी सुविधा वाला एक साइट है जहां टिप्पणी का टाइमस्टैम्प एक MySQL डेटाबेस में संग्रहीत किया जाता है। जो मैं समझता हूं, उस समय टाइमस्टैम्प को यूटीसी में परिवर्तित किया जाता है, फिर पुनर्प्राप्त होने पर डिफ़ॉल्ट टाइमज़ोन में परिवर्तित कर दिया जाता है। मेरे मामले में, मेरा सर्वर सेंट्रल डेलाइट टाइम टाइमज़ोन (सीडीटी) में है।PHP और MySQL: संग्रहीत टाइमस्टैम्प को उपयोगकर्ता के स्थानीय टाइमज़ोन में परिवर्तित करना

मेरे पास प्रत्येक उपयोगकर्ता से एंट्री फॉर्म के माध्यम से टाइमज़ोन प्राप्त करने की योजना है। मैं सिर्फ यह जानना चाहता था कि टाइमस्टैम्प मूल्य को उपयोगकर्ता के टाइमज़ोन में कैसे परिवर्तित करें।

  • सबसे पहले, क्या मैं यूटीसी से स्थानीय टाइमज़ोन में बदल जाऊंगा? या सीडीटी स्थानीय टाइमज़ोन के लिए?
  • दूसरा, मैं PHP में ऐसा करने के बारे में कैसे जाऊं? मैं तो बस करना होगा:
 
$userTimezone = new DateTimeZone($userSubmittedTimezoneString); 
$myDateTime = new DateTime($storedTimestamp, $userTimezone); 

... या यह है कि सही नहीं?

+2

नहीं, टाइमस्टैम्प को mysql में संग्रहीत किया जाता है, लेकिन बिना किसी TZ डेटा के। यदि आप डीबी में "3 अपराह्न, सीएसटी" डालें, तो 3 बजे, सीएसटी संग्रहीत है। आपके द्वारा डालने से पहले आपको यूटीसी में कनवर्ट करने की आवश्यकता होगी ताकि आपके पास अन्य TZs में कनवर्ट करने के लिए एक सामान्य अपरिवर्तनीय आधार हो। –

उत्तर

20

दिनांक/समय/दिनांक मान MySQL में जमा हो जाती है के रूप में आप उन्हें आपूर्ति। अर्थात। यदि आप INSERT स्ट्रिंग 2012-04-17 12:03:23DATETIME कॉलम में हैं, तो वह मान संग्रहीत किया जाएगा। इसे आंतरिक रूप से एक टाइमस्टैम्प में परिवर्तित किया जाएगा जो सटीक हो सकता है या नहीं (नीचे देखें), लेकिन जब आप फिर से मान के लिए पूछते हैं, तो आपको वही मान वापस मिल जाएगा; राउंडट्रिप पारदर्शी है।

यदि आप SQL के अंदर समय गणना करने का प्रयास करते हैं तो समस्याएं हो सकती हैं। अर्थात। कोई भी ऑपरेशन जिसके लिए एसक्यूएल को टाइमज़ोन और/या सर्वर समय को ध्यान में रखना आवश्यक है। उदाहरण के लिए, NOW() का उपयोग करना। उन किसी भी परिचालन के लिए, टाइमज़ोन और/या सर्वर समय सही ढंग से सेट होना चाहिए। Time Zone Problems देखें।

यदि यह आपको चिंता नहीं करता है और आपको केवल PHP में गणना करने की आवश्यकता है, तो आपको केवल यह सुनिश्चित करने की आवश्यकता है कि आप किस टाइमज़ोन से समय-समय पर कनवर्ट करना चाहते हैं। उस उद्देश्य के लिए यह यूटीसी को हर समय मानकीकृत करने के लिए सुविधाजनक हो सकता है, लेकिन यह आवश्यक नहीं है, किसी भी समय क्षेत्र से किसी भी समय क्षेत्र में टाइमज़ोन रूपांतरणों के साथ ही, जब तक आप स्पष्ट हैं कि आप किस समय के बारे में स्पष्ट हैं से और करने के लिए परिवर्तित।

date_default_timezone_set('Asia/Tokyo'); // your reference timezone here 

$date = date('Y-m-d H:i:s'); 

/* INSERT $date INTO database */; 

$date = /* SELECT date FROM database */; 

$usersTimezone = new DateTimeZone('America/Vancouver'); 
$l10nDate = new DateTime($date); 
$l10nDate->setTimeZone($usersTimezone); 
echo $l10nDate->format('Y-m-d H:i:s'); 
+0

यह कोड मेरी आवश्यकताओं के अनुरूप सर्वोत्तम है। हालांकि, मुझे लगता है कि टाइमज़ोन को इस तरह से स्टोर करना बेहतर हो सकता है: http://blog.benkuhl.com/2009/12/timezone-list-in-mysql/ निर्दिष्ट ऑफ़सेट के साथ। यह उपयोगकर्ता को विकल्प पेश करने का एक बेहतर तरीका है। समय-समय पर संग्रहीत समय क्षेत्र के साथ, और यदि मुझे सर्वर का टाइमज़ोन (जो सीडीटी लगता है) पता है, तो मैं डेटाबेस में संग्रहीत 'TIMESTAMP' मानों पर ज्ञात ऑफ़सेट (उदा। -5.0, 3.0) का उपयोग कैसे कर सकता हूं? – TerranRich

+0

@Terran आप वास्तव में ऑफ़सेट द्वारा न केवल अपने नामांकित पहचानकर्ताओं द्वारा टाइमज़ोन का उपयोग करना चाहते हैं। स्थानीय डेलाइट सेविंग नियमों के आधार पर साल भर ऑफसेट बदलते हैं, और वे सभी अलग हैं। यदि उपयोगकर्ता आज "डीएसटी -06: 00" चुनता है, तो आपको पता नहीं है कि कौन सा टाइमज़ोन है और जब यह "डीएसटी -07: 00" या "डीएसटी -05: 00" में बदल जाएगा। आपको उपयोगकर्ता को नामित टाइमज़ोन चुनने देना है। जब आप चाहें तो उपयोगकर्ता उस समय ऑफसेट की गणना और प्रदर्शन कर सकता है जब आप इसे चुनना चाहते हैं। – deceze

+0

ठीक है, इसलिए उपयोगकर्ताओं को चुनने के लिए सूची बॉक्स पेश करते समय, डेटाबेस में भेजे गए मान 'अमेरिका/न्यू_यॉर्क' जैसी चीजें होंगी ... क्या 'अमेरिका/न्यू_यॉर्क' के * वर्तमान * ऑफसेट को प्रदर्शित करने का कोई तरीका है उन्हें विकल्प देने पर जीएमटी के लिए एट अल? \t शायद http://stackoverflow.com/questions/1727077/generating-a-drop-down-list-of-timezones-with-php के उत्तर की तरह कुछ उपयोगकर्ता के लिए सूची उत्पन्न करने का तरीका होगा ? – TerranRich

1

उपयोगकर्ता का टाइमज़ोन प्राप्त करने का कोई विश्वसनीय तरीका नहीं है। टाइमज़ोन जानकारी HTTP शीर्षकों में नहीं भेजी जाती है। सबसे अच्छा है कि तुम कर सकते हो या तो:

  1. मैच भौगोलिक डेटाबेस againsta आईपी पते -या-
  2. उपयोगकर्ता के कंप्यूटर पर स्थापना के लिये और
  3. उपयोग जावास्क्रिप्ट समय और या तो सर्वर से भेजने (AJAX) या ग्राहक पर समय स्ट्रिंग बनाते हैं।
+4

वह पहले से ही टाइमज़ोन पाने का एक तरीका है। वह उपयोगकर्ताओं को उन टाइमज़ोन का चयन करने के लिए कह रहा है, जो वे चाहते हैं। वह जो चाहता है वह समय को निर्दिष्ट समय क्षेत्र में बदलने का एक तरीका है। – Jack

+0

मैं देखता हूं, धन्यवाद जैक। – dotancohen

0
$timezone = new DateTimeZone('America/Vancouver'); 

$date = new DateTime(date('m/d/Y h:i:s a', time())); 
$date->setTimeZone($timezone); 
echo $date->format('l F j Y g:i:s A')."\n"; 

new DateTime("UTC Time");

साथ new DateTime(date('m/d/Y h:i:s a', time())); बदलें आप प्रत्येक उपयोगकर्ता इनपुट के लिए एक नया DateTimeZone() वस्तु बना सकते हैं।

0

ऐसा करने का तरीका जावास्क्रिप्ट का उपयोग करना है। मुझे लगता है कि ऐसा करने का सबसे अच्छा तरीका उपयोगकर्ताओं को जीएमटी को अपनी कुकीज़ में संग्रहीत करना और PHP प्रक्रिया प्रपत्र पर पुनर्प्राप्त करना है।

<script language="javascript"> 

function TimeZoneCookie() 
{ 
var u_gmt = (-(new Date().getTimezoneOffset()))/60; 
var o_date = new Date("December 31, 2025"); 
var v_cookie_date = o_date.toGMTString(); 
var str_cookie = "utimezone="+u_gmt; 
str_cookie += ";expires=" + v_cookie_date; 
document.cookie=str_cookie; 
} 
//--------------------- 
TimeZoneCookie(); 

</script> 

u_gmt समझाया:

  1. Date().getTimezoneOffset() रिटर्न जीएमटी 0 को ऑफसेट मिनट में
  2. के बाद से getTimezoneOffset() जीएमटी 0 से जीएमटी 0 को ऑफसेट और नहीं वापस आ जाएगी हमें इसे चारों ओर चालू करने की आवश्यकता होगी। कैसे? सरल, बस यह जानकर कि -*-=+ & -*+=-। यदि आप मूल गणित जानते हैं, तो आप पहले से ही इस सिद्धांत को जानते हैं।
  3. जैसा कि मैंने चरण 1getTimezoneOffset() में ऑफसेट को मिनटों में वापस कर दिया है, इसलिए हम इसे 60 तक विभाजित करेंगे, इसलिए हम जीएमटी ऑफ़सेट प्रारूप प्राप्त कर सकते हैं।

परिणाम:(-(new Date().getTimezoneOffset()))/60


अब PHP में कुकी निकाल:

<?php 

$user_timezone = $_COOKIE['utimezone']; 

?>