如何在不将日期转换为字符串的情况下从C#中的datetime中提取日期?

如何在不将日期转换为字符串的情况下从C#中的datetime中提取日期?,c#,C#,我试图从日期时间字段中提取日期,但在C#中,如果不将其转换为字符串,则无法帮助我这样做 这是我的班级: public class Student_Info { public String Student_Name; public DateTime DateofBirth; } Student_Info student = new Student_Info(); student.Student_Name = "XYZ"; student.Dateof

我试图从日期时间字段中提取日期,但在C#中,如果不将其转换为字符串,则无法帮助我这样做

这是我的班级:

public class Student_Info
    {
        public String Student_Name;
        public DateTime DateofBirth;
}

 Student_Info student = new Student_Info();
 student.Student_Name = "XYZ";
 student.DateofBirth = Convert.ToDateTime("2019-01-01");
 MessageBox.Show(student.Student_Name + "" + student.DateofBirth);
这就是我设置值的方式

我的预期结果是
XYZ 2019-01-01

但我得到的是2019年1月1日凌晨12:00:00XYZ

需要帮助吗

提前感谢

试试这个

MessageBox.Show(student.Student_Name + "" + student.DateofBirth.ToString("yyyy-MM-dd"));

DateTime
struct始终具有时间组件。有一个
Date
属性,它主要执行您要求的操作,但即使是它也隐含了午夜时间

然而,尽管问题文本中说:

不把它转换成字符串

代码示例正在隐式转换为字符串:

MessageBox.Show(student.Student_Name + "" + student.DateofBirth);
在这种情况下,有多种选择:

student.DateofBirth.ToShortDateString()
student.DateofBirth.ToString("d") 
student.DateofBirth.ToString("d", CultureInfo.CreateSpecificCulture("de-DE")) //German format. You can put any culture here you need.
student.DateofBirth.ToString("d", CultureInfo.InvariantCulture)
student.DateofBrith.ToString("yyyy-MM-dd")
这里要小心,因为其中一些依赖于操作系统的日期格式,用户可以将其配置为做一些非常奇怪的事情,如果他们真的想做的话

您也可以在
消息框
字符串中使用以下任意一项:

MessageBox.Show($"{student.Student_Name}{student.DateofBirth:yyyy-MM-dd}");
MessageBox.Show(string.Format(CultureInfo.InvariantCulture, "{0}{1:d}", student.Student_Name, student.DateofBirth));

最后,每当我看到有人想要创建一个类似ISO-8601日期格式的日期字符串时,我都会有点害怕,这里就是这样。这样做有很多正当的理由。然而,人们想要这样做的一个常见原因恰好也是非常糟糕的:SQL。如果您这样做,那么您可以将其包含在SQL命令字符串中,几乎可以肯定您做了一些非常错误的事情,您需要在做任何其他事情之前后退一步并研究参数化查询。

student.DateofBirth.Date
但这不是
c
codeA
DateTime
始终有时间组件。您可以使用它的
Date
属性获取该日期的午夜;如果不使用仅限日期的数据类型,如's
LocalDate
,这将是最接近的结果。这似乎是一个格式问题。只需执行
student.DateofBirth.ToString(“yyyy-MM-dd”)
,请注意
DateTime
不包含格式,只包含用于指定特定时间点的值。当您要显示字符串表示形式或将字符串解析为
DateTime
时,会使用格式设置。DateTime有两个部分:1)从1/1/01开始的完整天数和一天的小数部分,即每24小时的刻度数(100纳秒)。最好的方法是在不同的时间使用ToTicks()方法。我会使用1/1/1 12:00AM、1/1/1 6:00AM、1/1/1 12:00PM和1/2/1 12:00AM。如果你想硬编码值而不是从字符串解析值,你也可以使用
new DateTime(2019,1,1)
。那么他可能会使用yyyy-mm-dd而不是dyo。你应该编辑你的答案来说明这一点。(虽然此时您只是在重复一个更完整的答案。)