C#将字符串转换为日期类型

4

我有一个字符串:

string date = "Sun, 17 Mar 2013 12:40:23 +0000";

我试图将其转换为日期类型,但当我尝试进行转换时,我一直收到“格式不正确”的错误提示。

DateTime dt = Convert.ToDateTime(date);

接下来尝试将其转换为以下格式:

dt.ToString("dd")
dt.ToString("MMMM")
dt.ToString("yyyy")

2
当我运行该代码时,没有出现任何异常,并且它按预期工作。你在哪个地区? - Matthew Watson
他的操作系统可能有不同的文化设置,这些设置以不同的方式表示日期。Convert使用它们并无法解析。 - alex
你在什么时候遇到了错误?这段代码之前对我来说是可以工作的。试着加入调试语句。 - Ashwini Verma
是的,确实需要CultureInfo。感谢大家。 - PeteTheGreek
8个回答

7
你可以使用 DateTime.ParseExact 进行转换。
尝试以下代码:
var date = "Sun, 17 Mar 2013 12:40:23 +0000";
var dt = DateTime.ParseExact(date, "ddd, dd MMM yyyy hh:mm:ss zzz", CultureInfo.InvariantCulture);

Console.WriteLine(dt.ToString("dd"));
Console.WriteLine(dt.ToString("MMMM"));
Console.WriteLine(dt.ToString("yyyy"));

输出:

17
March
2013

2
+1 使用InvariantCulture。我怀疑这就是需要让它正常工作的东西。 - Matthew Watson

3

尝试使用DateTime.Parse替代。

var dt = DateTime.Parse(date);

我还建议使用DateTime.TryParse解析日期,以确保日期始终是有效格式。

DateTime result;
if (DateTime.TryParse(date, out result))
{
    Console.WriteLine(result.ToString("dd"));
    Console.WriteLine(result.ToString("MMMM"));
    Console.WriteLine(result.ToString("yyyy"));
}
else
{
    Console.WriteLine("Error parsing date.");
}

如果您仍然遇到问题,您可能需要为DateTime提供一个CultureInfo。这样可以指定解析器使用的确切文化,以确保计算机区域设置不会引起任何问题。
DateTime.Parse(date, new CultureInfo("en-US"));     // Specific culture
DateTime.Parse(date, CultureInfo.InvariantCulture); // Culture-insensitive

// Culture-insensitive TryParse
if (DateTime.TryParse(date, out result, CultureInfo.InvariantCulture)) 
{...} 

正常的 DateTime 使用操作系统设置的区域设置。

1
需要使用CultureInfo,因为生产服务器的操作系统与本地开发机器不同。 - PeteTheGreek

3
尝试使用 DateTime.TryParse() 或者 DateTime.Parse()

他发布的代码可以正常运行,所以不知道问题出在哪里...我认为这是一个区域设置问题。 - Matthew Watson

2
您可以使用带有 CultureInfo.InvariantCultureDateTime.Parse,它会忽略当前文化设置,从而避免可能出现的本地化问题。
DateTime dt = DateTime.Parse(date, CultureInfo.InvariantCulture);

CultureInfo.InvariantCulture类似于英语文化,并与您的字符串一起使用。

Demo


1
你可以像这样使用 DateTime.Parse() 方法;
string date = "Sun, 17 Mar 2013 12:40:23 +0000";
DateTime dt = DateTime.Parse(date, CultureInfo.InvariantCulture);
Console.WriteLine(dt.ToString("dd"));
Console.WriteLine(dt.ToString("MMMM"));
Console.WriteLine(dt.ToString("yyyy"));

输出将是:

17
March
2013

这是一个DEMO

-1:Convert.ToDateTime 这部分不太好,也不必要,而且相当令人困惑。 - Jamiec
我认为你实际上让这个问题变得更糟了。选择ParseExactTryParse(或者,你知道的,将它们结合起来- TryParseExact)并坚持使用它。不要两者都用,这只会让人感到困惑。 - Jamiec
我认为这是可以接受的,但我不明白为什么不直接跳过额外的DateTime.Parse,而是在TryParse中添加CultureInfo.InvariantCulture?除了可能使用一些额外的CPU周期之外,它没有任何作用,并且可能触发不需要的FormatException - eandersson
重要的是不要不必要地两者都做,而不是哪种方法更好。移除了-1。 - Jamiec

1

你是否查看了DateTime.TryParse方法?如果向下滚动,你会发现最后一个示例实际上是“Fri, 15 May 2009 20:10:57 GMT”,与你的请求相似。


0

公共字符串日期转换(string da) { 字符串 sDate = da; sDate = sDate.Replace("-", "/"); sDate = sDate.Replace(".", "/"); }

    string format = "dd/MM/yyyy";
    DateTime dDate;
    if (DateTime.TryParse(sDate, out dDate))
    {

        //if (DateTime.TryParseExact(sDate, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out dDate))
        //{

        sDate = dDate.ToString("MM/dd/yyyy");
        sDate = sDate.Replace("-", "/");
        sDate = sDate.Replace(".", "/");

    }
    return sDate;
}

0

好的..如果你需要以数字格式返回结果,可以尝试如下所示

 string date = "Sun, 17 Mar 2013 12:40:23 +0000";
 DateTime dt = Convert.ToDateTime(date);
 var day = dt.Day;
 var month = dt.Month;
 var year = dt.Year;
 var time = dt.ToShortTimeString();
 var hour = dt.Hour;
 var minute = dt.Minute;
 var second = dt.Second;

变量将返回精确的数字形式。 注意:小时将以24小时制表示。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接