解析为本地时间,即使指定DateTimeStyles.AssumeLocal,也会添加额外的偏移量

时间:2017-04-04 17:32:09

标签: c# .net datetime timezone

var input = Console.ReadLine("Enter a time in format yyyy-mm-dd-hhmm");
var FromTime = DateTime.Parse(input, CultureInfo.InvariantCulture, DateTimeStyles.AssumeLocal);

我想问一下我的用户在当地时区的一段时间并使用它。然而,即使我指定AssumeLocal,它似乎将时间输入视为UTC并向我的本地时区(BST)添加偏移量:

“2017-4-1-1200”=>调试器中的FromTime = {01/04/2017 13:00:00}enter image description here

为什么让.Net把我输入的时间当作一个当地的时间来处理并不是一件容易的事情,我该如何做到这一点并没有大惊小怪?我在这里有什么误解?

1 个答案:

答案 0 :(得分:2)

问题是输入字符串的格式。

这将为您提供UTC时间:

var input = "2017-12-31-1200";
var fromTime = DateTime.Parse(input, CultureInfo.InvariantCulture, DateTimeStyles.AssumeLocal);
Console.WriteLine(String.Format("Result: {0:yyyy-MM-dd HH:mm:ss}", fromTime));
//Outputs 2017-12-31 05:00:00 for me

这会给你当地时间(通知我将hypen更改为空格并将“1200”更改为“12:00”):

var input = "2017-12-31 12:00";
var fromTime = DateTime.Parse(input, CultureInfo.InvariantCulture, DateTimeStyles.AssumeLocal);
Console.WriteLine(String.Format("Result: {0:yyyy-MM-dd HH:mm:ss}", fromTime));
//outputs 2017-12-31 12:00

我不确定哪种格式包含分隔日期和时间的连字符以及没有冒号的时间。但显然.NET将其解释为UTC日期/时间表达式。

您可以使用ParseExact

来解决这个问题
string input = "2017-12-31-1200";
var fromTime = DateTime.ParseExact(input, "yyyy-MM-dd-HHmm",CultureInfo.InvariantCulture, DateTimeStyles.AssumeLocal);
Console.WriteLine(String.Format("Result: {0:yyyy-MM-dd HH:mm:ss}", fromTime));
//outputs 2017-12-31 12:00:00