मुझे यह त्रुटि मिल रही है:

प्रदान किया गया दिनांक समय एक अमान्य समय का प्रतिनिधित्व करता है। उदाहरण के लिए, जब घड़ी को आगे समायोजित किया जाता है, तो छोड़ी गई अवधि में कोई भी समय अमान्य है

जब मैं समय 2020-03-29 02:30 को पूर्वी यूरोपीय समय (जीएमटी+2) से यूटीसी समय में बदलने की कोशिश करता हूं।

इस साइट के अनुसार फिनलैंड के लिए घड़ी 03:00 बजे बदलनी चाहिए, जिसका अर्थ है कि वह समय 02: 30 को यूटीसी में परिवर्तित करना संभव होना चाहिए।

लेकिन जब मैं निम्नलिखित कोड चलाता हूं, तो एक अपवाद फेंक दिया जाता है।

var timezoneMap = TimeZoneInfo.GetSystemTimeZones().ToDictionary(x => x.Id, x => x);
var timezoneInfo = timezoneMap["E. Europe Standard Time"]; 

var localTime1 = DateTime.SpecifyKind(new DateTime(2020, 12, 15, 0, 0, 0), DateTimeKind.Unspecified);
var localTime2 = DateTime.SpecifyKind(new DateTime(2020, 3, 29, 2, 30, 0), DateTimeKind.Unspecified);

var utc1 = TimeZoneInfo.ConvertTimeToUtc(localTime1, timezoneInfo); // 2020-12-14 22:00 correct
var utc2 = TimeZoneInfo.ConvertTimeToUtc(localTime2, timezoneInfo); // throws exception

दूसरे रूपांतरण में क्या गलत है, अपवाद क्यों है?

c#
3
Martin Staufcik 16 पद 2020, 19:39
1
वे अज्ञात हैं, स्थानीय दिनांक समय मान नहीं हैं। किसी भी स्थिति में, यदि आप ऑफ़सेट की परवाह करते हैं तो आपको DateTimeOffset का उपयोग करना चाहिए
 – 
Panagiotis Kanavos
16 पद 2020, 19:42

1 उत्तर

सबसे बढ़िया उत्तर

आप जिस साइट को देख रहे हैं वह IANA समय क्षेत्र डेटा का उपयोग करती है, जिसे मैं सटीक मानता हूं .

लेकिन आपका कोड Windows समय क्षेत्र डेटाबेस का उपयोग करता है, जो इस मामले में ऐसा लगता है कि इसमें एक विसंगति है... ऐसा लगता है कि संक्रमण 1am UTC के बजाय मध्यरात्रि UTC पर है। यह प्रदर्शित करने के लिए कोड यहां दिया गया है:

using System;
using System.Globalization;

class Program
{
    static void Main()
    {
        var zone = TimeZoneInfo.FindSystemTimeZoneById("E. Europe Standard Time");

        // Start at 2020-03-28T23:00Z - definitely before the transition
        var utc = new DateTime(2020, 3, 28, 23, 0, 0, DateTimeKind.Utc);
        for (int i = 0; i < 8; i++)
        {
            var local = TimeZoneInfo.ConvertTime(utc, zone);
            Console.WriteLine($"{utc:yyyy-MM-dd HH:mm} UTC => {local:yyyy-MM-dd HH:mm} local");
            utc = utc.AddMinutes(30);
        }
    }
}

आउटपुट (एनोटेटेड):

2020-03-28 23:00 UTC => 2020-03-29 01:00 local
2020-03-28 23:30 UTC => 2020-03-29 01:30 local
2020-03-29 00:00 UTC => 2020-03-29 03:00 local  <= Note the change here, at midnight UTC
2020-03-29 00:30 UTC => 2020-03-29 03:30 local
2020-03-29 01:00 UTC => 2020-03-29 04:00 local
2020-03-29 01:30 UTC => 2020-03-29 04:30 local
2020-03-29 02:00 UTC => 2020-03-29 05:00 local
2020-03-29 02:30 UTC => 2020-03-29 05:30 local

जैसा कि नियमों की यह पंक्ति। इसलिए मेरा मानना ​​है कि वेब साइट डेटा की सही व्याख्या कर रही है, और यह विंडोज़ टाइम ज़ोन डेटाबेस के "अलग" होने की बात है (और, मुझे संदेह है, गलत)।

4
Jon Skeet 16 पद 2020, 19:59