2010-10-27 13 views
5

मुझे अपने सर्वर और क्लाइंट के बीच की तारीखों को परिवर्तित करते समय एक समस्या का सामना करना पड़ रहा है, जहां दोनों जर्मनी में चल रहे हैं। क्लाइंट मशीनों पर क्षेत्रीय सेटिंग्स को यूके या जर्मनी दोनों में सेट किया जा सकता है। मुझे सर्वर से एक तिथि प्राप्त होती है जो सीईटी प्रारूप है, और मुझे इस समय यूआई पर ब्रिटेन के समय के रूप में प्रतिनिधित्व करने की आवश्यकता है। उदाहरण के लिए सर्वर से प्राप्त एक समय जैसे 01/07/2010 01:00:00 यूआई पर 01/07/2010 00:00:00 के रूप में प्रदर्शित किया जाना चाहिए। मैंने इस उद्देश्य के लिए एक कनवर्टर लिखा है, हालांकि इसे चलाने के दौरान '2 घंटे का समय अंतर हो रहा है। नीचे कोड है, कृपया आप मदद कर सकते हैं?वर्तमान यूके समय का प्रतिनिधित्व कैसे करें?

public class LocalToGmtConverter : IDateConverter 
{ 
    private readonly TimeZoneInfo timeZoneInfo; 

    public LocalToGmtConverter() 
     : this(TimeZoneInfo.Local) 
    { 

    } 
    public LocalToGmtConverter(TimeZoneInfo timeZoneInfo) 
    { 
     this.timeZoneInfo = timeZoneInfo; 
    } 

    public DateTime Convert(DateTime localDate) 
    { 
     var utcKind = DateTime.SpecifyKind(localDate, DateTimeKind.Utc); 
     return utcKind; 
    } 

    public DateTime ConvertBack(object fromServer) 
    { 
     DateTime serverDate = (DateTime)fromServer; 

     var utcOffset = timeZoneInfo.GetUtcOffset(serverDate); 

     var uiTime = serverDate- utcOffset; 

     return uiTime; 

    } 
} 
+1

क्या आपको सर्वर से जर्मन समय या जीएमटी मिल रहा है? – Oded

+2

संबंधित प्रश्न: http: // stackoverflow।कॉम/प्रश्न/253272 9/डेलाइट-सेविंग-टाइम-एंड-टाइमज़ोन-बेस्ट प्रैक्टिस – Oded

+2

बेहतर दृष्टिकोण यूटीसी में दोनों बार होता है और आवश्यक –

उत्तर

12

मुझे लगता है कि आप में रूपांतरित करते हैं यूटीसी (यूके के बजाय) समय। चूंकि मध्य यूरोप में ग्रीष्मकालीन समय अभी भी है (यदि तापमान अन्यथा कहता है), अंतर अक्टूबर, 31 तक +2 घंटे है।

यदि आप जानते हैं कि आप जर्मनी से ब्रिटेन में परिवर्तित हो रहे हैं (यानी सीईएसटी से गर्मी में सीएसटी और सर्दियों में सीईटी से जीएमटी), तो आप केवल 1 घंटे क्यों घटाते हैं?

आप ब्रिटेन के लिए समय क्षेत्र जानकारी चाहते हैं, तो आप इसे

var britishZone = TimeZoneInfo.FindSystemTimeZoneById("GMT Standard Time"); 

का उपयोग कर तो फिर तुम

var newDate = TimeZoneInfo.ConvertTime(serverDate, TimeZoneInfo.Local, britishZone); 
+1

हाँ, असली यूटीसी और ब्रिटिश टाइमज़ोन (अक्सर यूटी में यूटीसी डबलिन, एडिनबर्ग, लिस्बन, लंदन जैसे कुछ कहा जाता है) एक ही बात नहीं है। आपको ब्रिटिश टाइमज़ोन जानकारी प्राप्त करने की आवश्यकता है और इसमें आपके लिए डेलाइट सेविंग टाइम शामिल होना चाहिए। –

1

उपयोग TimeZoneInfo.ConvertTime समय क्षेत्र (यूके) को लक्षित करने के मूल इनपुट समय क्षेत्र (सीईटी) कन्वर्ट करने के लिए।

