Вопрос

Я пишу довольно большой Webapp в asp.net/c# с MSSQL 2008 r2 Обслуживание базы данных. Программа должна преобразовать date/time строки (в формате даты ISO) для DateTime где они используются, а затем хранятся как smalldatetime в sql.

Когда строки преобразуются в datetimes, ан hour таинственно добавлен к результату. Я понимаю, что нахождение в Великобритании, мы подвергались дневным сбережениям (в настоящее время активным), но верно datetime.Convert метод понимает это? При преобразовании обратно в строку результат, как и ожидалось.

Я написал небольшую программу, чтобы проиллюстрировать проблему (также включая даты не ISO для моего здравомыслия):

class Program
{


    static void Main(string[] args)
    {
        //BB();
        //Dist();
        DateTime d1 = new DateTime();
        DateTime d2 = new DateTime();
        string d1s = "2010-09-13T09:30:01Z";
        string d2s = "2010-09-13 09:30:01";

        d1 = Convert.ToDateTime(d1s);
        d2 = Convert.ToDateTime(d2s);

        Console.WriteLine("d1s:{0} d1:{1} ", d1s, d1);
        Console.WriteLine("d2s:{0} d2:{1} ", d2s, d2);

        d1s = d1.ToString("u"); d2s = d2.ToString("u");

        Console.WriteLine("\nd1: {0}", d1s);
        Console.WriteLine("d2: {0}", d2s);

        d1 = Convert.ToDateTime(d1s);
        d2 = Convert.ToDateTime(d2s);

        Console.WriteLine("\nd1s:{0} d1:{1} ", d1s, d1);
        Console.WriteLine("d2s:{0} d2:{1} ", d2s, d2);

        Console.Read();
    }
}

Вот результаты, которые я получаю, когда я запускаю программу:

d1s:2010-09-13T09:30:01Z d1:13/09/2010 10:30:01
d2s:2010-09-13 09:30:01 d2:13/09/2010 09:30:01

d1: 2010-09-13 10:30:01Z
d2: 2010-09-13 09:30:01Z

d1s:2010-09-13 10:30:01Z d1:13/09/2010 11:30:01
d2s:2010-09-13 09:30:01Z d2:13/09/2010 10:30:01
Done

Это правильное поведение? Я идиот? Я бы предположил преобразование DateTime в String, а затем точная строка обратно к DateTime вернет исходный вход. Если это правильное поведение, любые идеи о том, как получить конситуальный результат, но все еще используя Convert.ToDateTime()?

Огромное спасибо.

Это было полезно?

Решение

«Z» в конце разделения означает «Zulu» (эквивалент UTC / GMT). По умолчанию, когда вы преобразуете строку с этим в конце этого, она преобразует его в местное время (+ 1 час в вашем случае).

Без Z '.NET будет предположить, что дата уже в правильном формате и не добавляет час.

При форматировании DateTime обратно в строку, которую вы используете строку формата «U». Это говорит .NET, что это время UTC и должно быть отформатировано на таких. Поэтому он добавляет «Z» до конца. Когда вы преобразуете его обратно в день даты, другой час добавлен, чтобы сделать его локальным.

Уточнить:

d1: запускается как строка UTC -> местное время (+ 1 час) -> UTC String -> местное время (+1 час)

D2: начинается как локальная строка -> местное время (без изменений) -> utc String -> местное время (+ 1 час)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top