You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何避免使用Convert.ToDateTime读取控制台输入的日期数据

替代Convert.ToDateTime的日期解析方案

Convert.ToDateTime内部本质是调用DateTime.Parse实现的,你可以用以下两种更灵活、安全性更高的方案替代,都能满足示例中的日期读取和间隔计算需求:


方案1:使用DateTime.TryParse(容错性更高,无需提前指定格式)

这个方法不会因为输入格式非法直接抛出异常,会返回布尔值标识解析是否成功,更适合处理不确定的用户输入场景。
代码实现:

// 读取并解析开始日期
DateTime start;
while (!DateTime.TryParse(Console.ReadLine(), out start))
{
    Console.WriteLine("开始日期格式非法,请重新输入:");
}
// 读取并解析结束日期
DateTime end;
while (!DateTime.TryParse(Console.ReadLine(), out end))
{
    Console.WriteLine("结束日期格式非法,请重新输入:");
}
TimeSpan difference = end - start;
Console.WriteLine($"{difference.Days} days");

方案2:使用DateTime.TryParseExact(指定格式,解析精度更高)

如果你提前知道输入的日期格式范围,可以指定格式匹配,避免解析出不符合预期的结果,比如示例中的dd/MM/yyyy和dd MMMM yyyy两种格式可以直接指定匹配规则:
代码实现:

using System.Globalization;

// 允许的日期格式列表
string[] allowedFormats = { "dd/MM/yyyy", "dd MMMM yyyy" };
DateTime start;
while (!DateTime.TryParseExact(Console.ReadLine(), allowedFormats, CultureInfo.InvariantCulture, DateTimeStyles.None, out start))
{
    Console.WriteLine("开始日期格式非法,请重新输入:");
}
DateTime end;
while (!DateTime.TryParseExact(Console.ReadLine(), allowedFormats, CultureInfo.InvariantCulture, DateTimeStyles.None, out end))
{
    Console.WriteLine("结束日期格式非法,请重新输入:");
}
TimeSpan difference = end - start;
Console.WriteLine($"{difference.Days} days");

注意:使用CultureInfo需要先引入System.Globalization命名空间,CultureInfo.InvariantCulture可以适配英文月份的解析需求,匹配示例中的December这类英文月份输入


内容的提问来源于stack exchange,提问作者Aleksandar Yordanov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 07:45:03