如何仅在DateTime对象中的C#中删除日期的时间部分?


457

我需要删除日期时间中的时间部分,或者可能采用以下格式的日期,object而不是以的形式string

06/26/2009 00:00:00:000

我无法使用任何string转换方法,因为我需要object表格中的日期。

我尝试先将转换为,然后DateTime从中string删除特定时间的日期,但是12:00:00 AM一旦我DateTime object再次将其转换回原来的日期,它就会添加。


10
C#中没有仅日期的类/结构。如果要拥有一个,则必须添加自己的类/结构。
oleschri 2011年

12
只需使用DateTime.Now.ToShortDateString()
Mohammad Shahnawaz Alam

@ShahnawazAalam我认为它仍然是字符串,我也遇到了日期时间问题。只需要datetime变量中的日期

另请参阅此答案,其中描述了替代方法。
马特·约翰逊·品脱

var dateTime = DateTime.Now.Date;
PrathapG

Answers:


825

使用日期属性:

var dateAndTime = DateTime.Now;
var date = dateAndTime.Date;

date变量将包含日期,时间部分将00:00:00


36
正如发问者提到的那样,时间部分不是12:00:00 AM吗?
FIre Panda

13
时间部分为零(午夜)。如果使用AM / PM格式将其格式化为字符串,则表示为12 AM。
driis

98
这不能回答问题。如答案所示,DateTime.Date(它本身就是DateTime!)的时间部分默认为00:00:00。询问者应该是:使用DateTime,不能。构建您自己的结构,或者看看Noda Time。
Tomas Vinter 2012年

23
@TomasVinter是正确的。.NET框架中没有“严格日期”结构。您将必须创建自己的。但是,DateTime公开.ToShortDateTime()方法,该方法将格式化仅表示值的日期部分的字符串,并使用当前区域性(Thread.Current.CurrentCulture)中配置的DateFormat格式化日期。 -yyyy(美国),dd-MMM-yyyy(欧盟),等等
Michael J. Heier 2013年

16
对于那些说这不是正确答案的人:答案是正确的,但是问题是错误的。它显示了发问者对该主题的无知。日期没有采用对象格式的格式。格式仅在转换为字符串时才有意义。实际存储在他的对象中的不是06/26/2009 00:00:00.000,而是63381571200000000,这是自DateTime.MinValue(01/01/0001)起,滴答声的数量(1/100000000秒)。如果要显示日期,则将其转换为字符串,否则,其时间部分为午夜。处理它。
CptRobby

165

您可以使用格式字符串为输出字符串提供所需的格式。

DateTime dateAndTime = DateTime.Now;
Console.WriteLine(dateAndTime.ToString("dd/MM/yyyy")); // Will give you smth like 25/05/2011

阅读有关自定义日期和时间格式字符串的更多信息。


48
DateAndTime.ToShortDateString();
约翰·彼得斯

我需要这一点,但使用的CultureInfo.DateTimeFormat.ShortDatePattern是用户友好的
Dzmitry Lahoda

这将在不使用此格式的语言环境中提供错误的输出。最好使用对区域设置敏感的ToShortDateString
Matt Wilko

1
dd/MM/yyyy使用此格式之前,请确保将格式更新为所需格式!
slayernoah

.ToString()所需的格式正是我需要的,谢谢!
威廉·埃利斯


39

看一下DateTime.Date属性。

获取此实例的日期部分。


20
您应该解释更多,这不是答案,这是一个链接
Malachi 2012年

27
@Malachi:我已经从链接的官方API中复制并粘贴了第一行,以防万一人们不理解超链接。
尼克

var dateTime = DateTime.Now.Date;
PrathapG

29

Date酒店将在午夜返回日期。

一种选择是分别获取各个值(日/月/年)并将其存储在所需的类型中。

var dateAndTime = DateTime.Now; 
int year = dateAndTime.Year;
int month = dateAndTime.Month;
int day = dateAndTime.Day;

