2012-08-12 13 views
5

पर उपयोगकर्ता द्वारा दर्ज डेटाटाइम कनवर्ट करें उपयोगकर्ता उपयोगकर्ता को अलग-अलग टेक्स्टबॉक्स में दिनांक और एक समय में प्रवेश करता है। मैं फिर दिनांक और समय को एक डेटाटाइम में जोड़ता हूं। मुझे डेटाबेस में इसे सहेजने के लिए इस डेटाटाइम को यूटीसी में परिवर्तित करने की आवश्यकता है। मेरे पास डेटाबेस में उपयोगकर्ता का समय क्षेत्र आईडी सहेजा गया है (वे पंजीकरण करते समय इसे चुनते हैं)। सबसे पहले, मैं निम्नलिखित की कोशिश की:यूटीसी

string userTimeZoneID = "sometimezone"; // Retrieved from database 
TimeZoneInfo userTimeZone = TimeZoneInfo.FindSystemTimeZoneById(userTimeZoneID); 

DateTime dateOnly = someDate; 
DateTime timeOnly = someTime; 
DateTime combinedDateTime = dateOnly.Add(timeOnly.TimeOfDay); 
DateTime convertedTime = TimeZoneInfo.ConvertTimeToUtc(combinedDateTime, userTimeZone); 

यह एक अपवाद के परिणामस्वरूप:

The conversion could not be completed because the supplied DateTime did not have the Kind property set correctly. For example, when the Kind property is DateTimeKind.Local, the source time zone must be TimeZoneInfo.Local

मैं तो स्थापित कर इतना तरह तरह की संपत्ति की कोशिश की:

DateTime.SpecifyKind(combinedDateTime, DateTimeKind.Local); 

यह नहीं था काम, इसलिए मैंने कोशिश की:

DateTime.SpecifyKind(combinedDateTime, DateTimeKind.Unspecified); 

यह या तो काम नहीं किया। क्या कोई मुझे समझा सकता है कि मुझे क्या करना है? क्या मैं इसके बारे में भी सही तरीके से जा रहा हूं? क्या मुझे डेटटाइम ऑफसेट का उपयोग करना चाहिए?

+0

संभव डुप्लिकेट http://stackoverflow.com/questions/4668921/convert-local-time कोशिश कर सकते हैं -to-utc-in-net-framework-3-0) – Shai

+0

@Shai: स्पष्ट रूप से डुप्लिकेट नहीं है, क्योंकि उस प्रश्न में है: "मुझे .NET Framework 3.0 में उपयोग करना चाहिए, इसलिए TimeZoneInfo ऑब्जेक्ट का उपयोग नहीं कर सकता।" –

+0

@ जोन्स स्केट अहह ने यह नहीं देखा, हालांकि ओपी को एक लीड दे सकता है .. – Shai

उत्तर

7

जिस प्रकार सभी अन्य तरीकों DateTime पर, SpecifyKind एक मौजूदा मूल्य परिवर्तन नहीं करता है - यह रिटर्न एक नई मूल्य। आप की जरूरत है:

combinedDateTime = DateTime.SpecifyKind(combinedDateTime, 
             DateTimeKind.Unspecified); 

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

DateTimeZone zone = ...; 
LocalDate date = ...; 
LocalTime time = ...; 
LocalDateTime combined = date + time; 
ZonedDateTime zoned = combined.InZoneLeniently(zone); 
// You can now get the "Instant", or convert to UTC, or whatever... 

जब आप किसी विशेष क्षेत्र के लिए स्थानीय बार परिवर्तित, वहाँ स्थानीय मान अमान्य या नियत समय क्षेत्र में अस्पष्ट होने के लिए संभावना है, क्योंकि "leniently" हिस्सा है डीएसटी परिवर्तन करने के लिए।

+0

धन्यवाद जॉन! विश्वास नहीं कर सकता कि यह इतना आसान था! मैं नोडा टाइम की जांच करूंगा क्योंकि ऐसा लगता है कि इसका उपयोग करना बहुत आसान है! – HTX9

+0

@ एचटीएक्स 9: गुडो - आपको लगता है कि शुरुआत में यह वास्तव में अधिक जटिल महसूस करता है, क्योंकि यह आपको वास्तव में काम करने के लिए मजबूर करता है कि आपको किस प्रकार का डेटा मिला है (स्थानीय, तिथियां बनाम समय बनाम दिनांक/समय), अस्पष्टता को कैसे संभालना है आदि वे चीजें हैं जिन्हें आप किसी भी तरह से सोच रहे थे, लेकिन .NET API उन्हें स्पॉट करना कठिन बनाता है। यही सिद्धांत है, वैसे भी :) –

1

तुम भी (के [.NET फ़्रेमवर्क 3.0 में यूटीसी में कनवर्ट स्थानीय समय] इस

var combinedLocalTime = new DateTime((dateOnly + timeOnly.TimeOfDay).Ticks,DateTimeKind.Local); 
var utcTime = combinedLocalTime.ToUniversalTime(); 
संबंधित मुद्दे