public static DateTime ConvertTime(
    DateTime dateTime, 
    TimeZoneInfo sourceTimeZone, 
    TimeZoneInfo destinationTimeZone 
) 

MSDN here पर पूर्ण मार्गदर्शन:

टाइम्स परिवर्तित समय क्षेत्र

MSDN से संशोधित कोड नमूना के बीच:

DateTime ceTime = new DateTime(2007, 02, 01, 08, 00, 00); 
try 
{ 
    TimeZoneInfo ceZone = TimeZoneInfo.FindSystemTimeZoneById("Central Europe Standard  Time"); 
    TimeZoneInfo gmtZone = TimeZoneInfo.FindSystemTimeZoneById("GMT Standard Time"); 
    Console.WriteLine("{0} {1} is {2} GMT time.", 
      ceTime, 
      ceZone.IsDaylightSavingTime(ceTime) ? ceZone.DaylightName : ceZone.StandardName, 
      TimeZoneInfo.ConvertTime(ceTime, ceZone, gmtZone)); 
} 
catch (TimeZoneNotFoundException) 
{ 
    Console.WriteLine("The registry does not define the required timezones."); 
}       
catch (InvalidTimeZoneException) 
{ 
    Console.WriteLine("Registry data on the required timezones has been corrupted."); 
} 
0

बेहतर दृष्टिकोण स्थानीय बार से निपटने के लिए की दुकान है का उपयोग करते हुए तिथि परिवर्तित कर सकते हैं का निर्माण कर सकते उन्हें यूटीसी जैसे एकीकृत प्रतिनिधित्व में।

तो आप सभी इनपुट समय को यूटीसी (.ToUniversalTime() के माध्यम से) में परिवर्तित कर सकते हैं, और इसके मूल्य को स्टोर (या प्रेषित) कर सकते हैं। जब आपको इसे दिखाने की आवश्यकता होती है तो इसे .ToLocalTime() का उपयोग कर वापस परिवर्तित करें।

तो आप यह जानने के लिए पूछताछ करते हैं कि कौन सा समय क्षेत्र मूल मूल्य था और आसानी से अलग-अलग समय क्षेत्रों में संग्रहित मूल्य दिखा सकता है।

इसके अलावा आप आने वाली परेशानियों से बच सकते हैं जहां आपको अगली टाइमज़ोन में समय-समय पर प्रोसेसिंग के लिए विशिष्ट तर्क लिखना होगा, ताकि यह पता लगाने की कोशिश की जा सके कि उन्हें सभी उपलब्ध कैसे करें।

+0

मुझे लगता है कि यहां मुद्दा यह है कि वह स्थानीय समय में नहीं चाहता है, वह जर्मनी (सीईटी) में है और यूके (जीएमटी) में समय प्रदर्शित करना चाहता है। –

+0

@ स्टेव हाई, प्वाइंट के लिए धन्यवाद, लेकिन वह यूटीसी से मूल्य को किसी भी समस्या के बिना जो भी समय चाहता है उसे परिवर्तित कर सकता है। लेकिन ओपी सर्वर से तिथियां प्राप्त करने और दिखाने के बारे में कहता है, इसलिए मुझे लगता है कि उसका ऐप सिर्फ अलग-अलग समय क्षेत्रों में काम करता है। –

-2

मुझे पता प्रश्न सी # के लिए है, लेकिन अगर तुम सब करना चाहते हैं एक ही रूपांतरण आप PowerShell आदेश पंक्ति से ऐसा कर सकते हैं है:

$d = [DateTime]::Parse("04/02/2014 17:00:00") 
$gmt = [TimeZoneInfo]::FindSystemTimeZoneById("GMT Standard Time"); 
[TimeZoneInfo]::ConvertTime($d, $gmt, [TimeZoneInfo]::Local) 

यह स्क्रिप्ट में 17:00 ब्रिटेन समय बदल जाएगा आपका स्थानीय समय क्षेत्र मेरे लिए, वह सीएसटी होगा। यह ध्यान रखना दिलचस्प है कि अगर मैंने 03/27/2014 को तिथि निर्धारित की है, तो परिणाम अलग होगा क्योंकि यूके डेलाइट सेविंग टाइम अमेरिका की विभिन्न तिथियों पर चलता है।

संबंधित मुद्दे