C# 从字符串中捕获UTC时间并将所有日期时间格式化为该字符串

C# 从字符串中捕获UTC时间并将所有日期时间格式化为该字符串,c#,datetime,fedex,C#,Datetime,Fedex,我有一个以字符串格式返回的日期 string utcdt = "2017-01-01T15:48:00-07:00"; 如何从上面的字符串中提取07:00山区时间,并将任何日期格式化为该区域格式 我不想更改计算机上的时区,因为返回到变量utcdt的UTC时间可能会因时间而异,并且我的WinForm应用程序中使用的所有其他日期都需要符合相同的时区规范 编辑 我使用的是联邦快递API,这是日期返回的一种格式 string utcdt = "2017-01-01T15:48:00-07:00";

我有一个以字符串格式返回的日期

string utcdt = "2017-01-01T15:48:00-07:00";
如何从上面的字符串中提取
07:00
山区时间,并将任何日期格式化为该区域格式

我不想更改计算机上的时区,因为返回到变量
utcdt
的UTC时间可能会因时间而异,并且我的WinForm应用程序中使用的所有其他日期都需要符合相同的时区规范

编辑
我使用的是联邦快递API,这是日期返回的一种格式

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

我正试图找到一个解决方案,使日期保持一致。

您可以使用
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"));


请注意其他评论员所写的:这并不能正确处理夏令时。为了解决这个问题,你实际上需要知道真实的时区。

那里没有时区,而是有一个偏移量。大概在夏季,您会希望使用-6而不是-7的偏移量对其进行格式化。真的,你应该试着找出用户想要在哪个时区看到它,而不是只知道一个偏移量。@JonSkeet-你把我弄丢了……我有一个偏移量?是的,这就是“-07:00”的意思。这是UTC偏移量,表示当地时间比UTC晚7小时。在string.DateTime utcTime=DateTime.Parse(utcdt)中没有“Mountain Time”;输出将在您当地的时区内,因此东部标准时间将显示2小时后的17:48。@NadineSmithJonesPicard:但在夏季,太平洋时间是UTC-7。UTC偏移量不是时区。为什么要转换为日期时间??这将带回通过使用解决的问题DateTimeOffset@PanagiotisKanavos仅用于本节中的说明目的answer@NineBerry-我做了一些小的修改以避免混淆。