2012-10-17 22 views
11

को यूटीसी दिनांक समय परिवर्तित मैं निम्नलिखित ASP.Net MVC नियंत्रक विधि है:स्थानीय दिनांक समय

public ActionResult DoSomething(DateTime utcDate) 
{ 
    var localTime = utcDate.ToLocalTime(); 
} 

समस्या यह है कि LOCALTIME utcDate के रूप में ठीक उसी मूल्य होगा। मुझे लगता है कि ऐसा इसलिए है क्योंकि utcDate को पता नहीं है कि इसमें यूटीसी मान है। तो मेरा सवाल यह है कि मैं utcDate (जिसे मैं जानता हूं यूटीसी है) स्थानीय रूप से कैसे परिवर्तित कर सकता हूं?

+0

तुम जानते हो क्या उस समय क्षेत्र का एकमात्र तरीका – elyashiv

उत्तर

35

आपDateTime पता तो एक यूटीसी मूल्य होता है, आप the following उपयोग कर सकते हैं:

DateTime iKnowThisIsUtc = whatever; 
DateTime runtimeKnowsThisIsUtc = DateTime.SpecifyKind(
    iKnowThisIsUtc, 
    DateTimeKind.Utc); 
DateTime localVersion = runtimeKnowsThisIsUtc.ToLocalTime(); 

उदाहरण के लिए, मेरे वर्तमान एप्लिकेशन में, मैं अपने डेटाबेस में एसक्यूएल के utcnow के साथ टाइमस्टैम्प बना देता हूं, लेकिन जब मैं उन्हें अपने सी # एप्लिकेशन में पढ़ता हूं तो Kind प्रोपर्टी हमेशा Unknown होता है। मैंने टाइमस्टैम्प को पढ़ने के लिए एक रैपर फ़ंक्शन बनाया है, जानबूझकर Kind को Utc पर सेट करें, और उसके बाद इसे स्थानीय समय में परिवर्तित करें - अनिवार्य रूप से ऊपर के रूप में।

DateTime.ToLocalTime() केवल मूल्य को प्रभावित नहीं करता ध्यान दें कि अगर एक (या दोनों) निम्न में से रखती है:

  • DateTime के Kind संपत्ति DateTimeKind.Local
  • आपके स्थानीय समय क्षेत्र ऐसा है कि "कोई बदलें "सही रूपांतरण

मुझे लगता है कि हम मान सकते हैं कि दूसरा बिंदु सत्य नहीं है। इस प्रकार ऐसा लगता है कि iKnowThisIsUtc की Kind संपत्ति पहले से ही Local पर सेट है। आपको यह पता लगाने की आवश्यकता है कि इन DateTime के साथ आपको जो कुछ भी आपूर्ति कर रहा है, वह सोचता है कि वे स्थानीय हैं।

+0

नायब AFAIK में हैं 'ToLocalTime()' change_ मूल्य है अगर क्रम समय सोचता _not होगा _already स्थानीय _ है। * (आईई। इसमें 'डेटटाइमकिंड.लोकल' है।) आप यह जांचना चाहेंगे कि यह मामला है या नहीं, और यदि हां, तो आपको जो तिथियां मिल रही हैं उन्हें' स्थानीय 'के रूप में चिह्नित क्यों किया गया है, भले ही वे नहीं हैं। (* या यदि स्थानीय समय निश्चित रूप से यूटीसी है) – Rawling

+0

+1 मुझे टिप्पणी में शामिल स्पष्टीकरण के लिए मारने के लिए, हालांकि मुझे लगता है कि यह वास्तव में उत्तर के हिस्से के रूप में है। –

+0

जब मैंने इसे थोड़ी देर पहले देखा तो मुझे यह बहुत भ्रमित हो गया। आपका उत्तर यह समझाने के लिए एक अच्छा काम करता है, लेकिन कुछ उदाहरण शायद मदद करेंगे। – TylerOhlsen

3

निम्नलिखित का प्रयास करें:

public static DateTime UtcToPacific(DateTime dateTime) 
     { 
      return TimeZoneInfo.ConvertTimeFromUtc(dateTime, TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time")); 
     } 

जाहिर है आपके स्थानीय समय क्षेत्र के लिए प्रशांत बदल जाते हैं।

आप पता लगाने के लिए क्या समय क्षेत्र मौजूद हैं पर अपने मशीन नीचे दिए गए लिंक को देखने चाहते हैं: http://msdn.microsoft.com/en-us/library/bb397781.aspx

1

या इस:।

var localTime = new DateTimeOffset(utcDate,TimeSpan.FromHours(0)) 
        .ToLocalTime().DateTime; 
4

के रूप में MSDN वर्णन करते हैं, आप अपनी तिथि का प्रकार संपत्ति, ToLocalTime() काम करने के लिए (और स्थानीय समय में तारीख को परिवर्तित करने के लिए की जरूरत है यूटीसी होने की http://msdn.microsoft.com/en-us/library/system.datetime.tolocaltime.aspx

इस प्रयास करें:?

utcDate = DateTime.SpecifyKind(utcDate, DateTimeKind.Utc); 
var localTime = utcDate.ToLocalTime(); 
संबंधित मुद्दे