Преобразование строки в дату с использованием C # в ASP.NET дает мне дату на час.Зачем? - PullRequest
4 голосов
/ 18 марта 2012

Я кодирую следующее, используя VS2010, C #, ASP.NET:

DateTime dt = DateTime.Parse("2012-03-11T02:53:58-08:00"); //Date is taken from SQL database
string strDt = dt.ToString();   //Becomes: "3/11/2012 3:53:58 AM"

Является ли эта апрельская дурацкая шутка от Microsoft?

Ответы [ 3 ]

4 голосов
/ 18 марта 2012

«Неправильный» результат (как объясняет ответ darkmyst) вызван тем фактом, что 11 марта 2012 г., 2:38:58, AM не была действительной датой и временем в районах Соединенных Штатов и Канады, где наблюдается дневной свет экономия времени Очевидно, ваш код выполняется на компьютере в одной из этих областей.

Чтобы преобразовать строку в DateTime, игнорируя любое смещение часового пояса, вы можете вызвать DateTimeOffset.Parse и затем получить DateTime компонент результата:

DateTime dt = DateTimeOffset.Parse("2012-03-11T02:53:58-08:00").DateTime;
string strDt = dt.ToString();  // "3/11/2012 2:53:58 AM"

ОБНОВЛЕНИЕ: Так в чем же разница между DateTime.Parse и DateTimeOffset.Parse, если исходная строка содержит смещение часового пояса? Рассмотрите эти два примера, которые предполагают, что ваш текущий часовой пояс - тихоокеанское время:

// Example 1: DateTime.Parse(String)
DateTime dt = DateTime.Parse("2012-03-11T06:00:00-04:00");
Console.WriteLine(dt.ToString("o"));  // 2012-03-11T03:00:00.0000000-07:00

DateTime.Parse использует смещение для настройки проанализированной даты и времени на местное время. Обратите внимание, что время изменилось с 6:00 до 3:00, что отражает переход с восточного летнего времени (UTC-04: 00) на тихоокеанское летнее время (UTC-07: 00). В вашем вопросе время изменилось, потому что DateTime.Parse автоматически настраивает время с тихоокеанского стандартного времени (UTC-08: 00) на тихоокеанское летнее время (UTC-07: 00).

// Example 2: DateTimeOffset.Parse(String)
DateTimeOffset dto = DateTimeOffset.Parse("2012-03-11T06:00:00-04:00");
Console.WriteLine(dto.DateTime.ToString("o"));  // 2012-03-11T06:00:00.0000000
Console.WriteLine(dto.Offset);                  // -04:00:00

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

4 голосов
/ 18 марта 2012

Это позволяет использовать часовой пояс, в котором вы находитесь. Строка времени имеет формат ISO8601 с часовым поясом.

http://msdn.microsoft.com/en-us/library/1k1skd40.aspx

3 голосов
/ 18 марта 2012

Это не шутка или проблема часового пояса.Это летнее время.Google "Летнее время 2012", вот результат:

Летнее время (США) началось в воскресенье, 11 марта 2012 года, в 2:00 и заканчивается в воскресенье, 4 ноября 2012 года, 2: 12 утра.За исключением Аризоны и Гавайев.Переведите часы вперед на 1 час весной и назад на 1 час осенью («Весна вперед, падение назад»).

Другими словами, там, где наблюдается переход на летнее время, 2:53: 58:00 11 марта 2012 года. Часы пропускают 2 часа прямо с 1:59:59 до 3:00:00.Почему ваш sql datetime не наблюдает за переходом на летнее время и машина, на которой работает ваш c #, - это еще одна проблема ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...