2010-09-18 6 views
5

चल रहा है asp.net MVC के 2 कन्वर्ट नहीं है। प्रपत्र पर यूआई jQueryUi डेटपिकर का उपयोग करता है (सुनिश्चित नहीं है कि वह maters)।TimeZoneInfo.ConvertTime मैं एक नियंत्रक कार्रवाई विधि है कि एक रूप से 2 दिनांक समय वस्तुओं को प्राप्त करता है .net 4.0</p> <p>साथ जीत 7 पर कुछ भी

वह उपयोगकर्ता जो उस फॉर्म को भरता है, हमेशा हवाईअड्डा समय क्षेत्र में दिनांक/समय दर्ज करेगा।

मैं इसे यूटीसी समय में परिवर्तित करना चाहता हूं और इसे डेटाबेस में संग्रहीत करना चाहता हूं।

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

public ActionResult New(ScheduleNew data){   
    TimeZoneInfo tz = TimeZoneInfo.FindSystemTimeZoneById("Hawaiian Standard Time"); 

    DateTime start = TimeZoneInfo.ConvertTime(data.StartDate, tz, TimeZoneInfo.Utc); 
    DateTime end = TimeZoneInfo.ConvertTime(data.EndDate, tz, TimeZoneInfo.Utc); 
} 

मैंने एक वैकल्पिक संस्करण के साथ-साथ एक ही परिणाम के साथ प्रयास किया है।

public ActionResult New(ScheduleNew data){ 
    DateTime start = new DateTime(data.StartDate.Year, data.StartDate.Month, data.StartDate.Day, data.StartDate.Hour, data.StartDate.Minute, data.StartDate.Second, DateTimeKind.Unspecified); 
    DateTime end = new DateTime(data.EndDate.Year, data.EndDate.Month, data.EndDate.Day, data.EndDate.Hour, data.EndDate.Minute, data.EndDate.Second, DateTimeKind.Unspecified); 

    TimeZoneInfo tz = TimeZoneInfo.FindSystemTimeZoneById("Hawaiian Standard Time"); 

    StartDate = TimeZoneInfo.ConvertTime(start, tz, TimeZoneInfo.Utc); 
    EndDate = TimeZoneInfo.ConvertTime(end, tz, TimeZoneInfo.Utc), 
} 

ScheduleData दो दिनांक समय StartDate और EndDate बुलाया गुण के साथ सिर्फ एक सरल ViewModel वर्ग है।

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

असल में जो मैं चाहता हूं, उपयोगकर्ता द्वारा प्रवेश करने के लिए 10 घंटे जोड़ना है (यूवीसी के लिए हवािया) और मैं इसे कॉल करके प्राप्त कर सकता हूं। एडहॉर्स (10) और यह ठीक होगा। लेकिन बाद में सड़क पर मुझे इस ऐप को अधिक लचीला होने की आवश्यकता होगी।

+0

क्या आपने समस्या का समाधान किया? – Rory

+0

डेटा का प्रकार क्या था। स्टार्टडेट? – Rory

उत्तर

4

आप और अधिक लचीला दृष्टिकोण चाहते हैं, कुछ इस तरह का प्रयास करें:

DateTime now = DateTime.UtcNow; 

TimeZoneInfo timeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById("Hawaiian Standard Time"); 
TimeSpan utcOffset = timeZoneInfo.GetUtcOffset(now); 
DateTime hawaiianTime = new DateTime(now.Ticks + utcOffset.Ticks, DateTimeKind.Local); 

यह सही ढंग से कोई बात नहीं क्या समय क्षेत्र का उपयोग कर रहे काम करना चाहिए। वैसे: अगर मैं आप थे, तो मैं DateTimeKind.Utc (और सभी शेड्यूल डेटा को यूटीसी के रूप में भी स्टोर करता हूं) के रूप में प्रारंभ और समाप्ति तिथियां बनाउंगा। मुझे यकीन है कि कैसे GetUtcOffset() अनिर्दिष्ट समय प्रकार के साथ काम करेंगे नहीं कर रहा हूँ ...

GetUtcOffset पर अद्यतन()

ऐसा लगता है कि GetUtcOffset() वास्तव में काम करता है विभिन्न DateTimeKind मूल्यों के साथ बनाई गई datetimes के लिए एक ही। हालांकि, मैंने अवैध इनपुट के साथ इसका परीक्षण नहीं किया है (यानी उन तिथियों के साथ जो डेलाइट सेविंग टाइम स्विचिंग के कारण मौजूद नहीं हैं)। मेरा मानना ​​है कि डेटटाइमकिंड.यूटीसी काफी हद तक बचा है, लेकिन यह स्थानीय या अनिर्दिष्ट के लिए हो सकता है।

3

मुझे आपके कोड में कोई समस्या नहीं मिल रही है ... ऐसा लगता है कि यह काम करना चाहिए। आप के वैकल्पिक करने की कोशिश की है:

DateTime start = TimeZoneInfo.ConvertTimeToUtc(data.StartDat, tz); 
2

इस कोड

var dt = new DateTime(YourOldDate.Ticks, DateTimeKind.Utc); 
DateTime NewDate = TimeZoneInfo.ConvertTime(dt, TimeZoneInfo.Local); 

यह मैं से काम किया प्रयास करने पर आपको एक बार आज़मा सकें हो सकता है।

0

ऐसा लगता है कि कोड में आप रूपांतरण के परिणामस्वरूप कुछ भी नहीं कर रहे हैं।

public ActionResult New(ScheduleNew data){   
    TimeZoneInfo tz = TimeZoneInfo.FindSystemTimeZoneById("Hawaiian Standard Time"); 

    DateTime start = TimeZoneInfo.ConvertTime(data.StartDate, tz, TimeZoneInfo.Utc); 
    DateTime end = TimeZoneInfo.ConvertTime(data.EndDate, tz, TimeZoneInfo.Utc); 
} 

start और end मूल्यों को निर्धारित कर रहे हैं, लेकिन कभी नहीं लौटाए जाते हैं। असल में, यहां कोई मूल्य वापस नहीं किया जा रहा है, इसलिए इसे संकलित नहीं करना चाहिए। शायद इसके लिए और भी कुछ है जो आपने नहीं दिखाया।

किसी भी दर पर, रूपांतरण स्वयं ही ठीक है। जब तक data.StartDate और data.EndDateUnspecified प्रकार है, तो इसे अपेक्षा के अनुसार काम करना चाहिए। इसके बजाए TimeZoneInfo.ConvertTimeToUtc का उपयोग करके आप इसे थोड़ा क्लीनर बना सकते हैं।