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;