string.Format("{0}/{1}/{2}", month, day, year);

20

上面的答案都不能解决我在winforms上的问题。

到达唯一日期的最简单方法是Datetime中的简单函数:

DateTime dt = DateTime.now;
String BirthDate = dt.ToShortDateString();

您的生日字符串中只会包含日期。


4
为什么会有(string)演员?返回的类型ToShortDateString确实是一个字符串。
Askolein '16

15

尝试为此创建自己的结构。DateTime对象将同时具有日期和时间


3
这应该是答案。它似乎是对实际问题的唯一答案-无法从对象中删除时间。自己动手,与午夜(或一天中的时间)一起生活,或使用所需的ToString表示形式工作。
Phil Cooper

这可能是最正确的答案,但对于那些没有生命的人来说,这是完全学术性的,他们喜欢重新发明一个能够很好地旋转的轮子。如果我们真的担心用DateTime结构存储额外的long属性所使用的增加的内存,那么我们将面临更大的问题,而不仅仅是忽略它。
iGanja

感谢您的回答。在大多数情况下,用户无需创建结构即可使用字符串变量。你怎么看?
库山兰迪玛

@KushanRandima,在大多数情况下都是如此。但是,在问题中用户不希望使用字符串格式,因此我建议将其作为备用格式之一。
Umesh CHILAKA

15

你不能 .NET中的DateTime始终有一个时间,默认为00:00:00:000。DateTime的Date属性也是DateTime(!),因此时间也默认为00:00:00:000。

这是.NET Framework的一个不足,可以说.NET中的DateTime违反了“ 单一职责原则”


这是此问题的正确答案。DateTime对象将始终具有时间。
Drkawashima

1
出于兴趣,您为什么会认为这违反了SRP?如果您认为职责代表一个时间点,并且该类公开了基本的Ticks属性,则Year / Hour / Millisecond属性完全可以用来处理(主流)约定。
罗伯·丘奇

由于日期和时间是两个不同的概念,因此不幸的是,.NET Framework中将其捆绑为相同的结构。因此,该结构具有多个职责(处理日期和时间),因此违反了SRP。.NET中的DateTime不仅代表时间点,而且还代表其他许多东西。因此,考虑仅代表一个时间点的责任是很奇怪的。
Tomas Vinter13年

2
时间点由日期和时间表示。如果您告诉某人在下午1:00与您见面,那么您就在做一个很大的假设,即该人知道哪一天。即使今天是一天,精确度也必须明确指出。因此,以任何精度表示一个时间点的单个值都必须使用参考起点同时包括日期和时间。因此,从参考开始的日期和从参考开始的时间显然是SAME概念。时间增加了额外的精度。
iGanja

1
在谈论多个实例时,例如,每天的UTC午夜;当地时间的每月第一号;可以说,TimeSpan可以用来通过约定来表示该时间,但是使用Time对象来表示24小时内的时点和时区可能更干净。最终,DateTime封装了3个想法:Date,Time和TimeZone。
David Beckman

12

DateTime.Date

var newDate = DateTime.Now; //newDate.Date property is date portion of DateTime

9
您应该解释更多。这不是一个答案,而是一个链接
Malachi

2
var newDate = DateTime.Now; //newDate.Date属性是DateTime的日期部分。什么不清楚?如果不清楚-请点击链接。
VikciaR 2014年

10

这是另一种使用方法String.Format

    DateTime todaysDate = DateTime.UtcNow;

    string dateString = String.Format("{0:dd/MM/yyyy}", todaysDate);

    Console.WriteLine("Date with Time: "+ todaysDate.ToString());

    Console.WriteLine("Date Only : " + dateString);

输出:

Date with Time: 9/4/2016 11:42:16 AM

Date Only : 04/09/2016

如果日期时间存储在数据库中,则这也适用。

有关更多日期和时间格式,请检查以下链接:

参考1

参考2

希望会有所帮助。


