使用IFormatProvider将字符串转换为dateTime

时间:2018-11-06 20:54:21

标签: c# .net

我有一个使用IFormatProvider将字符串转换为dateTime的方法,但是我不知道为获得这种格式(mm / dd / yy)调用该方法时应该传递什么内容

private DateTime DateFormat(int order, IFormatProvider provider, Dictionary<string,string> dictonary, string key)
{
   var value = GetValues(order, dictonary, key) ;

   if (value!= null)
   {
      var val = value.ToString().Trim();
      if(string.IsNullOrEmpty(val))
         return null;
      if (convert.ToDateTime(val) == DateTime.MinValue)
      { 
        return null;
      }
      else
      {
        return convert.ToDateTime(val.ToString(provider));
      }
   }
   return null;
}

//I am struggling here
OrderDate = resultset.ContainsKey("OrderDate") ? DateFormat(5, "I should 
pass the date of format mm/dd/yy", dictionary, "OrderDate") : null;

1 个答案:

答案 0 :(得分:0)

这是一个示例,说明了@SLaks的注释“使用CultureInfo”。我约会的格式对德国人来说是完全有意义的,但在美国却毫无意义。然后,我尝试使用德语的CultureInfo(/ IFormatProvider)和美国的语法来解析它。

public static void Test()
{
    var dateString = "29.7.2018";

    var cultureGermany = new CultureInfo("de-DE");
    var cultureUs = new CultureInfo("en-US");

    var germanSucceed = DateTime.TryParse(dateString, cultureGermany, DateTimeStyles.None, out var germanDateTime);
    var usSucceed = DateTime.TryParse(dateString, cultureUs, DateTimeStyles.None, out var usDateTime);

    var germanyResult = germanSucceed ? germanDateTime.ToString() : "Failed";
    var usResult = usSucceed ? usDateTime.ToString() : "Failed";

    Debug.WriteLine($"Germany: Succeeded: {germanSucceed}, value: {germanyResult}");
    Debug.WriteLine($"US: Succeeded: {usSucceed}, value: {usResult}");
}

输出是:

Germany: Succeeded: True, value: 7/29/2018 12:00:00 AM
US: Succeeded: False, value: Failed

这表明德国CultureInfo能够解析该字符串,但美国字符串失败。

如果我将日期字符串更改为美国友好的日期字符串:

    var dateString = "7/29/2018";

我得到相反的结果:

Germany: Succeeded: False, value: Failed
US: Succeeded: True, value: 7/29/2018 12:00:00 AM

顺便说一句,当您需要将字符串解析为一种类型时,使用SomeType.TryParse几乎总是最好的解决方案(至少如果该字符串来自某个来源,则无法确定其格式是否正确) )。