2013-01-20 22 views
10

मुझे JSON क्रमबद्ध ऑब्जेक्ट का उपयोग कर क्लाइंट के ब्राउज़र पर सही तिथि प्रदर्शित करने में समस्याएं आ रही हैं। उपयोगकर्ता परिभाषित करने में सक्षम है कि वे किस समय क्षेत्र को डेटा देखना चाहते हैं। यह देखते हुए, मैं यूटीसी तिथि को सर्वर पर उपयोगकर्ता के समय क्षेत्र में परिवर्तित करता हूं। फिर मैं JSON के माध्यम से ब्राउज़र में दिनांक/समय (जो पहले से ही उनके निर्धारित समय क्षेत्र में परिवर्तित हो) को क्रमबद्ध करना चाहता हूं।JSON दिनांक सीरियलाइजेशन और समय क्षेत्र

सरल लगता है, हालांकि जेएसओएन धारावाहिकों का उपयोग मैं कर रहा हूं, मेरी तिथियों को गंभीर रूप से मिल रहा है। सर्वर यूटीसी में है और ग्राहक सेंट्रल (-6) में है। तारीखों को समायोजित किया जा रहा है (-12 घंटे) भले ही मैं डेटटाइम निर्दिष्ट कर रहा हूं। निर्दिष्ट न करें।

किसी भी तरह .NET जानता है कि क्लाइंट का ब्राउज़र किस समय क्षेत्र में है और सर्वर किस समय क्षेत्र में है और यह मेरी तिथियों/समय से -6 को अस्वीकार कर रहा है, भले ही मैंने उपयोगकर्ता की वैश्विक सेटिंग्स के प्रति समय पहले ही समायोजित कर दिया हो और तारीखों को निर्दिष्ट नहीं किया जाना चाहिए। मैं अपनी तिथियों को आजमाने और समायोजित करने के लिए JSON serializers कैसे प्राप्त कर सकता हूं?

List<ErrorGridModel> models = Mapper.Map<ErrorCollection, List<ErrorGridModel>>(errors); 
foreach (ErrorGridModel m in models) 
{ 
    //convert UTC dates to user local dateTime - split out date vs. time for grouping & splitting columns 
    DateTime dtLocal = TimeZoneInfo.ConvertTimeFromUtc(m.ErrorDate, this.AppContext.User.TimeZoneInfo); 
    m.ErrorDate = new DateTime(dtLocal.Year, dtLocal.Month, dtLocal.Day, 0, 0, 0, DateTimeKind.Unspecified); 
    m.ErrorTime = new DateTime(1900, 1, 1, dtLocal.Hour, dtLocal.Minute, dtLocal.Second, DateTimeKind.Unspecified); 
} 
IQueryable<ErrorGridModel> dataSource = models.AsQueryable(); 
return new ContentResult() { Content = JsonConvert.SerializeObject(dataSource.ToDataSourceResult(request), new JsonSerializerSettings() { DateFormatHandling = DateFormatHandling.MicrosoftDateFormat }), ContentType = "application/json" }; 
//return Json(dataSource.ToDataSourceResult(request)); 

आईएसओ दिनांकों काम करने के लिए दिखाई देते हैं, लेकिन मैं उन्हें उपयोग नहीं कर सकते के रूप में मैं 3 पार्टी नियंत्रण है कि पुराने माइक्रोसॉफ्ट प्रारूप ... जो मुझ पर समय क्षेत्रों समायोजित कर देता है चाहते हैं।

+0

यह आपकी समस्या का उत्तर नहीं है, लेकिन आप जावास्क्रिप्ट को तारीख तर्क पुश करने के लिए चाहते हैं - moment.js http://momentjs.com/ –

उत्तर

1

यहाँ सटीक स्थिति है कि मैं में किया गया है पर एक लंबे चर्चा है। http://www.telerik.com/community/forums/aspnet-mvc/grid/grids-and-dates.aspx

नीचे लाइन, यदि आप Microsoft JSON दिनांक स्वरूप का उपयोग कर रहे है, यह हमेशा मिलीसेकेंड की संख्या के रूप में यूटीसी में तारीख को प्रतिबिंबित करेगा (टिक) 1/1/1970 यूटीसी से। समय पर सर्वर पर स्थानीय रूप से ऑटो-कन्वर्ट करने का कोई तरीका नहीं है और जेएसओएन के माध्यम से केंडो ग्रिड में इसे नीचे भेजना चाहिए क्योंकि केंडो ग्रिड नियंत्रण जेएस में यूटीसी के रूप में टिकों की तारीख को तुरंत चालू करता है। इस तिथि को प्रदर्शित करते समय, यह मान को ब्राउज़र के स्थानीय समय क्षेत्र में स्वतः रूपांतरित कर देगा।

