2017-01-20 3 views
0

У меня есть дата, которая возвращается в виде строкиCapture UTC Время от строки и формат Все DateTime к нему

string utcdt = "2017-01-01T15:48:00-07:00"; 

Как я мог извлечь 07:00 Mountain Time из строки выше и форматировать любую дату в это региональное форматирование?

Я не хочу менять часовые пояса на своем компьютере, так как время UTC, возвращаемое переменной utcdt, может меняться в зависимости от того, и все остальные даты, используемые в моем приложении WinForm, должны соответствовать тем же спецификациям часового пояса.

Редактировать
Я использую API FEDex и это один формат даты returnerd

string utcdt = "2017-01-01T15:48:00-07:00"; 

Теперь позже в приложении есть

foreach (TrackingDateOrTimestamp timestamp in trackDetail.DatesOrTimes) 
    Console.WriteLine("{0}: {1}", timestamp.Type, timestamp.DateOrTimestamp); 

который возвращает данные в мое местное время - значение

01/01/2017 17:48:00 

Я пытаюсь найти решение, чтобы даты были согласованными.

+1

У вас нет часового пояса - у вас есть смещение. Предположительно летом вы хотите отформатировать его со смещением -6, а не -7. На самом деле, вы должны попытаться определить, какой часовой пояс пользователь хочет увидеть, а не просто знать одно смещение. –

+0

@JonSkeet - ты потерял меня ... У меня есть смещение? – NadineSmithJonesPicard

+0

Да, вот что такое «-07: 00». Это налог на добавленную стоимость по UTC, так что местное время на 7 часов меньше UTC. У вас нет «Mountain Time» в любом месте вашей строки. –

ответ

1

Вы можете использовать класс DateTimeOffset для синтаксического анализа строки в локальное время и ее смещения от UTC. Затем вы можете сохранить смещение как TimeSpan.

Позже затем снова использовать DateTimeOffset класс для преобразования другого DateTime вы должны использовать те же смещение:

string dto = "2017-01-01T15:48:00-07:00"; 

DateTimeOffset dateTimeOffset = DateTimeOffset.Parse(dto); 

DateTime utcDateTime = dateTimeOffset.UtcDateTime; 
TimeSpan timezoneOffset = dateTimeOffset.Offset; 


MessageBox.Show("UTC DateTime: " + utcDateTime); 
MessageBox.Show("Offset: " + timezoneOffset); 

DateTimeOffset nowWithOffset = DateTimeOffset.UtcNow.ToOffset(timezoneOffset); 

MessageBox.Show("Now in other timezone: " + nowWithOffset.ToString("O")); 

Обратите внимание, что написали другие комментаторы: Это не правильно иметь дела с летним временем , Чтобы справиться с этим, вам действительно нужно знать реальный часовой пояс.

+0

Зачем конвертировать в DateTime вообще? Это вернет проблемы, которые были решены с помощью DateTimeOffset –

+0

@PanagiotisKanavos. Только для иллюстративных целей в этом ответе – NineBerry

+0

@NineBerry. Я сделал некоторые незначительные изменения, чтобы предотвратить путаницу. –