समस्या यह है कि: आपके कोड-बैक को पता है कि क्लाइंट ब्राउज़र का समय क्षेत्र क्या है? मान लें कि उपयोगकर्ता कुछ दिनांक/समय मान (जैसे कि 12/30/2009 14:30) फ़ॉर्म में प्रवेश करता है और इसे सर्वर पर सबमिट करता है। यह मानते हुए कि उपयोगकर्ता ने स्थानीय समय सबमिट किया है, सर्वर कैसे जानता है कि इस मान को यूटीसी में कैसे परिवर्तित किया जाए?
एप्लिकेशन उपयोगकर्ता को समय क्षेत्र निर्दिष्ट करने के लिए कह सकता है (और इसे लगातार कुकी या डेटाबेस में सहेज सकता है), लेकिन इसके लिए उपयोगकर्ता से अतिरिक्त प्रयास करना आवश्यक है, और आपके ऐप को इसके लिए तर्क और स्क्रीन को लागू करने की आवश्यकता होगी । यह अच्छा होगा अगर ऐप क्लाइंट का समय क्षेत्र स्वचालित रूप से निर्धारित कर सकता है।
मैंने जावास्क्रिप्ट के getTimezoneOffset फ़ंक्शन की सहायता से इस समस्या को संबोधित किया है, जो एकमात्र एपीआई है जो क्लाइंट और जीएमटी पर स्थानीय समय के बीच समय के अंतर के बारे में सर्वर को बता सकता है। चूंकि यह क्लाइंट-साइड एपीआई है, मैंने निम्न कार्य किया है: सर्वर की तरफ टाइम ऑफसेट मान रखने वाले कस्टम सत्र कुकी की जांच करें, और यदि यह उपलब्ध नहीं है, तो पृष्ठ को फिर से लोड करें (केवल जीईटी के दौरान, और पोस्ट नहीं, कॉल) टाइम ऑफसेट उत्पन्न करने और कुकी में इसे सहेजने के लिए कुछ जावास्क्रिप्ट तर्क जोड़े गए हैं। क्लाइंट-साइड से यह लगभग पारदर्शी है (एक बार सत्र के दौरान मैं जीईटी पर एक पृष्ठ पुनः लोड करता हूं)। एक बार मेरे पास कुकी में ऑफ़सेट होने के बाद, मैं समय रूपांतरण की दिशा (यूटीसी से स्थानीय समय, या यूटीसी के लिए स्थानीय समय) के आधार पर इसे समय प्रबंधन कार्यों पर लागू करता हूं।
इसमें कुछ समय जटिल लग सकता है, और यह है, लेकिन बाद मैं सहायक कार्यों लिखा था, साइट में इस सुविधा को एकीकृत Page_Load में (पृष्ठों उस समय रूपांतरण की जरूरत के) एक एकल कॉल बनाने की बात थी, और ब्राउज़र से आने और समय मूल्यों को पुनर्प्राप्त करते समय समय रूपांतरण दिनचर्या का उपयोग करना। यह इस प्रकार से इस्तेमाल किया जा सकता का एक उदाहरण है:
using My.Utilities.Web;
...
// Derive the form class from BaseForm instead of Page.
public class WebForm1: BaseForm
{
...
private void Page_Load(object sender, System.EventArgs e)
{
// If we only want to load the page to generate the time
// zone offset cookie, we do not need to do anything else.
if (InitializeLocalTime())
return;
// Assume that txtStartDate is a TextBox control.
if (!IsPostback)
{
// To display a date-time value, convert it from GMT (UTC)
// to local time.
DateTime startDate = GetStartDateFromDB(...);
txtStartDate.Text = FormatLocalDate(startDate);
...
}
else
{
// To save a date-time value, convert it from local
// time to GMT (UTC).
DateTime tempDate = DateTime.Parse(txtStartDate.Text);
DateTime startDate = ConvertLocalTimeToUtc(tempDate);
SaveStartDateInDB(startDate, ...);
...
}
}
...
}
आप अधिक विशिष्ट जानकारी की जरूरत है, बाहर की जाँच It’s About Time: Localizing Time in ASP.NET Applications लेख (खेद है, लेकिन मैं प्रकाशक की साइट पर लेख के लिए एक सीधा लिंक नहीं है, एएसपी के बाद से .NETPRO केवल सशुल्क ग्राहकों तक पहुंच प्रतिबंधित करता है; हालांकि, पीडीएफ प्रतियों के लिंक हैं)। काश मैं लेख से नमूना पोस्ट कर सकता हूं, लेकिन मैं कॉपीराइट का उल्लंघन नहीं करना चाहता; हालांकि, यहां एक project to build a helper library है जिसमें सभी आवश्यक कार्यक्षमता और दस्तावेज़ीकरण (केवल उन चीज़ों को अनदेखा करें जिनकी आपको आवश्यकता नहीं है)।
अद्यतन: आलेख को नए प्रकाशक here द्वारा नमूना प्रोजेक्ट के साथ ऑनलाइन पोस्ट किया गया है।
यह प्रश्न पुराना हो सकता है और एक स्वीकार्य उत्तर हो सकता है, लेकिन यह काफी व्यापक है और उत्तर केवल समस्या के एक पहलू को संबोधित करते हैं। उत्तर भी गलत है, क्योंकि अनुशंसित समाधान में डेलाइट सेविंग टाइम शामिल नहीं है, और 'टाइमज़ोनइन्फो' का उपयोग करता है - जो .NET 2.0 (जो इस प्रश्न की आवश्यकता के रूप में) में उपलब्ध नहीं था। मैं अनुशंसा करता हूं कि इस प्रश्न को बंद या हटा दिया जाए। –