Почему .net интерпретирует эту дату как предыдущий, когда она присваивается полю даты? - PullRequest
1 голос
/ 04 марта 2010

У меня есть дата, которую я читаю из API в следующем формате:

2010-03-15T00:00:00-04:00

При присвоении типу данных даты в C # / VB.net он отображается как:

3/14/2010 11:00:00 PM //Note 3/15 is being displayed as 3/14

почему это отображается как предыдущий день? Есть ли название для формата выше?

Ответы [ 3 ]

3 голосов
/ 04 марта 2010

Дата, которую вы указали, указана в UTC , тогда как когда вы выполняли преобразование, он настраивал экземпляр DateTime для местного часового пояса.

Вы должны иметь возможность вызвать метод ToUniversalTime , чтобы получить дату в формате UTC.

Если вам нужно ввести время в виде литерала для вашего местного часового пояса, вам нужно создать новый экземпляр DateTime, используя данные даты (год, месяц, день и т. Д. И т. Д.) Или через серию вызовов Метод SpecifyKind , чтобы указать, является ли экземпляр DateTime местным часовым поясом или UTC.

1 голос
/ 04 марта 2010

Пара вопросов здесь:

1) убедитесь, что исходная строка содержит смещение часового пояса -04: 00, поэтому оно не в формате UTC. Версия UTC для того же момента времени, очевидно, будет 2010-03-15T04: 00: 00Z (окончание Z означает UTC / Zulu). Когда вы затем отобразили DateTime, он показывает версию местного часового пояса - поскольку ваш местный часовой пояс EST (-5), то он отображается за 1 час до того, что появляется в исходной строке (которая была смещена @ -4), следовательно, 11 00 pm

2) похоже, что ваша цель здесь не в том, чтобы показать местный часовой пояс или UTC-версии временной метки, а вместо этого сохранить его с тем же смещением, которое было указано во входной строке. К счастью, 3.5 добавил тип только для такого сценария: DateTimeOffset

если бы вы использовали DateTimeOffset вместо DateTime, то вывод ToString по умолчанию был бы таким:

[342] C:\ » $dto = [datetimeoffset]::parse('2010-03-15T00:00:00-08:00')
[343] C:\ » $dto.ToString()
3/15/2010 12:00:00 AM -08:00
[344] C:\ » $dto.DateTime.ToString()
3/15/2010 12:00:00 AM

Обратите внимание, что он хранит и то же время и сведения о смещении (отсюда и название типа). Если вас не волнует смещение, и вы просто хотите получить DateTime для любого смещения, в котором был вход, вы можете просто получить свойство DateTime (как показано выше). Если вам нужно придерживаться DateTime и вы не можете или не хотите переключаться на DateTimeOffset, это может быть путь.

0 голосов
/ 04 марта 2010

Это проблема часового пояса. Если вы используете .NET 3.5, вы можете использовать класс TimeZoneInfo для работы с часовыми поясами, которые могут помочь. В предыдущих версиях .NET вам пришлось использовать TimeZone, который не так надежен.

...