DateTime.Parse отключен на один час. Почему?

У меня возникли проблемы с пониманием того, почему значение восстановленной строки даты и времени отличается от исходного. Я пишу строку в универсальный формат даты и времени (в формате «u», чтобы в конце было «z»), но когда она восстанавливается, она отличается на один час. Я использую «u», чтобы предотвратить подобные вещи. Может ли кто-нибудь сказать мне, почему это отличается?

Мне нужно хорошее строковое представление, потому что я буду использовать код в 5 разных часовых поясах.

Программа:

using System;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            //Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.GetCultureInfoByIetfLanguageTag("es-CR");

            DateTime min = DateTime.MinValue;

            Console.Write("Min value date: ");
            Console.WriteLine(min);

            Console.Write("String:         ");
            string str = min.ToString("u");
            Console.WriteLine(str);

            DateTime dt = DateTime.Parse(str);

            Console.Write("Restored Date:  ");
            Console.WriteLine(dt);

            Console.ReadLine();

        }
    }
}

Результат:

Минимальная дата валютирования: 01.01.0001 00:00:00

Строка: 0001-01-01 00:00:00Z

Дата восстановления: 01.01.0001 01:00:00

Редактировать: возможность попробовать культуру Коста-Рики.


person Kees C. Bakker    schedule 13.01.2011    source источник
comment
В каком часовом поясе вы находитесь, когда вы анализируете строку обратно на дату и время?   -  person Brian Behm    schedule 13.01.2011


Ответы (2)


Когда вы анализируете универсальную строку DateTime, она использует ваш локальный часовой пояс? Вы можете использовать методы ToUniversalTime() и ToLocalTime() для преобразования туда и обратно. Кроме того, если вы поместите смещение часового пояса после «Z», это поможет вам преобразовать часовой пояс в правильный.

Брайан

person Brian Behm    schedule 13.01.2011
comment
Строка кода str = min.ToUniversalTime().ToString(u, System.Globalization.CultureInfo.InvariantCulture); кажется, работает так, как можно было бы ожидать. Все еще изучаю другие культуры, чтобы проверить, является ли это исправлением. - person Kees C. Bakker; 13.01.2011
comment
Должно ли время UTC вообще иметь часовой пояс? - person Kees C. Bakker; 13.01.2011
comment
Время UTC @Kees будет иметь определенное DateTimeKind.Utc - person Nekresh; 13.01.2011

Существует очень интересный тред об этом на байтах. ком.

Il похоже, что «Z» в конце вашей даты путается между UTC и CET.

В самой распространенной зоне CET сейчас (не летнее время) ровно на один час позже, чем в UTC/GMT/ZULU/Military.

Я не очень уверен в этом вопросе, поэтому я позволю вам прочитать ветку.

person LaGrandMere    schedule 13.01.2011