C# 跨时区处理时间

C# 跨时区处理时间,c#,datetime,utc,C#,Datetime,Utc,我正在尝试将此字符串时间值2017-01-10T13:19:00-07:00转换为当地时间(东部)。现在从我的研究来看,07:00是山地时间,也就是东部时间2小时后(我的本地时间)。但是,当我运行此语法转换时,返回的输出是01/17/2017 10:19:00 AM,相差3小时,而不是2小时 这是我使用的语法,设置是否错误?为了从UTC时间返回准确的本地时间,我应该更改什么 static void Main(string[] args) { string green = "2017-01

我正在尝试将此字符串时间值
2017-01-10T13:19:00-07:00
转换为当地时间(东部)。现在从我的研究来看,07:00是山地时间,也就是东部时间2小时后(我的本地时间)。但是,当我运行此语法转换时,返回的输出是
01/17/2017 10:19:00 AM
,相差3小时,而不是2小时

这是我使用的语法,设置是否错误?为了从UTC时间返回准确的本地时间,我应该更改什么

static void Main(string[] args)
{
    string green = "2017-01-10T13:19:00-07:00";

    DateTime iKnowThisIsUtc = Convert.ToDateTime(green);
    DateTime runtimeKnowsThisIsUtc = DateTime.SpecifyKind(
        iKnowThisIsUtc,
        DateTimeKind.Utc);
    DateTime localVersion = runtimeKnowsThisIsUtc.ToLocalTime();
    Console.WriteLine(localVersion);
    Console.ReadKey();
}
编辑
我已使用以下语法验证了我的计算机是否设置为正确的时区,该语法为这两个时区生成了Eastern(这是正确的)


将字符串转换为DateTime对象:

var datetime = DateTime.Parse("2017-01-10T13:19:00-07:00");
获取EST的时区:

var easternZone = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
转换为EST(注意转换
.ToUniversalTime()
):

easternTime.ToString()的输出

2017年1月10日15:19:00


(我在英国,因此dd/MM/yyyy,您的显示方式可能不同)

将字符串转换为DateTime对象:

var datetime = DateTime.Parse("2017-01-10T13:19:00-07:00");
获取EST的时区:

var easternZone = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
转换为EST(注意转换
.ToUniversalTime()
):

easternTime.ToString()的输出

2017年1月10日15:19:00


(我在英国,因此DD/MM/YYYY,您的显示可能不同)

< P>当您的应用程序需要明确地知道时区时,您可能需要考虑DeaTeMeOffice而不是DATETIME.


这个问题看起来好像有人在这个Topic—

< P>中收集了很多的最佳实践。当你的应用程序需要明确地知道时区的时候,你可能想考虑DeaTeMeOffice而不是DATETIME.


这个问题看起来像是有人收集了很多关于这个拓扑的最佳实践-

我不知道这个问题的答案,但我知道你应该研究如何正确命名变量;p@Markinson-这只是一个例子。当我让它像我希望的那样工作时,变量将像它们应该的那样具有有意义的名称。您是否验证了您的本地时间实际上设置为东部时间,并且夏令时设置是否正确?@TJRockefeller-是的。查看我的编辑以了解我是如何验证的。唯一可以确定的方法是使用带有显式偏移量的
DateTimeOffset
。我不知道这个问题的答案,但我知道您可能应该研究如何正确命名变量;p@Markinson-这只是一个例子。当我让它像我希望的那样工作时,变量将像它们应该的那样具有有意义的名称。您是否验证了您的本地时间实际上设置为东部时间,并且夏令时设置是否正确?@TJRockefeller-是的。查看我的编辑以了解我是如何验证的。唯一可以确定的方法是使用带有显式偏移量的
DateTimeOffset
。这很有效,但并不理想。使用偏移量到
DateTime
的解析将
Kind
切换到
DateTimeKind.Local
。然后使用
ToUniversalTime
功能将本地时间转换为UTC时间。实际上,本地机器的时区应该被排除在等式之外。还值得注意的是,这将在DST回退含糊不清的情况下继续存在,但仅限于以下原因。一种更简洁的方法是使用
日期时间偏移量
,如我在回答中所示。但是谢谢这是可行的,但并不理想。使用偏移量到
DateTime
的解析将
Kind
切换到
DateTimeKind.Local
。然后使用
ToUniversalTime
功能将本地时间转换为UTC时间。实际上,本地机器的时区应该被排除在等式之外。还值得注意的是,这将在DST回退含糊不清的情况下继续存在,但仅限于以下原因。一种更简洁的方法是使用
日期时间偏移量
,如我在回答中所示。但是谢谢
// your input string
string green = "2017-01-10T13:19:00-07:00";

// parse to a DateTimeOffset
DateTimeOffset dto = DateTimeOffset.Parse(green);

// find the time zone that you are interested in.
// note that this one is US Eastern time - inclusive of both EST and EDT, despite the name.
TimeZoneInfo tzi = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");

// convert the DateTimeOffset to the time zone
DateTimeOffset eastern = TimeZoneInfo.ConvertTime(dto, tzi);

// If you need it, you can get just the DateTime portion.  (Its .Kind will be Unspecified)
DateTime dtEastern = eastern.DateTime;