C# 将从internet提取的字符串转换为日期时间

C# 将从internet提取的字符串转换为日期时间,c#,datetime,parsing,C#,Datetime,Parsing,我正在制作一个程序,在互联网上搜索,并用我搜索的所有信息填充课堂。我有一个DateTime属性,需要从我拉入的字符串填充该属性。输入的字符串如下所示:美国东部时间9:53a 08/13/18 我已经尝试使用DateTime.ParseExact尝试将此字符串转换为DateTime,使用以下格式字符串:h:mmt ET mm/dd/yy 因此,调用如下所示:var lastTime=DateTime.ParseExactlistValue[0]。InnerText,format,provider

我正在制作一个程序,在互联网上搜索,并用我搜索的所有信息填充课堂。我有一个DateTime属性,需要从我拉入的字符串填充该属性。输入的字符串如下所示:美国东部时间9:53a 08/13/18

我已经尝试使用DateTime.ParseExact尝试将此字符串转换为DateTime,使用以下格式字符串:h:mmt ET mm/dd/yy

因此,调用如下所示:var lastTime=DateTime.ParseExactlistValue[0]。InnerText,format,provider

其中InnerText只是我试图转换的文本,Format是我在上面指定的字符串,provider是en US

我在尝试执行此行时遇到以下异常:字符串未被识别为有效的日期时间

如何格式化此字符串以将其正确转换为日期时间?

调用

DateTime.ParseExact("9:53a ET 08/13/18".ToUpper(), "h:mmt ET MM/dd/yy", null)
返回正确解析的日期。a不能被识别为AM/PM标识符,因为它是小写的,因此是toUpper,而mm/dd/yy应该是mm/dd/yy,因为mm小写是分钟

呼叫

DateTime.ParseExact("9:53a ET 08/13/18".ToUpper(), "h:mmt ET MM/dd/yy", null)

返回正确解析的日期。a不能被识别为AM/PM标识符,因为它是小写的,因此是toUpper,而mm/dd/yy应该是mm/dd/yy,因为mm小写是分钟

你有几个问题。首先,正如@ChrisCudmore所指出的,您需要在月份中使用MM,而不是MM。其次,DateTime.Parse希望AM/PM指示符是大写的,所以您需要将其大写。以下是一个例子:

string strDate = "9:53a ET 08/13/18";
DateTime dt = DateTime.ParseExact(strDate.ToUpper(), "h:mmt ET MM/dd/yy", System.Globalization.CultureInfo.CurrentCulture);

这应该适用于您提供的示例字符串date

你有几个问题。首先,正如@ChrisCudmore所指出的,您需要在月份中使用MM,而不是MM。其次,DateTime.Parse希望AM/PM指示符是大写的,所以您需要将其大写。以下是一个例子:

string strDate = "9:53a ET 08/13/18";
DateTime dt = DateTime.ParseExact(strDate.ToUpper(), "h:mmt ET MM/dd/yy", System.Globalization.CultureInfo.CurrentCulture);

这应该适用于您提供的示例字符串date

在这里,让你感到困惑的是a和p的名称。日期-时间格式不支持这一点。请参见编辑我不知道这是否是性能最好的解决方案,但您可以使用TryParseExact来说明a和p。我制作了一个静态方法来解决您的问题:

public static DateTime? CustomParse(string dateString)
{
    DateTime date;

    //Hard code the 'a' in the parse string
    if(DateTime.TryParseExact(dateString, "h:mma ET MM/dd/yy", new CultureInfo("en-US"), DateTimeStyles.None, out date))
    {
        return date;
    }
    //'a' wasnt in the right position, try the 'p'
    else if(DateTime.TryParseExact(dateString, "h:mmp ET MM/dd/yy", new CultureInfo("en-US"), DateTimeStyles.None, out date))
    {
        //Adding 12 hours to make it "PM" to the DateTime object
        date = date.AddHours(12);
        return date;
    }               

    // Could not parse, return null
    return null;
}
另外,记住用MM代替MM,MM是分钟而不是月

我拉了把小提琴


EDIT看到了其他答案,我觉得a和p都不被识别。骗局是天才,别用我的

在这里,让你感到困惑的是a和p的名称。日期-时间格式不支持这一点。请参见编辑我不知道这是否是性能最好的解决方案,但您可以使用TryParseExact来说明a和p。我制作了一个静态方法来解决您的问题:

public static DateTime? CustomParse(string dateString)
{
    DateTime date;

    //Hard code the 'a' in the parse string
    if(DateTime.TryParseExact(dateString, "h:mma ET MM/dd/yy", new CultureInfo("en-US"), DateTimeStyles.None, out date))
    {
        return date;
    }
    //'a' wasnt in the right position, try the 'p'
    else if(DateTime.TryParseExact(dateString, "h:mmp ET MM/dd/yy", new CultureInfo("en-US"), DateTimeStyles.None, out date))
    {
        //Adding 12 hours to make it "PM" to the DateTime object
        date = date.AddHours(12);
        return date;
    }               

    // Could not parse, return null
    return null;
}
另外,记住用MM代替MM,MM是分钟而不是月

我拉了把小提琴


EDIT看到了其他答案,我觉得a和p都不被识别。骗局是天才,别用我的

嗯是分钟。试试看,嗯,是几分钟。试试看,MMToUpper工作正常。甚至没有意识到AM/PM名称是大写而不是小写。谢谢。请使用System.Globalization.CultureInfo.InvariantCulture,否则如果您在用户系统中未使用英语区域性,它将抛出System.IndexOutOfRangeException。ToUpper工作正常。甚至没有意识到AM/PM名称是大写而不是小写。谢谢。请使用System.Globalization.CultureInfo.InvariantCulture,否则如果您在用户系统中未使用英语区域性,它将抛出System.IndexAutoFrangeException。