OP明确指出“我无法使用任何字符串转换方法,因为我需要对象形式的日期。”
克里斯·

7

这种只获取日期而没有时间的方式

DateTime date = DateTime.Now;
string Strdateonly = date.ToString("d");

产出= 5/16/2015


1
请考虑,仅当延迟答案与其他答案明显不同时,才值得添加(并且从其他用户的角度出发)。这里不是什么情况。
m.cekiera

5

我写了一个DateOnly结构。这会在皮肤下使用DateTime,但不会公开任何时间部分:

using System;

public struct DateOnly : IComparable, IFormattable, IComparable<DateOnly>, IEquatable<DateOnly>
{

    private DateTime _dateValue;

    public int CompareTo(object obj)
    {
        if (obj == null)
        {
            return 1;
        }

        DateOnly otherDateOnly = (DateOnly)obj;
        if (otherDateOnly != null)
        {
            return ToDateTime().CompareTo(otherDateOnly.ToDateTime());
        }
        else
        {
            throw new ArgumentException("Object is not a DateOnly");
        }
    }

    int IComparable<DateOnly>.CompareTo(DateOnly other)
    {
        return this.CompareToOfT(other);
    }
    public int CompareToOfT(DateOnly other)
    {
        // If other is not a valid object reference, this instance is greater.
        if (other == new DateOnly())
        {
            return 1;
        }
        return this.ToDateTime().CompareTo(other.ToDateTime());
    }

    bool IEquatable<DateOnly>.Equals(DateOnly other)
    {
        return this.EqualsOfT(other);
    }
    public bool EqualsOfT(DateOnly other)
    {
        if (other == new DateOnly())
        {
            return false;
        }

        if (this.Year == other.Year && this.Month == other.Month && this.Day == other.Day)
        {
            return true;
        }
        else
        {
            return false;
        }
    }

    public static DateOnly Now()
    {
        return new DateOnly(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day);
    }

    public static bool TryParse(string s, ref DateOnly result)
    {
        DateTime dateValue = default(DateTime);
        if (DateTime.TryParse(s, out dateValue))
        {
            result = new DateOnly(dateValue.Year, dateValue.Month, dateValue.Day);
            return true;
        }
        else
        {
            return false;
        }
    }

    public static DateOnly Parse(string s)
    {
        DateTime dateValue = default(DateTime);
        dateValue = DateTime.Parse(s);
        return new DateOnly(dateValue.Year, dateValue.Month, dateValue.Day);
    }

    public static DateOnly ParseExact(string s, string format)
    {
        CultureInfo provider = CultureInfo.InvariantCulture;
        DateTime dateValue = default(DateTime);
        dateValue = DateTime.ParseExact(s, format, provider);
        return new DateOnly(dateValue.Year, dateValue.Month, dateValue.Day);
    }

    public DateOnly(int yearValue, int monthValue, int dayValue) : this()
    {
        Year = yearValue;
        Month = monthValue;
        Day = dayValue;
    }

    public DateOnly AddDays(double value)
    {
        DateTime d = new DateTime(this.Year, this.Month, this.Day);
        d = d.AddDays(value);
        return new DateOnly(d.Year, d.Month, d.Day);
    }

    public DateOnly AddMonths(int months)
    {
        DateTime d = new DateTime(this.Year, this.Month, this.Day);
        d = d.AddMonths(months);
        return new DateOnly(d.Year, d.Month, d.Day);
    }

    public DateOnly AddYears(int years)
    {
        DateTime d = new DateTime(this.Year, this.Month, this.Day);
        d = d.AddYears(years);
        return new DateOnly(d.Year, d.Month, d.Day);
    }

    public DayOfWeek DayOfWeek
    {
        get
        {
            return _dateValue.DayOfWeek;
        }
    }

    public DateTime ToDateTime()
    {
        return _dateValue;
    }

    public int Year
    {
        get
        {
            return _dateValue.Year;
        }
        set
        {
            _dateValue = new DateTime(value, Month, Day);
        }
    }

