【问题标题】:Parse date string with single digit day e.g. 1-11-2017 as well as 12-11-2017用一位数的日期解析日期字符串,例如2017 年 1 月 11 日和 2017 年 12 月 11 日
【发布时间】:2017-11-01 10:30:31
【问题描述】:

所以我有一个日期字符串与今天的短日期一起出现。 例如“1-11-2017”

//Here i convert the HttpCookie to a String 
string DateView = Convert.ToString(CurrDay.Value);

//Here i convert the String to DateTime
DateTime myDate = DateTime.ParseExact(DateView, "dd-MM-yyyy", System.Globalization.CultureInfo.InvariantCulture);

运行代码后出现错误:

FormatExeption 未被用户代码处理

“System.FormatException”类型的异常发生在 mscorlib.dll 但未在用户代码中处理

附加信息:字符串未被识别为有效的日期时间。

【问题讨论】:

  • dd 期望 01。你想要d

标签: c# datetime


【解决方案1】:

1-11-2017不是dd-MM-yyyy的格式,特别是第一部分。使用 d-M-yyyy 代替,当值低于 10 时,它将使用一位数字的日期和月份(即没有 0 填充)。

测试:

DateTime myDate = DateTime.ParseExact("1-11-2017", "d-M-yyyy", System.Globalization.CultureInfo.InvariantCulture);
Console.WriteLine(myDate.ToString());

如果您不知道是否会有 0 填充,您可以传递一个可接受格式的数组,解析器将按它们出现在数组中的顺序尝试每个。

DateTime myDate = DateTime.ParseExact("1-11-2017", new string[]{"d-M-yyyy", "dd-MM-yyyy"}, System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.None);

Fiddle

【讨论】:

  • 感谢您的回答。这样就解决了问题。问题是。当今天的日期输入 2 位数字时,系统将不再工作。你认为你有办法解决这个问题吗?如果是这样,我将非常感谢您的帮助!编辑:不小心按 Enter
  • 抱歉不小心按回车
  • @SennedeValk 但如果您不知道是否会有 0 填充,您可以使用提供的第二种解决方案,该解决方案将尝试使用和不使用 0 填充。
  • 很抱歉,在使用 2 位日期测试我的程序时,由于不同的原因,出现了同样的错误。
  • @SennedeValk - 不用担心,很高兴你能成功。请考虑在 15 分钟的宽限期到期后标记答案。
【解决方案2】:

日期格式dd代表The day of the month, from 01 through 31.,您可以将其提供为01-11-2017,也可以将格式化程序更改为d-MM-yyyy

这是对Custom Date and Time Format Strings的引用

【讨论】:

    【解决方案3】:

    我使用 yyyy-MM-dd 而不是 dd-MM-yyyy 解决了这个问题 (然后将其转换为正常日期) 因为 var 始终是今天的日期,所以日期可以是 1 位和 2 位数字

     CurrDay.Value = DateTime.Now.ToString("yyyy-MM-dd" ); 
    
     // Convert String to DateTime
     dateFrom = DateTime.ParseExact(CurrDay.Value.ToString(), "yyyy-MM-dd", System.Globalization.CultureInfo.InvariantCulture);
    

    下面的 cmets 帮我找到了这个解决方案, 谢谢大家!

    【讨论】:

      【解决方案4】:

      像下面这样传递值,

        string DateView = Convert.ToString("01-11-2017");
        DateTime myDate = DateTime.ParseExact(DateView, "dd-MM-yyyy", System.Globalization.CultureInfo.InvariantCulture);
      

      【讨论】:

        【解决方案5】:

        这是因为ParseExact 表示您传递格式并且该方法期望将相同的日期格式作为字符串传递,这就是您需要传递d-MM-yyyy 而不是dd-MM-yyyy 的原因。

        如果您不确定传递的字符串是一位数还是两位数,请执行以下操作:

        string[] digits = DateView.split('-');
        DateTime dateTime = new DateTime(digits[2], digits[1], digits[0]);
        

        您甚至可以改用/ 进行拆分,但您需要确保第一个数字是日期,第二个数字是月份,依此类推。

        我的建议是传递刻度而不是日期时间字符串:

        DateTime date = new DateTime(numberOfTicks);
        string valueAsStr = date.ToString("dd-mm-yyyy");
        

        【讨论】:

          【解决方案6】:

          Dabass 使用 LINQ 的更正方法(因为 DateTime 不能接受字符串)是

          int[] digits = DateView.split('-').Select(int.Parse).ToArray();
          DateTime dateTime = new DateTime(digits[2], digits[1], digits[0]);
          

          谢谢

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-03-28
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-02-15
            相关资源
            最近更新 更多