将数字解析为日期问题
本文关键字:日期 问题 数字 | 更新日期: 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;
这将手动"标记"无效日期,您当然可以更改年份范围。