C# 如何正确解析DateTime

C# 如何正确解析DateTime,c#,datetime,tryparse,C#,Datetime,Tryparse,我有以下方法: private DateTime GetDateTimeFromString(string dateTimeStr) { try { return DateTime.Parse(dateTimeStr, CultureInfo.InvariantCulture); } catch (Exception ex) { _logger.Log(

我有以下方法:

    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;
        }
    }
当我在VisualStudio中运行它时,它工作得很好。但当它部署到Azure时,它失败了。错误是:

分析2019年4月21日11:6:56时发生异常:未将字符串识别为有效的日期时间

我在调试器中坚持2019年4月21日11:6:56,它可以工作。欺骗。有人能帮忙吗

请注意,无论是否使用CultureInfo,它在Azure作为Web应用程序时都会失败

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

<globalization culture="" uiCulture="" />
您可以尝试使用和设置解析格式

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有两个原因

DateTime.TryParseExact返回bool,您可以处理它,而不是处理异常。如果输入字符串与格式和区域性不匹配。它将返回false。 确定区域性和日期时间格式参数。 像这样

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;
您可以尝试使用和设置解析格式

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有两个原因

DateTime.TryParseExact返回bool,您可以处理它,而不是处理异常。如果输入字符串与格式和区域性不匹配。它将返回false。 确定区域性和日期时间格式参数。 像这样

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;

检查主机上的区域性设置。@MarkBenningfield,谢谢您的回复。这是一个网络应用程序。无论是否使用cultuerinfo参数,上述代码都会失败。我不认为DateTime.Parse21/4/2019 11:6:56,CultureInfo.InvariantCulture会成功-您确定显示了说明问题的代码吗?@AlexeiLevenkov,是的。这就是复制和粘贴。请检查主机上的区域性设置。@MarkBenningfield,谢谢您的回复。这是一个网络应用程序。无论是否使用cultuerinfo参数,上述代码都会失败。我不认为DateTime.Parse21/4/2019 11:6:56,CultureInfo.InvariantCulture会成功-您确定显示了说明问题的代码吗?@AlexeiLevenkov,是的。这就是复制和粘贴。非常感谢@D-shih。成功了。我想我试过TryParseExact方法,但我不知道我做错了什么,因为我遇到了错误。可能我没有使用DateTimeStyles。谢谢,现在一切都好了。@Stackedup没问题,很乐意帮忙小心外壳。hh是一个12小时的时钟。HH是24小时制。如果没有一个上午/下午的梅里迪姆指示器tt,那么一个12小时的时钟是没有用的,因为你无法分辨凌晨1点和下午1点之间的区别。非常感谢@D-shih。成功了。我想我试过TryParseExact方法,但我不知道我做错了什么,因为我遇到了错误。可能我没有使用DateTimeStyles。谢谢,现在一切都好了。@Stackedup没问题,很乐意帮忙小心外壳。hh是一个12小时的时钟。HH是24小时制。如果没有am/pm meridiem指示器tt,那么12小时时钟就没有用处,因为您无法分辨凌晨1点和下午1点之间的差异。