【问题标题】:Parsing as local time is adding an additional offset even specifying DateTimeStyles.AssumeLocal即使指定 DateTimeStyles.AssumeLocal ,解析为本地时间也会增加额外的偏移量
【发布时间】:2017-04-04 17:32:08
【问题描述】:
var input = Console.ReadLine("Enter a time in format yyyy-mm-dd-hhmm");
var FromTime = DateTime.Parse(input, CultureInfo.InvariantCulture, DateTimeStyles.AssumeLocal);

我想向我的用户询问他们当地时区的时间并使用它。然而,即使我指定AssumeLocal

"2017-4-1-1200" => FromTime = {01/04/2017 13:00:00} 在调试器中。

为什么让 .Net 将我输入的时间视为当地时间不是微不足道的,我应该怎么做才能不费吹灰之力,我在这里误解了什么?

【问题讨论】:

  • 你在哪里找到这种格式的?使用“2017-4-1 12:00”。

标签: c# .net datetime timezone


【解决方案1】:

问题在于输入字符串的格式。

这将为您提供 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

这将为您提供当地时间(注意我将连字符更改为空格并将“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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-10
    • 1970-01-01
    • 2020-09-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多