【问题标题】:Convert string to DateTime and format将字符串转换为 DateTime 和格式
【发布时间】:2013-08-29 20:25:51
【问题描述】:

我可以将下面的字符串转换为DateTime

2013 年 9 月 27 日,星期五

这就是我想要实现的目标:

String tmpDate="Friday, 27th September 2013";
closingDate = Convert.ToDateTime(tmpDate).ToString("yyyy-MM-dd");

执行上述操作我得到错误:

字符串未被识别为有效的日期时间。有一个未知数 从索引 10 开始的单词。

【问题讨论】:

标签: c# datetime


【解决方案1】:

好吧,我不确定-th, -st, -nd 是否有确切的解决方案,但你可以像这样使用它;

string tmpDate = "Friday, 27 September 2013";
DateTime dt = DateTime.ParseExact(tmpDate,
                                  "dddd, dd MMMM yyyy",
                                  CultureInfo.InvariantCulture);

这里是DEMO

我几乎建议您删除字符串中的-th-st-nd 部分,但这些违反规则:)

  • 八月
  • 星期一
  • 星期四
  • 星期日

同时检查 Habib's answer 看起来不错。

【讨论】:

  • 非常感谢,但我必须选择第一个回答并正确的人,因为这是公平的。再次感谢您。
  • @confusedMind:总是选择最佳答案,如果有多个相同的选择第一个。 SO已经通过投票来表彰最快的人。质量最终应该取胜。
【解决方案2】:

您可以像这样在数组中维护要删除的序数(这可能更容易从其他语言添加/删除序数)。这样您就不必从每个字符串输入中手动删除序数。使用TryParseExact 可以避免在无法从字符串中解析DateTime 时引发异常。

String tmpDate = "Friday, 27th September 2013";
string[] split = tmpDate.Split();
string[] ordinals = new string[] { "th", "nd", "st" };

foreach (string ord in ordinals)
   split[1] = split[1].Replace(ord, "");

tmpDate = String.Join(" ", split);
DateTime dt;
if(DateTime.TryParseExact(tmpDate, "dddd, dd MMMM yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out dt))
{
   Console.WriteLine("Parsed");
}
else
{
   Console.WriteLine("Could not parse");
}

【讨论】:

  • 但是如果月份是August,这是否会将其替换为Augu
  • 否,因为 split[1] 应该始终是数字日期,而不是月份,如果格式一致的话。如果格式发生变化,那么 TryParseExact 无论如何都会失败,所以这将是一个不同的问题。
  • 但是你的解决方案无法解析Friday, 27th August 2013 ?
  • @SonerGönül - Friday, 27th August 2013 不是有效日期。 27th August 2013Tuesday。如果您尝试解析 Friday, 27th August 2013,您的答案将(尚未测试)抛出异常。
  • 看起来没关系。它也无法解析Tuesday, 27th August 2013。在我看来,这个问题的真正答案应该是这样的; there is no direct parsing dates formated like that bro :)
【解决方案3】:

你的答案是你得到的例外。显然,这里不需要“th”。只需将其删除即可。

这对我来说很好用

String tmpDate = "Friday, 27 September 2013";
closingDate = Convert.ToDateTime(tmpDate).ToString("yyyy-MM-dd");

【讨论】:

    【解决方案4】:

    您必须手动删除 th、nd、rd 和 st,因为没有任何格式将这些考虑在内。之后,您可以使用如下所示的尝试解析

    String tmpDate = "Friday, 27th September 2013";
    tmpDate = tmpDate.Replace("nd", "")
                .Replace("th", "")
                .Replace("rd", "")
                .Replace("st", "");            
    string[] formats = { "dddd, dd MMMM yyyy" };
    DateTime dt;
    if (DateTime.TryParseExact(tmpDate, formats, CultureInfo.InvariantCulture, DateTimeStyles.NoCurrentDateDefault, out dt))
    {
         //parsing is successful
    }
    

    【讨论】:

      【解决方案5】:

      假设您提供的日期字符串的格式没有改变,-st、-nd 和 -th 可以很容易地删除(如前所述)。

      还要确保提供有效的(现有)日期,否则会抛出 System.FormatException。

      string tmpDate = "Friday, 27th September 2013";
      
      string[] splitDate = tmpDate.Split(new Char[] {' '});
      splitDate[1] = splitDate[1].Substring(0, splitDate[1].Length-2);
      string tmpDatewithoutStNdTh = String.Join(" ", splitDate);
      
      try{
          string closingDate = Convert.ToDateTime(tmpDatewithoutStNdTh).ToString("yyyy-MM-dd");
          Console.WriteLine(closingDate.ToString());
      }
      catch(System.FormatException)
      {
          Console.WriteLine("The provided date does not exist.");
      }
      

      【讨论】:

        【解决方案6】:

        http://msdn.microsoft.com/en-us/library/system.datetime.parse.aspx

        public class Example
        {
        public static void Main()
        {
          string[] dateStrings = {"2008-05-01T07:34:42-5:00", 
                                  "2008-05-01 7:34:42Z", 
                                  "Thu, 01 May 2008 07:34:42 GMT"};
          foreach (string dateString in dateStrings)
          {
             DateTime convertedDate = DateTime.Parse(dateString);
             Console.WriteLine("Converted {0} to {1} time {2}", 
                               dateString, 
                               convertedDate.Kind.ToString(), 
                               convertedDate);
          }                              
        }
        }
        

        【讨论】:

        • 不适合我,因为我假设,所以我必须删除它,(th,st,nd)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-03-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-29
        • 2022-01-12
        • 1970-01-01
        相关资源
        最近更新 更多