有什么方法可以仅通过 ReadLine() 将 Date 设置为 DateTime 类型变量?如何?

Is there any way to set Date only through ReadLine() to a DateTime type variable? How?

我知道我可以做到并且有效

string Dob; //string
Console.WriteLine("Enter date of Birth in format DD/MM/YYYY: ");
Dob = Console.ReadLine();

但我想要这样的东西!预定义的方法或快捷方式

DateTime Dob; //DateTime
Console.WriteLine("Enter date of Birth in format DD/MM/YYYY: ");
//What i am expecting, but is not possible as its DateTime 
Dob = Console.ReadLine(); // expects a string

有没有一种特定的方法可以直接从键盘上获取日期到 Dob 变量。

在 DateTime class 中是否有为此预定义的方法? 实现此目标的最佳方法或最短方法是什么?

string line = Console.ReadLine();
DateTime dt;
while (!DateTime.TryParseExact(line, "dd/MM/yyyy", null, System.Globalization.DateTimeStyles.None, out dt))
{
    Console.WriteLine("Invalid date, please retry");
    line = Console.ReadLine();
}

此方法使用指定的格式和特定​​于区域性的格式信息将日期和时间的指定字符串表示形式转换为其等效的 DateTime。字符串表示的格式必须与指定的格式完全匹配。

DateTime myDate = DateTime.ParseExact("2009/05/08","yyyy/MM/dd",
System.Globalization.CultureInfo.InvariantCulture)

到目前为止,这是我发现的最简单和最短的方法,正如 cubrr 评论的那样。

DateTime Dob;
Console.WriteLine("Enter date of Birth in format MM/DD/YYYY: ");
//accepts date in MM/dd/yyyy format
Dob = DateTime.Parse(Console.ReadLine());

您可以在.net中通过编写如下扩展函数来扩展字符串class。

public static class Extensions
{
    public static DateTime? Dob(this string strLine)
    {
        DateTime result;
        if(DateTime.TryParseExact(strLine, "dd/MM/yyyy",System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.AdjustToUniversal,out result))
        {
            return result;
        }
        else 
        {
            return null;
        }
    }
}

然后您可以在任何字符串对象上使用它。请参阅下面的示例以了解我在说什么。

    class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Please enter your date of birth in DD/MM/YYYY:");

        // Option 1.
        // The Console.ReadLine() function returns a string.
        string strDob = Console.ReadLine();
        DateTime? dob1 = strDob.Dob();


        // Option 2.
        // You can combine the two steps together into one line for smoother reading.
        DateTime? dob = Console.ReadLine().Dob();            
    }
}

注意:DateTime 类型末尾的问号 (?) 将 DateTime "struct" 转换为可为 null 的 "object"。如果将 DateTime "struct" 设置为 null 它将抛出异常,而 DateTime?可以设置为空。考虑使用 DateTime 是一种好习惯吗? (可为空)而不是使用 DateTime "struct"