मेरे पास एक वेबसाइट है जो एप्लिकेशन का उपयोग करने वाले उपयोगकर्ताओं की तुलना में एक अलग समय क्षेत्र में होस्ट की जाती है। इसके अतिरिक्त, उपयोगकर्ताओं के पास एक विशिष्ट समयक्षेत्र हो सकता है। मैं सोच रहा था कि अन्य SO उपयोगकर्ता और अनुप्रयोग इस तक कैसे पहुँचते हैं? सबसे स्पष्ट हिस्सा यह है कि DB के अंदर, दिनांक / समय UTC में संग्रहीत हैं। जब सर्वर पर, सभी तिथि / समय को यूटीसी में निपटाया जाना चाहिए। हालाँकि, मैं तीन समस्याओं को देख रहा हूँ जिन्हें मैं दूर करने की कोशिश कर रहा हूँ:
UTC में वर्तमान समय प्राप्त करना (आसानी से हल करना
DateTime.UtcNow
)।डेटाबेस से दिनांक / समय खींचना और इन्हें उपयोगकर्ता को दिखाना। विभिन्न विचारों पर तारीखों को प्रिंट करने के लिए संभावित रूप से बहुत सारे कॉल हैं। मैं दृश्य और नियंत्रकों के बीच कुछ परत के बारे में सोच रहा था जो इस मुद्दे को हल कर सकते थे। या
DateTime
(नीचे देखें) पर एक कस्टम एक्सटेंशन विधि है । प्रमुख पक्ष यह है कि दृश्य में डेटाइम का उपयोग करने के प्रत्येक स्थान पर, विस्तार विधि को कॉल किया जाना चाहिए!यह भी कुछ की तरह का उपयोग करने के लिए कठिनाई जोड़ देगा
JsonResult
। अब आप आसानी से कॉल नहीं कर सकतेJson(myEnumerable)
, यह होना ही चाहिएJson(myEnumerable.Select(transformAllDates))
। शायद AutoMapper इस स्थिति में मदद कर सकता है?उपयोगकर्ता से इनपुट प्राप्त करना (लोकल टू यूटीसी)। उदाहरण के लिए, किसी दिनांक के साथ प्रपत्र पोस्ट करने से पहले दिनांक को UTC में परिवर्तित करना होगा। पहली बात जो मन में आती है वह एक रिवाज बना रही है
ModelBinder
।
यहाँ उन एक्सटेंशनों के बारे में बताया गया है जो मैंने विचारों में उपयोग किए हैं:
public static class DateTimeExtensions
{
public static DateTime UtcToLocal(this DateTime source,
TimeZoneInfo localTimeZone)
{
return TimeZoneInfo.ConvertTimeFromUtc(source, localTimeZone);
}
public static DateTime LocalToUtc(this DateTime source,
TimeZoneInfo localTimeZone)
{
source = DateTime.SpecifyKind(source, DateTimeKind.Unspecified);
return TimeZoneInfo.ConvertTimeToUtc(source, localTimeZone);
}
}
मुझे लगता है कि टाइमज़ोन से निपटना एक ऐसी सामान्य बात होगी, बहुत सारे अनुप्रयोगों पर विचार करना अब क्लाउड आधारित है जहां सर्वर का स्थानीय समय अपेक्षित समय क्षेत्र की तुलना में बहुत भिन्न हो सकता है।
क्या इससे पहले इसे सुरुचिपूर्ण ढंग से हल किया गया है? क्या ऐसा कुछ है जो मुझे याद आ रहा है? विचारों और विचारों की बहुत सराहना की जाती है।
संपादित करें: कुछ भ्रम को दूर करने के लिए मैंने सोचा कि कुछ और विवरण जोड़ें। अभी समस्या यह नहीं है कि UTC बार db में कैसे स्टोर किया जाए, यह UTC-> लोकल और लोकल-> UTC से जाने की प्रक्रिया के बारे में अधिक है। @Max Zerbini के अनुसार, यह स्पष्ट रूप से UTC-> स्थानीय कोड को देखने के लिए स्मार्ट है, लेकिन क्या DateTimeExtensions
वास्तव में इसका उत्तर उपयोग कर रहा है ? उपयोगकर्ता से इनपुट प्राप्त करते समय, क्या यह उपयोगकर्ता के स्थानीय समय के रूप में तारीखों को स्वीकार करने के लिए समझ में आता है (क्योंकि जेएस का उपयोग किया जाएगा) और फिर ModelBinder
यूटीसी में बदलने के लिए उपयोग करें ? उपयोगकर्ता के समयक्षेत्र को DB में संग्रहीत किया जाता है और आसानी से पुनर्प्राप्त किया जाता है।
ModelBinder
।