2011-05-11 14 views
9

हमारे पास एक एमवीसी प्रोजेक्ट है और मुझे स्थानीय समय में उपयोगकर्ताओं को परिवर्तित यूटीसी तिथि प्रदर्शित करने की आवश्यकता है। अपने मॉडल में मैं यूटीसी तारीख गुजर रहा हूँ और ध्यान में रखते हुए मैं निम्न कार्य करने की कोशिश कर रहा हूँ:एमवीसी - स्थानीय समय के लिए यूटीसी दिनांक

<%: Html.DisplayFor(m=> m.SomeDate.ToLocalTime()) %> 

यह एक अपवाद फेंकता है। क्या कोई मुझे सही दिशा में इंगित कर सकता है कि ग्राहक अंत में प्रदर्शन के लिए यूटीसी तिथि को स्थानीय डेटाटाइम में कैसे परिवर्तित किया जाए। हम यूटीसी के रूप में तारीखों को संग्रहित करेंगे और प्रदर्शन समय पर इन तिथियों को स्थानीय मशीन समकक्ष में परिवर्तित करने की आवश्यकता होगी।

+0

संबंधित देखें: [http://stackoverflow.com/questions/4066275/c-utc-to-users-local-time](http://stackoverflow.com/questions/4066275/c-utc -to-users-local-time) –

+0

आपका कोड सर्वर-साइड क्लाइंट-साइड नहीं है। मुझे एहसास है कि यह नीचे टिप्पणियों में ध्वजांकित है लेकिन यह एक लोकप्रिय सवाल है और इसके बारे में पूछे जाने वाले तरीके से इसका अस्पष्ट है! – noelicus

उत्तर

7
DateTime now = DateTime.UtcNow; 
DateTime localNow = TimeZoneInfo.ConvertTimeFromUtc(now, TimeZoneInfo.Local); 
+0

यह सर्वर पक्ष पर किया जाना चाहिए जबकि मैं क्लाइंट साइड – Amitesh

+3

@ एमितेश के बारे में बात कर रहा हूं, उदाहरण के उदाहरण में आप सर्वर की ओर से तारीख को रूपांतरित करने का प्रयास कर रहे हैं। –

+0

मैं <%: Html.DisplayFor (m => m.SomeDate.ToLocalTime())%> का उपयोग कर क्लाइंट साइड पर स्थानीय तिथि को बदलने की कोशिश कर रहा हूं। – Amitesh

9

आप उपयोगकर्ता समयक्षेत्र सर्वर साइड की दुकान और फिर कुछ इस तरह का उपयोग (हालांकि यह नियंत्रक, नहीं ध्यान में रखते हुए किया जाना चाहिए) की आवश्यकता होगी:

@TimeZoneInfo.ConvertTimeFromUtc(Model.CreatedOn, TimeZoneInfo.FindSystemTimeZoneById("E. Australia Standard Time")) 
2

यह थोड़ा की तरह लगता है एक kludge की लेकिन यह एक MVC3 ग्राहक

@DateTime.Parse(Html.DisplayFor(m=> m.SomeDate).ToString()).ToLocalTime().ToString() 
+0

मुझे यह पसंद है। यह साफ है और दृश्य में वहां बैठता है। यदि आप अलग-अलग विचारों के लिए प्रारूपित करना चाहते हैं, तो यह आसान है - अच्छी तरह से किया गया। यह केवल एक झुकाव की तरह दिखता है। –

+3

यह मेरे लिए सभी सर्वर-साइड दिखता है .... ?? – noelicus

4

में काम किया MVC में आप कार्रवाई फिल्टर करके इस समस्या को हल कर सकते हैं। कृपया निम्नलिखित चरणों का उपयोग करें:
1) सत्र में क्लाइंट टाइमज़ोन ऑफसेट जानकारी स्टोर करें।
2) डेटाटाइम कनवर्टर सहायक वर्ग बनाएँ।

public class DateTimeConverter 
{ 
    public static DateTime? ToLocalDatetime(DateTime? serverDate, int offset)  
    { 
     if (serverDate == null) return null; 
     return serverDate.Value.AddMinutes(offset * -1); 
    } 

} 

3)। कार्रवाई फ़िल्टर बनाएं।

