2013-04-21 2 views
0

Как преобразовать US-стиль DateTime, такой как 5/1/2012 3:38:27 PM с сервера в пользовательское местное время? Я разрабатываю для телефона Windows.Конвертировать US-Style DateTime в местное время

Я попытался

DateTime localTime = serverTime.ToLocalTime(); 

но результат от пары часов. Я думал, ToLocalTime() позаботится о преобразовании в любой часовой пояс, в котором находится пользователь? Возможно, мне нужно сначала получить информацию о часовом поясе пользователя?

EDIT 1

Я думаю, что ServerTime находится в часовом поясе PST

EDIT 2

Мой часовой пояс GMT +8. Я попробовал следующее, но результат localTime отстает на 15 часов.

TimeZoneInfo localZone = TimeZoneInfo.Local; 
DateTime localTime = TimeZoneInfo.ConvertTime(serverTime, localZone); 

EDIT 3

Этот результат в 7 часов меньше, чем мое местное время.

TimeZoneInfo localZone = TimeZoneInfo.Local; 
DateTime dateTimeKind = DateTime.SpecifyKind(serverTime, DateTimeKind.Utc); 
DateTime localTime = TimeZoneInfo.ConvertTime(dateTimeKind, localZone); 

EDIT 4

OK Я думаю, что я получаю там, но не уверен, если это применимо для всех часовых поясов. Я думаю, что мне все еще нужно учитывать дневное свечение, потому что в результате местного времени на один час вперед.

TimeZoneInfo localZone = TimeZoneInfo.Local; 
double offset = localZone.GetUtcOffset(DateTime.Now).TotalHours; 
DateTime dateTimeKind = DateTime.SpecifyKind(serverTime, DateTimeKind.Utc); 
DateTime localTime = TimeZoneInfo.ConvertTime(dateTimeKind, localZone).AddHours(offset); 

Но тогда как же вы получаете DLS действует для определенного часового пояса в Windows Phone? TimeZoneInfo.FindSystemTimeZoneById, похоже, не поддерживается?

+0

Вы посмотрели на эту статью. В нем много полезной информации о ToLocalTime и проблемах времени. http://stackoverflow.com/questions/179940/c-sharp-convert-utc-gmt-time-to-local-time?rq = 1 Возможный дубликат – Harrison

+0

В каком формате вы получаете серверное время? –

+0

Формат DateTime является US-образным и в часовом поясе PST – PutraKg

ответ

1

Для этой работы DateTime -объект serverTime должен быть в формате UTC или, по крайней мере, знать, что такое Kind. Прочитайте все подробности об этом в разделе примечания раздел this page.

Удачи!

0

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

// ISO8601 local time with offset. 
// get from DateTimeOffset.ToString("o") 
2012-05-01T15:38:27-07:00 

// ISO8601 UTC time 
// get from DateTime.ToString("o") when kind is UTC 
2012-05-01T22:38:27Z 

Это очень важно, что вы делаете это, потому что местные времена могут быть неоднозначными, когда заканчивается летнее время. Вы должны либо предоставить правильное смещение, (-8 для PST, -7 для PDT), либо отправить в формате UTC.

Существует очень мало сценариев, где само по себе отправляется местное время. Если вы думаете, что у вас есть, пожалуйста, уточните, что представляет собой время.

+0

Время представляет момент, когда сервер получает строку (сообщение чата). К сожалению, у меня нет доступа к серверу, чтобы изменить код там. В любом случае, я не перешел на локальное время, но получил локальное время сервера и вычислил, когда сообщение было отправлено последним, например '5 минут назад',' 2 часа назад' и т. Д. – PutraKg

+0

@PutraKg - Имейте в виду, что у вас будет двусмысленность 3 ноября с 1:00 до 2:00, когда смещение может быть либо -7 или -8, и вы не сможете узнать, какой из них он имеет. Если это имеет значение для вас, тогда вы должны обсудить с кем отвечаете за код сервера. –

+1

Если вы вычитаете из времени сервера, вы можете получить отрицательное значение или дополнительный час (10 марта или 3 ноября). Ваш код должен быть готов к устранению двусмысленности или возможности отрицательных значений. –

Смежные вопросы