【问题标题】:How to do DateTime.Parse correctly如何正确执行 DateTime.Parse
【发布时间】:2019-04-21 01:15:24
【问题描述】:

我有以下方法:

    private DateTime GetDateTimeFromString(string dateTimeStr)
    {
        try
        {
            return DateTime.Parse(dateTimeStr, CultureInfo.InvariantCulture);
        }
        catch (Exception ex)
        {
            _logger.Log($"Exception while parsing {dateTimeStr}: {ex.Message}.");

            return DateTime.Now;
        }
    }

当我在 Visual Studio 中运行它时,它工作正常。但是,当它部署到 Azure 时,它​​会失败。错误是:

解析 21/4/2019 11:6:56 时出现异常:字符串未被识别为有效的 DateTime。

我将 21/4/2019 11:6:56 粘贴在调试器中,它可以工作。糊涂了。有人可以帮忙吗?

请注意,无论有没有 CultureInfo,它在 Azure(作为 Web 应用程序)上都会失败。

同样在 Azure 上,我的 web.config 设置为:

<globalization culture="" uiCulture="" />

【问题讨论】:

  • 检查主机上的文化设置。
  • @MarkBenningfield,感谢您的回复。它是一个网络应用程序。上面的代码不管有没有 cultuerinfo 参数都会失败。
  • 我认为DateTime.Parse("21/4/2019 11:6:56", CultureInfo.InvariantCulture) 永远不会成功 - 你确定你展示的代码可以证明这个问题吗?
  • @AlexeiLevenkov,是的。那是精确的复制和粘贴。

标签: c# datetime tryparse


【解决方案1】:

您可以尝试使用DateTime.TryParseExact 并设置解析格式。

DateTime dt;

DateTime.TryParseExact("21/4/2019 11:6:56",
                       "dd/M/yyyy hh:m:ss",
                        System.Globalization.CultureInfo.InvariantCulture,
                        System.Globalization.DateTimeStyles.None,
                        out dt);

我会使用DateTime.TryParseExact 而不是DateTime.Parse 有两个原因

  1. DateTime.TryParseExact返回bool,你可以处理它而不是处理Exception。如果输入字符串与格式和文化不匹配。它将返回false
  2. 确定Culture 和日期时间格式为参数。

像这样。

DateTime dt;

if(!DateTime.TryParseExact(dateTimeStr,
                       "dd/M/yyyy hh:m:ss",
                        System.Globalization.CultureInfo.InvariantCulture,
                        System.Globalization.DateTimeStyles.None,
                        out dt))
{
    _logger.Log($"Exception while parsing {dateTimeStr}");
    dt = DateTime.Now;
}

return dt;

c# online

【讨论】:

  • 非常感谢@D-shih。有效。我想我尝试了 TryParseExact 方法,但我不知道我做错了什么,因为我得到了错误。可能我没有使用 DateTimeStyles。谢谢,现在一切都好。
  • @Stackedup 没问题很高兴为您提供帮助
  • 小心外壳。 hh 是 12 小时制。 HH 是 24 小时制。如果没有上午/下午 meridiem 指示器 (tt),那么 12 小时制是没有用的,因为您将无法分辨上午 1 点和下午 1 点之间的区别。
【解决方案2】:
    string dateTimeStr = "2019-04-35";
    DateTime dateTime;
    if (DateTime.TryParse(dateTimeStr, out dateTime))
    {
        Console.WriteLine(dateTime);
    }
    else
    {
        Console.WriteLine("Invalid");
    }

【讨论】:

    猜你喜欢
    • 2019-11-03
    • 1970-01-01
    • 1970-01-01
    • 2014-01-29
    • 2019-09-17
    • 1970-01-01
    • 2014-03-13
    • 2014-03-19
    • 2011-10-22
    相关资源
    最近更新 更多