【问题标题】:C# DateTime.TryParse same format, different dateC# DateTime.TryParse 格式相同,日期不同
【发布时间】:2013-03-29 07:59:32
【问题描述】:
DateTime res;
String s;

s = "Wed, 28 Mar 2012 10:30:52 GMT";
DateTime.TryParse(s, out res);
Console.WriteLine(s + " => " + res);

s = "Fri, 15 May 2009 20:10:57 GMT";
DateTime.TryParse(s, out res);
Console.WriteLine(s + " => " + res);

输出:

Wed, 28 Mar 2012 10:30:52 GMT => 01/01/0001 00.00.00
Fri, 15 May 2009 20:10:57 GMT => 15/05/2009 22.10.57

为什么它只适用于某些日期?显然,我同时在同一台机器上运行了该代码。

【问题讨论】:

  • 不在ideone 闻起来像时区的东西..?
  • 它适用于我的笔记本电脑
  • @VimalStan 为什么不将其发布为答案?
  • @Sepster 刚刚检查过,似乎在我的笔记本电脑上运行良好
  • @VimalStan 是的 - 我的电脑也是......但我认为你仍然是对的 - 至少,在 Jhack 的情况下,他仍然应该使用“March”而不是“Mar”进行测试 - 那'将帮助确定它是否是在 PC 上配置长日期格式的方式

标签: c# datetime tryparse


【解决方案1】:

我希望您所使用的文化的长日期格式可能只接受@VimalStan 建议的完整月份名称(您是否已经确认了这一点?)。

应该(恕我直言)也接受你正在尝试做的事情,但我知道各种文化都可能有这样的“怪癖”。例如,也许“mar”在某些文化中是模棱两可的? (虽然它在您的文化中可能并不模棱两可......也许一些代码已经从一种文化传播到另一种文化......我不知道文化规则是如何实施的,所以不知道这是否是甚至是一个有效的建议......但我认为特定文化可能并不总是按预期表现是公平的)。

使用http://msdn.microsoft.com/en-us/library/system.globalization.cultureinfo.currentculture.aspx 检查您的 .NET 上下文在哪种文化中运行。您可以通过控制面板(例如 Win 7 上的“区域和语言”)查看您的 Windows 用户配置文件在哪种环境中运行,然后采取看看那里的长日期格式。

您的示例在我的电脑上运行良好,其中长日期格式为“dddd, d MMMM yyyy”。我在澳大利亚,使用 en-au。

作为测试,尝试使用 en-au "English (Australia) 作为您的文化(通过控制面板,或根据上面的 currentculture 链接明确设置,在“明确设置 CurrentCulture 属性”标题,然后测试您的代码是否按预期工作。

如果它按预期工作,我认为这意味着问题在于您的文化在解析方面比我的文化更严格(例如,比您预期的)。因此,您可能需要确保通过整月,或者使用TryParseExact() 在这里根据另一个答案指定您自己的特定解析模式。

【讨论】:

    【解决方案2】:

    前几天我遇到了同样的问题,非常沮丧,因为没有必要失败。

    但是我解决问题的方法是转到DateTime.TryParseExact

    使用如下:

    // Parse date with no style flags.
    dateString = " 5/01/2009 8:30 AM";
    if (DateTime.TryParseExact(dateString, "g", enUS, 
                              DateTimeStyles.None, out dateValue))
       Console.WriteLine("Converted '{0}' to {1} ({2}).", 
                                 dateString, 
                                  dateValue, 
                                 dateValue.Kind);
    else
       Console.WriteLine("'{0}' is not in an acceptable format.", dateString);
    

    由于切换解析从未失败

    【讨论】:

    【解决方案3】:

    试试这个:

    DateTime res;
    String s = "Wed, 28 Mar 2012 10:30:52 GMT";
    DateTime.TryParseExact(s, "R", CultureInfo.InvariantCulture, DateTimeStyles.None, out res);
    

    这将给出:{3/28/2012 10:30:52 AM}

    还有,当

    String s = "Fri, 15 May 2009 20:10:57 GMT";
    

    这将给出:{5/15/2009 8:10:57 PM}

    【讨论】:

    • 我正在我的电脑上尝试这个,但我得到的是。getting res="01/01/0001 12:00:00 AM"。私人日期时间_fromDate;公共日期时间 FromDate { 获取 { 返回 _fromDate; } 设置 { 日期时间资源;字符串 s = value.ToString(); DateTime.TryParseExact(s, "R", CultureInfo.InvariantCulture, DateTimeStyles.None, out res); _fromDate = res; OnPropertyChanged("FromDate"); } } 请帮忙
    【解决方案4】:

    这只是一个猜测,但问题可能在于意大利语中的“Mar”是“Martedì”(星期二)这个词的开头,因此“Wed, 28 Mar 2012 10:30:52 GMT”可能会被误解为像“Wednesday Martedì/Tuesday”这样荒谬的东西。

    作为反例,我在 2013 年寻找 Martedì/星期二 28,它可以用月份代替星期几:

    2013 年 5 月 28 日 10:30:52 GMT => 28/05/2013 12.30.52

    显然它无法使用其他语言环境。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-25
      • 2011-03-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多