将数字解析为日期问题

时间:2013-02-05 08:26:30

标签: c# datetime datetime-format

我从数据库得到一些结果,我正在循环它。我使用DateTime.Parse方法检查每个值是否为日期。

static void Main(string[] args)
{
    DateTime dateValue;
    string s = "107.5"; //5/1/0107
    var canConvert = DateTime.TryParse(s, out dateValue);
    var val = canConvert ? dateValue.ToString("d") : s;
    if (canConvert)
    {
        Console.WriteLine(val);
    }
    Console.ReadKey();
}

问题是如果我传递的值为“107.5”,系统会将其视为有效日期并返回5/1/0107。我相信它背后必定有一些有效的逻辑。这是什么逻辑?另外,我如何告诉编译器忽略转换包含.的任何值。显然我可以检查值是否包含.,如果是,我可以忽略转换。但我不想那样走。我不确定将以何种格式返回日期,但不包含.

2 个答案:

答案 0 :(得分:2)

关于您唯一的选择是确定哪些格式有效,并按顺序尝试每一种格式,直到有一个有效的解析,或者您的有效格式用完为止。

var validFormats = new[]{"dd/MM/yyyy","yyyy-MM-dd"};
var dateStrings = new[]{ "13/10/2012","2000-01-01","107.2"};

DateTime dt = DateTime.MinValue;
foreach(var d in dateStrings)
{
     if(DateTime.TryParseExact(d, validFormats, 
               CultureInfo.CurrentCulture, DateTimeStyles.None, out dt))
    {
        Console.WriteLine(dt);
    }
    else
    {
        Console.WriteLine("{0} is not valid",d);
    }
}

实例:http://rextester.com/IXZIG43823

答案 1 :(得分:0)

如果您知道格式或可能的格式,则可以使用DateTime.TryParseExact方法。

但是,如果您不知道可能的格式,那么解决此问题的另一种方法是对日期进行“健全性检查”:

var canConvert = DateTime.TryParse(s, out dateValue);
if (canConvert && (dateValue.Year < 1900 || dateValue.Year > 2100))
    canConvert = false;

这将手动“标记”无效日期,您可以更改当前的年份范围。