TimeZoneInfo.ConvertTime ничего не конвертирует - PullRequest
5 голосов
/ 18 сентября 2010

Запуск asp.net mvc 2 на win 7 с .net 4.0

У меня есть метод действия контроллера, который получает 2 объекта DateTime из формы. Пользовательский интерфейс в форме использует указатель даты jQueryUi (не уверен, что это имеет значение).

Пользователь, заполняющий эту форму, ВСЕГДА будет вводить дату / время в гавайском часовом поясе.

Я хочу преобразовать это время в UTC и сохранить его в базе данных.

Когда я вызываю TimeZoneInfo.ConverTime (DateTime, TimeZoneInfo, TimeZoneInfo), он возвращает точно такую ​​же дату и время, что и я, без каких-либо преобразований. Я проверил отладчик, и единственное, что изменилось, это то, что он изменил свойство DateTime.Kind на DateTimeKind.Utc.

public ActionResult New(ScheduleNew data){         
    TimeZoneInfo tz = TimeZoneInfo.FindSystemTimeZoneById( "Hawaiian Standard Time" );

    DateTime start = TimeZoneInfo.ConvertTime(data.StartDate, tz, TimeZoneInfo.Utc);
    DateTime end = TimeZoneInfo.ConvertTime(data.EndDate, tz, TimeZoneInfo.Utc);
}

Я также попробовал альтернативную версию с теми же результатами.

public ActionResult New(ScheduleNew data){
    DateTime start = new DateTime( data.StartDate.Year, data.StartDate.Month, data.StartDate.Day, data.StartDate.Hour, data.StartDate.Minute, data.StartDate.Second, DateTimeKind.Unspecified );
    DateTime end = new DateTime( data.EndDate.Year, data.EndDate.Month, data.EndDate.Day, data.EndDate.Hour, data.EndDate.Minute, data.EndDate.Second, DateTimeKind.Unspecified );

    TimeZoneInfo tz = TimeZoneInfo.FindSystemTimeZoneById( "Hawaiian Standard Time" );

    StartDate = TimeZoneInfo.ConvertTime(start, tz, TimeZoneInfo.Utc);
    EndDate = TimeZoneInfo.ConvertTime(end, tz, TimeZoneInfo.Utc),
}

ScheduleData - это простой класс ViewModel с двумя свойствами даты и времени, называемыми StartDate и EndDate.

Хочу подчеркнуть, мне все равно, где находится сервер, мне все равно, где находится пользователь. Пользователь всегда будет вводить время в гавайском часовом поясе, и сервер всегда должен преобразовывать эту дату в UTC.

По сути, я хочу добавить 10 часов ко времени, которое пользователь вводит (с hawaiian в utc), и я мог бы добиться этого, просто вызвав .AddHours (10), и это было бы просто замечательно. Но позже в будущем мне понадобится это приложение, чтобы быть более гибким.

Ответы [ 4 ]

4 голосов
/ 18 сентября 2010

Если вы хотите более гибкий подход, попробуйте что-то вроде этого:

 DateTime now = DateTime.UtcNow;

 TimeZoneInfo timeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById("Hawaiian Standard Time");
 TimeSpan utcOffset = timeZoneInfo.GetUtcOffset(now);
 DateTime hawaiianTime = new DateTime(now.Ticks + utcOffset.Ticks, DateTimeKind.Local);

Это должно работать правильно, независимо от того, какой часовой пояс вы используете. Кстати: на вашем месте я бы создал даты начала и окончания как DateTimeKind.Utc (и сохранил бы все данные расписания как UTC). Я не уверен, как GetUtcOffset () будет работать с неопределенным видом времени ...

Обновление GetUtcOffset ()

Кажется, что GetUtcOffset () работает точно так же для DateTimes, созданных с различными значениями DateTimeKind. Однако я не проверял его с неверным вводом (то есть с датами, которые не существуют из-за перехода на летнее время). Я полагаю, что DateTimeKind.Utc достаточно сохранен здесь, но это может быть для Local или Unspecified.

2 голосов
/ 19 сентября 2011

попробуйте этот код

var dt = new DateTime(YourOldDate.Ticks, DateTimeKind.Utc);
DateTime NewDate = TimeZoneInfo.ConvertTime(dt, TimeZoneInfo.Local);

Это сработало у меня, может быть, вы можете попробовать.

2 голосов
/ 24 сентября 2010

Я не могу найти никаких проблем с вашим кодом ... Похоже, должно работать.Вы пробовали альтернативу:

DateTime start = TimeZoneInfo.ConvertTimeToUtc(data.StartDat, tz);
0 голосов
/ 14 сентября 2013

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

public ActionResult New(ScheduleNew data){         
    TimeZoneInfo tz = TimeZoneInfo.FindSystemTimeZoneById( "Hawaiian Standard Time" );

    DateTime start = TimeZoneInfo.ConvertTime(data.StartDate, tz, TimeZoneInfo.Utc);
    DateTime end = TimeZoneInfo.ConvertTime(data.EndDate, tz, TimeZoneInfo.Utc);
}

Значения start и end установлены, но никогда не возвращаются. На самом деле, здесь вообще ничего не возвращается, так что это не должно компилироваться. Возможно, есть еще кое-что, что вы не показывали.

Во всяком случае, само преобразование просто отлично. Пока data.StartDate и data.EndDate имеют вид Unspecified, он должен работать как положено. Вы могли бы сделать его немного чище, используя вместо этого TimeZoneInfo.ConvertTimeToUtc.

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