सर्वर से मेरे सर्वर के रूपांतरित दिनांक मूल्य को दिखाने का एकमात्र तरीका क्लाइंट को स्ट्रिंग के रूप में JSON के माध्यम से दिनांक भेजना है।

+1

आपका केंडो लिंक टूटा हुआ है, क्या आपके पास अच्छा लिंक है ... यहां एक ही समस्या है। – felickz

4

जब आप ऑफ़सेट को नियंत्रित करने का प्रयास कर रहे हैं, तो DateTimeKind.Unspecified पर भरोसा न करें। इसमें कुछ क्विर्क हैं जिन्हें अक्सर Unspecified == Local के रूप में व्याख्या किया जाता है। Json.Net को विशेष ऑफसेट को विशेष रूप से एन्कोड करने का एकमात्र तरीका (आईएसओ या एमएस प्रारूप के बावजूद) DateTime के बजाय इसे DateTimeOffset पास करना है।

// Start with the UTC time, for example your m.ErrorDate. 
// Here I demonstrate with UtcNow. Any DateTime with .Kind = UTC is ok. 
var dt = DateTime.UtcNow; 

// Use the appropriate time zone, here I demonstrate with EST. 
var tzi = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time"); 

// Get the offset from UTC for the time zone and date in question. 
var offset = tzi.GetUtcOffset(dt); 

// Get a DateTimeOffset for the date, and adjust it to the offset found above. 
var dto = new DateTimeOffset(dt).ToOffset(offset); 

// Serialize to json 
var json = JsonConvert.SerializeObject(dto, new JsonSerializerSettings 
    { 
     DateFormatHandling = DateFormatHandling.MicrosoftDateFormat, 
    }); 


// The json should now contain the correct time and offset information. 
// For example, "\/Date(1358789156229-0500)\/" 

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

+0

खैर की जाँच, मैंने आपके विचार की कोशिश की। एक अच्छे विचार के लिए +1। दुर्भाग्यवश, मैं जो कांडो ग्रिड (तृतीय पक्ष नियंत्रण) का उपयोग कर रहा हूं वह ऑफ़सेट जानकारी के साथ काम नहीं कर रहा है :(मेरा आखिरी विचार संभवतः अपना खुद का दिनांक कनवर्टर बनाना है और इसे JSON.NET पर भेजना है। फिर मेरी तिथियां जो सर्वर-साइड रूपांतरित होती हैं उपयोगकर्ता के वांछित टाइमज़ोन के लिए जेएसओएन के माध्यम से मेरे द्वारा समय पर ऑटो-एडजस्ट किए बिना जेएसओएन के माध्यम से पारित किया जाएगा। –

+0

@ बिल क्रिस्टेनसन आपको [इस लेख] को पढ़ना चाहिए (http://onabai.wordpress.com/2012/09/28/kendoui- टिप्स-एंड-ट्रिक्स-ऑन-डेट-इन-ए-ग्रिड /)। लेखक वर्णन करता है कि कैसे केंडो ग्रिड में तिथियों से निपटना है।वह यह भी दिखाता है कि आप आईएसओ स्वरूपित दिनांक इनपुट कैसे स्वीकार कर सकते हैं [यहां] (http://onabai.wordpress.com/2012/09/27/kendoui-supporting-iso-8601-dates/), जो आईएमएचओ से बेहतर होगा माइक्रोसॉफ्ट दिनांक प्रारूप का उपयोग कर। –

+0

हां, मैंने उन ब्लॉगों को पढ़ा है। मैं AJAX/JSON एमवीसी सर्वर रैपर का उपयोग कर रहा हूं जो कि इसका उपयोग करने से भिन्न कार्यान्वयन है। अगर मैं इससे दूर हो जाऊं तो मैं उनकी .js फ़ाइलों को ट्विक नहीं करना चाहता हूं। मैं आपको लोगों को बता दूंगा कि मेरा कस्टम JSON.NET कनवर्टर कैसे काम करता है। मैं इसे खत्म करने के करीब हो रहा हूँ। –

0

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

http://www.kendoui.com/code-library/mvc/grid/using-utc-time-on-both-client-and-server-sides.aspx