public class LocalDateTimeConverter : ActionFilterAttribute 
{ 
    public override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     var model = filterContext.Controller.ViewData.Model; 
     if (model != null && filterContext.HttpContext.Session["LocalTimeZoneOffset"] != null) 
      ProcessDateTimeProperties(model, filterContext); 
     base.OnActionExecuted(filterContext); 
    } 

    private void ProcessDateTimeProperties(object obj, ActionExecutedContext filterContext) 
    { 
     if (obj.GetType().IsGenericType) 
     { 
      foreach (var item in (IList)obj) 
      { 
       ProcessDateTimeProperties(item, filterContext); 
      } 
     } 
     else 
     { 
      TypeAccessor member; 
      List<PropertyInfo> props = new List<PropertyInfo>(); 
      props.AddRange(obj.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.SetProperty).ToList()); 
      member = TypeAccessor.Create(obj.GetType()); 
      foreach (PropertyInfo propertyInfo in props) 
      { 
       if (propertyInfo.PropertyType == typeof(DateTime) || propertyInfo.PropertyType == typeof(DateTime?)) 
       { 
        { 
         member[obj, propertyInfo.Name] = DateTimeConverter.ToLocalDatetime((DateTime?)propertyInfo.GetValue(obj), ((int)filterContext.HttpContext.Session["LocalTimeZoneOffset"])); 
        } 
       } 
       else if (propertyInfo.PropertyType.IsGenericType && propertyInfo.GetValue(obj) != null) 
       { 
        foreach (var item in (IList)propertyInfo.GetValue(obj)) 
        { 
         ProcessDateTimeProperties(item, filterContext); 
        } 
       } 
      } 
     } 
    } 
} 

4) जो दृश्य वापस जाने के लिए मॉडल डेटा शामिल कार्रवाई पर .Apply LocalDateTimeConverter फिल्टर।

इन सभी चरणों के बाद आप परिणाम देख सकते हैं जिसमें डेटटाइम जानकारी स्थानीय दिनांक समय में परिवर्तित होती है। इस कोड को स्थानीय समय में UTC समय परिवर्तित करने के लिए

<%: Html.DisplayFor(m=> m.SomeDate.ToLocalTime().ToString()) %> 

0

उपयोग आप उस्तरा

@Html.DisplayFor(m=> m.SomeDate.ToLocalTime().ToString()) 
+0

मुझे नहीं लगता कि यह काम करता है। आपको अपवाद मिलता है: System.InvalidOperationException: 'टेम्पलेट का उपयोग केवल फ़ील्ड एक्सेस, प्रॉपर्टी एक्सेस, सिंगल-आयाम सरणी इंडेक्स, या सिंगल-पैरामीटर कस्टम इंडेक्सर एक्सप्रेशन के साथ किया जा सकता है।' – mikecamimo

0

सभी अच्छे जवाब में कोड निम्नलिखित उपयोग कर सकते हैं। मैं मेरा इस तरह से किया था:

@Html.DisplayFor(m=> m.SomeDate.ToLocalTime().ToString(CultureInfo.CurrentUICulture.DateTimeFormat.ShortDatePattern + " " + CultureInfo.CurrentUICulture.DateTimeFormat.LongTimePattern))

0

परिवर्तित यूटीसी दिनांक समय LOCALDATE रूप में अच्छी तरह jQuery का उपयोग किया जा सकता है। Jquery का उपयोग करके इसे करने का मुख्य लाभ यह है कि आपने अपनी वेबसाइट को एज़ूर पर होस्ट किया है। ऊपर दिए गए कुछ तरीके काम नहीं करेंगे। उपयोग करने के लिए केवल एक विकल्प छोड़ा जाएगा जो jquery/जावास्क्रिप्ट का उपयोग कर रहा है। डेटाटाइम के रूप में.अब आपकी वेबसाइट को अज़ूर पर होस्ट किया गया है, तो डेटाटाइम के लिए यूटीसी समय वापस कर देगा .now.tolocaltime()। यूटीसी समय को स्थानीय समय पर बदलने के लिए कृपया jquery में एक उदाहरण नीचे पाएं।

var date = new Date('2/8/2018 3:57:48 PM UTC'); 
date.toString() // "Thu Feb 08 2018 21:27:48 GMT+0530 (India Standard Time)" 
संबंधित मुद्दे