将数字解析为日期问题

本文关键字:日期 问题 数字 | 更新日期: 2023-09-27 17:57:33

我从数据库中得到一些结果,并对其进行循环。我使用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。我相信这背后一定有一些合理的逻辑。那是什么逻辑?此外,我如何告诉编译器忽略将任何包含.的值转换为。显然,我可以检查该值是否包含.,如果包含,我可以忽略转换。但我不想走那条路。我不确定返回日期的格式,但它不会包含.

将数字解析为日期问题

关于您唯一的选择是决定哪些格式是有效的,并依次尝试每种格式,直到出现有效的解析,或者您用完了有效的格式。

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

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

然而,如果你不知道可能的格式,解决这个问题的另一种方法是对日期进行"健全性检查":

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

这将手动"标记"无效日期,您当然可以更改年份范围。