从DateTime中只获取日期而不包含时间

本文关键字:包含 时间 取日期 获取 DateTime | 更新日期: 2023-09-27 17:49:22

我遇到了一种情况,我只需要从DateTime中获得Date

我有一个DateTime? StartDate属性(Nullable)用于保存日期值

i tried below

var d = Convert.ToDateTime(StartDate).Date;

但是它返回我d作为eg。6/22/2006 12:00:00AM

var d = Convert.ToDateTime(StartDate).Date.ToString("d");

我能得到d作为6/22/2006 ..但我不想把我的DateTime?转换成String

他们有办法只得到Date而不使用ToString("d")吗?

从DateTime中只获取日期而不包含时间

使用Date属性获取DateTime实例的Date组件:

DateTime dateTimeNow = DateTime.Now;
DateTime datePartOnly = dateTimeNow.Date;    // Return 00/00/0000 00:00:00

使用这种方法,Date属性将返回午夜的日期。因此,在本例中,时间部分将为00:00:00

有几种方法可以获得Date部分,但它的返回类型将是字符串:

1)。使用.ToString(string? format),其中format可以是标准或自定义格式字符串

string dateOnlyString = dateTimeNow.ToString("dd/MM/yyyy"); 
//Can also use .ToString("dd-MM-yyyy");

2)。使用.ToShortDateString()返回区域性敏感日期字符串

string dateOnlyString = dateTimeNow.ToShortDateString(); 
//Returns M/d/yyyy for "en-US" culture
//Returns yyyy/M/d for "ja-JP" culture

参考:这里。

试试这个:string x = DateTime.Now.ToShortDateString() .

这将获得给定字符串x的日期dd/mm/yy。

我觉得你的问题有点…悬而未决。

你要求一个没有时间的日期,但是得到一个DateTime,它两个都有。我真的不认为在大多数情况下这应该是一个问题:

如果您创建具有特定日期的DateTime,并将其与另一个日期进行比较,并且这两个日期的时间都设置为午夜,则您的比较将是有效和正确的。如:

var yesterday = new DateTime(2014, 3, 10);
var today = new DateTime(2014, 3, 11);
var tomorrow = new DateTime(2014, 3, 12);

比较和排序这些将按照您的期望工作,以下也是如此:

if(today == DateTime.Today){
    Console.WriteLine("Today is the day!");
}

换句话说,你应该完全可以假装时间部分不存在

另外,正如你在OP中提到的,如果你想确保避免任何时间分量,你可以使用Date属性:

// Note the addition of hours, minutes and seconds:
var today = new DateTime(2014, 3, 11, 14, 35, 33); 
if(today == DateTime.Today){
    Console.WriteLine("This never happened...");    
}
if(today.Date == DateTime.Today){
    Console.WriteLine("...But today is still the day!");    
}

在c# 10中可以使用DateOnly。

DateOnly date = DateOnly.FromDateTime(DateTime.Now);

DateTime确实有日期和时间。你可以自己决定在特定属性中不使用日期部分。它将只是12:00 AM,但你不会使用它。

在某些情况下,编写自己的类型而不包含时间组件是很有用的。下面是开头:

struct Date : IFormattable
{
    readonly DateTime value;
    public Date(DateTime dateAndTime)
    {
        value = dateAndTime.Date;
    }
    public string ToString(string format, IFormatProvider formatProvider)
    {
        return value.ToString(format ?? "d", formatProvider);
    }
    public string ToString(string format)
    {
        return ToString(format, null);
    }
    public string ToString(IFormatProvider formatProvider)
    {
        return ToString(null, formatProvider);
    }
    public override string ToString()
    {
        return ToString(null, null);
    }
    public static implicit operator DateTime(Date date)
    {
        return date.value;
    }
}

字段value确实持有12 AM的东西,但它是private,不能从外面看到。ToString()的重载确保除非有其他请求,否则Date将以当前区域性的短日期格式输出。