0

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

4

2 回答 2

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

于 2013-02-05T08:38:42.760 回答
0

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

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

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

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

于 2013-02-05T08:41:05.040 回答