我从数据库得到一些结果,我正在循环它。我使用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。我相信它背后必定有一些有效的逻辑。这是什么逻辑?另外,我如何告诉编译器忽略转换包含.
的任何值。显然我可以检查值是否包含.
,如果是,我可以忽略转换。但我不想那样走。我不确定将以何种格式返回日期,但不包含.
答案 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);
}
}
答案 1 :(得分:0)
如果您知道格式或可能的格式,则可以使用DateTime.TryParseExact方法。
但是,如果您不知道可能的格式,那么解决此问题的另一种方法是对日期进行“健全性检查”:
var canConvert = DateTime.TryParse(s, out dateValue);
if (canConvert && (dateValue.Year < 1900 || dateValue.Year > 2100))
canConvert = false;
这将手动“标记”无效日期,您可以更改当前的年份范围。