    public int Month
    {
        get
        {
            return _dateValue.Month;
        }
        set
        {
            _dateValue = new DateTime(Year, value, Day);
        }
    }

    public int Day
    {
        get
        {
            return _dateValue.Day;
        }
        set
        {
            _dateValue = new DateTime(Year, Month, value);
        }
    }

    public static bool operator == (DateOnly aDateOnly1, DateOnly aDateOnly2)
    {
        return (aDateOnly1.ToDateTime() == aDateOnly2.ToDateTime());
    }

    public static bool operator != (DateOnly aDateOnly1, DateOnly aDateOnly2)
    {
        return (aDateOnly1.ToDateTime() != aDateOnly2.ToDateTime());
    }

    public static bool operator > (DateOnly aDateOnly1, DateOnly aDateOnly2)
    {
        return (aDateOnly1.ToDateTime() > aDateOnly2.ToDateTime());
    }

    public static bool operator < (DateOnly aDateOnly1, DateOnly aDateOnly2)
    {
        return (aDateOnly1.ToDateTime() < aDateOnly2.ToDateTime());
    }

    public static bool operator >= (DateOnly aDateOnly1, DateOnly aDateOnly2)
    {
        return (aDateOnly1.ToDateTime() >= aDateOnly2.ToDateTime());
    }

    public static bool operator <= (DateOnly aDateOnly1, DateOnly aDateOnly2)
    {
        return (aDateOnly1.ToDateTime() <= aDateOnly2.ToDateTime());
    }

    public static TimeSpan operator - (DateOnly aDateOnly1, DateOnly aDateOnly2)
    {
        return (aDateOnly1.ToDateTime() - aDateOnly2.ToDateTime());
    }


    public override string ToString()
    {
        return _dateValue.ToShortDateString();
    }

    public string ToString(string format)
    {
        return _dateValue.ToString(format);
    }

    public string ToString(string fmt, IFormatProvider provider)
    {
        return string.Format("{0:" + fmt + "}", _dateValue);
    }

    public string ToShortDateString()
    {
        return _dateValue.ToShortDateString();
    }

    public string ToDbFormat()
    {
        return string.Format("{0:yyyy-MM-dd}", _dateValue);
    }
}

这是从VB.NET转换而来的,因此,如果某些转换不是100%,则表示歉意


5

使用date.ToShortDateString()获取不带时间成分的日期

var date = DateTime.Now
var shortDate = date.ToShortDateString() //will give you 16/01/2019

使用date.ToString()自定义日期格式

var date = DateTime.Now
var shortDate = date.ToString('dd-MMM-yyyy') //will give you 16-Jan-2019

4

我很惊讶没有人提到DateTime.Today

var date = DateTime.Today;
// {7/1/2014 12:00:00 AM}

参见MSDN


+1仅是因为您的答案会生成具有正确属性的日期,但是OP希望从现有日期中删除时间,而不是创建新日期。
iGanja

3

您可以尝试从日期时间开始的唯一日期

String.Format("{0:d/M/YYYY}",dt);

dt在哪里 DateTime


3

尝试解决原始Q时遇到了这篇文章。

我正在使用Asp.Net,经过一些研究,发现绑定到后面代码中的日期值时,可以减少时间,使其不显示在屏幕上。

C#:

DateTime Today = DateTime.Now;

aspx:

<%: this.Today.ToShortDateString() %>


3

如果要将其转换为字符串,则可以像这样轻松地进行操作。

我将date作为您的DateTime对象。

date.ToString("d");

这只会给您日期。


2
string dt = myCalender.SelectedDate.ToString();
string date = dt.Remove(10);
displayDate.Content = date;

如果您从压延机上获取日期,与此同时我们也有时间。并不是所有时间都需要。使用此方法,我们可以从日期中删除时间。


2

以我的经验,上述解决方案均无效,可能是因为我想从数据库中提取日期中删除时间,但是下面的代码运行良好:

var date = target_date.Value.ToString("dd/MM/yyyy"); 

问题特别指出,日期必须是一个对象,而不是字符串。此解决方案返回一个字符串。
2012年

2

将该变量声明为字符串。

例如:

public string dateOfBirth ;

然后分配一个值,如:

dateOfBirth = ((DateTime)(datetimevaluefromDB)).ToShortDateString();

人们应该阅读该问题,并无缘无故地停止将结构(在堆栈上)转换为对象(在堆上)。
iGanja

2

我知道这是一篇有很多答案的旧文章,但是我还没有看到删除时间部分的这种方式。假设您有一个DateTime名为的变量myDate,其中日期与时间部分相同。您可以DateTime使用以下构造函数从其中创建一个新的对象,而无需花费时间:

public DateTime(int year, int month, int day);

像这样:

myDate = new DateTime(myDate.Year, myDate.Month, myDate.Day);

这样,您将DateTime在旧对象的基础上创建一个新对象,并将其作为时间部分00:00:00。


2

创建仅包含所需属性的结构。然后是一个扩展方法,可以从DateTime实例轻松获取该结构。

public struct DateOnly
{
    public int Day { get; set; }
    public int Month { get; set; }
    public int Year { get; set; }
}

public static class DateOnlyExtensions
{
    public static DateOnly GetDateOnly(this DateTime dt)
    {
        return new DateOnly
        {
            Day = dt.Day,
            Month = dt.Month,
            Year = dt.Year
        };
    }
}

用法

DateTime dt = DateTime.Now;
DateOnly result = dt.GetDateOnly();

2

要仅获取日期部分,请使用ToString()方法,

示例:DateTime.Now.Date.ToString(“ dd / MM / yyyy”)

注意:dd / MM / yyyy格式的mm必须大写


1

使用DateTime对象的.Date将忽略时间部分。

这是代码:

DateTime dateA = DateTime.Now;
DateTime dateB = DateTime.Now.AddHours(1).AddMinutes(10).AddSeconds(14);
Console.WriteLine("Date A: {0}",dateA.ToString("o"));
Console.WriteLine("Date B: {0}", dateB.ToString("o"));
Console.WriteLine(String.Format("Comparing objects A==B? {0}", dateA.Equals(dateB)));
Console.WriteLine(String.Format("Comparing ONLY Date property A==B? {0}", dateA.Date.Equals(dateB.Date)));
Console.ReadLine();

输出:

>Date A: 2014-09-04T07:53:14.6404013+02:00
>Date B: 2014-09-04T09:03:28.6414014+02:00
>Comparing objects A==B? False
>Comparing ONLY Date property A==B? True

1

使用一点RegEx:

Regex.Match(Date.Now.ToString(), @"^.*?(?= )");

产生日期格式为:dd / mm / yyyy


1

对于按数据列表使用,请在aspx页面中使用中继器:<%#Eval(“ YourDateString”)。ToString()。Remove(10)%>


1
static void Main(string[] args)
{
    string dateStrings =  "2014-09-01T03:00:00+00:00" ;

    DateTime convertedDate = DateTime.Parse(dateStrings);
    Console.WriteLine("  {0} ----------------- {1}",

    convertedDate,DateTime.Parse(convertedDate.ToString()).ToString("dd/MM/yyyy"));

    Console.Read();
}

1

可以这样简单地完成:

var dateOnly = new DateTime(dateTime.Year, dateTime.Month, dateTime.Day)

1

此代码使您可以清晰地了解书写Date方式以及Time单独书写

string time = DateTime.Now.Hour.ToString("00") + ":" + DateTime.Now.Minute.ToString("00") + ":" + DateTime.Now.Second.ToString("00");
        string date = DateTime.Now.ToString("M-dd-yyyy");
        MessageBox.Show(date + "\n" + time);

希望这可以帮助。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.