ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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

我不能使用任何 string 转换方法,因为我需要 object 形式的日期。

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

C# 中没有仅限日期的类/结构。如果你想拥有一个,你必须添加你自己的类/结构。
只需使用 DateTime.Now.ToShortDateString()
@ShahnawazAalam 我相信它仍然是一个字符串,我也遇到了日期时间问题。只需要日期时间变量中的日期
另请参阅描述替代方案的 this answer
var dateTime = DateTime.Now.Date;

V
Vishal Suthar

使用 Date 属性:

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

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


提问者提到的时间部分不是上午 12:00:00 吗?
时间部分为零(午夜)。如果使用 AM/PM 格式将其格式化为字符串,则表示为 12 AM。
这没有回答问题。正如答案所暗示的那样,DateTime.Date(它本身就是一个 DateTime!)的时间部分默认为 00:00:00。答案应该是:使用 DateTime,你不能。构建你自己的结构,或者看看 Noda Time。
@TomasVinter 是正确的。 .NET 框架中没有“严格日期”结构。您将必须创建自己的。但是,DateTime 公开了 .ToShortDateTime() 方法,该方法将格式化一个仅表示值的日期部分的字符串,并将使用当前 Culture (Thread.Current.CurrentCulture) 中配置的 DateFormat 格式化日期,因此 MM-dd -yyyy 代表美国,dd-MMM-yyyy 代表欧盟等。
对于那些说这不是正确答案的人:答案是正确的,但问题是错误的。它显示了提问者对主题的无知。对象形式的日期没有格式。格式只有在转换为字符串时才有意义。他的对象中实际存储的不是 06/26/2009 00:00:00.000,而是 63381571200000000,即自 DateTime.MinValue (01/01/0001) 以来的 Ticks 数(1/100000000 秒)。如果要显示日期,则将其转换为字符串,否则,它的时间部分为午夜。处理它。
0
0x49D1

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

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

阅读有关 Custom date and time format strings 的更多信息。


DateAndTime.ToShortDateString();
我需要这个,但为了方便用户使用 CultureInfo.DateTimeFormat.ShortDatePattern
这将在不使用此格式的语言环境中提供不正确的输出。最好使用具有语言环境意识的 ToShortDateString
确保在使用之前将格式 dd/MM/yyyy 更新为您想要的!
具有所需格式的 .ToString() 正是我所需要的,谢谢!
A
ABM

使用方法 ToShortDateString。请参阅文档 http://msdn.microsoft.com/en-us/library/system.datetime.toshortdatestring.aspx

var dateTimeNow = DateTime.Now; // Return 00/00/0000 00:00:00
var dateOnlyString = dateTimeNow.ToShortDateString(); //Return 00/00/0000

ToShortDateString 未实现 IFormatProvider:/
就我而言,它返回 00.00.0000,而不是 00/00/0000
在使用该方法获取不同格式之前,您可以为 CultureInfo.CurrentCulture/Thread.CurrentThread.CurrentCulture 设置不同的值。
N
Nick

查看 DateTime.Date 属性。

获取此实例的日期组件。


你应该解释更多,这不是答案,这是一个链接
@Malachi:我从链接的官方 API 中复制并粘贴了第一行,以防人们不理解超链接。
var dateTime = DateTime.Now.Date;
A
Adrian

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);

M
MehraD

以上答案都没有解决我在winforms上的问题。

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

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

您只会在生日字符串中有日期。


为什么会有 (string) 演员表? ToShortDateString 返回的类型确实是一个字符串。
U
Umesh CHILAKA

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


这应该是答案。它似乎是实际问题的唯一答案 - 无法从对象中删除时间。滚动您自己,与午夜(或一天中的时间)一起生活或使用 ToString 表示您想要的东西。
这可能是最正确的答案,但对于除了那些没有生命的人之外的所有人来说也是完全学术的,他们喜欢重新发明一个可以自行转动的非常好的轮子。如果我们真的担心使用 DateTime 结构存储额外的 long 属性所使用的额外内存,那么我们会遇到更大的问题,而不是简单地忽略它。
感谢你的回答。在大多数情况下,用户可以在不创建结构的情况下使用字符串变量。你怎么看?
@KushanRandima,在大多数情况下都是如此。但是,在问题中,用户不想要字符串格式,因此我建议将其作为替代方案之一。
T
Tomas Vinter

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

这是 .NET Framework 的不足之处,可以说 .NET 中的 DateTime 违反了 Single Responsibility Principle


这是这个问题的正确答案。 DateTime 对象总是有时间。
出于兴趣,您为什么认为这违反了 SRP?如果您认为职责代表一个时间点并且该类公开了底层的 Ticks 属性,那么 Year/Hour/Millisecond 属性纯粹是为了处理(主流)约定。
因为日期和时间是两个不同的概念,不幸的是在.NET Framework 中捆绑成同一个结构。因此,该结构有多个职责(处理日期和时间),因此违反了 SRP。 .NET 中的 DateTime 不仅代表一个时间点,还代表许多其他事物。因此,考虑到只代表一个时间点是很奇怪的。
一个时间点,由日期和时间表示。如果您告诉某人在下午 1:00 与您见面,那么您就是在假设对方知道哪一天。即使今天是这一天,精确性也要求明确说明。因此,表示具有任何精度的时间点的单个值必须包括使用参考起点的日期和时间。因此,从起始参考开始的日期和从起始参考开始的时间显然是相同的概念;时间增加额外的精度。
当您谈论多个实例时,单独的时间很有用:例如,每天 UTC 午夜;每个月的第一天当地时间中午;等等。可以说,TimeSpan 可用于通过约定来表示,但使用 Time 对象表示 24 小时内的一个点和一个时区可能更清晰。最终,DateTime 封装了 3 个想法:Date、Time 和 TimeZone。
i
iknow

最简单的方法是这样的,它只会返回日期:

var date = DateTime.Now.ToShortDateString();

S
Shaiju T

这是使用 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

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

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

Reference 1

Reference 2

希望有所帮助。


OP 明确指出“我不能使用任何字符串转换方法,因为我需要对象形式的日期。”
A
Andrew

DateTime.Date

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

你应该解释更多。这不是答案,而是链接
var newDate = DateTime.Now; //newDate.Date 属性是 DateTime 的日期部分。有什么不清楚的?如果不清楚 - 请点击链接。
g
gsamaras

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

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

产出 = 2015 年 5 月 16 日


请考虑,只有在与其他答案明显不同的情况下,才值得添加迟到的答案(并且从其他用户的角度赞成)。这里不是什么情况。
M
Matt Wilko

我写了一个 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%,敬请见谅


Y
Yaobin Then

使用 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

L
LukeF

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

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

请参阅MSDN


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

如果要将其转换为字符串,则可以像这样轻松地做到这一点。

我将日期作为您的 DateTime 对象。

date.ToString("d");

这只会给你日期。


L
L01NL

从 .NET 6 / C# 10 开始,您可以这样做:

var dateOnly = DateOnly.FromDateTime(dateTime);

V
Vishal Suthar

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

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

其中 dt 是 DateTime


h
hmnzr

尝试解决原始 Q 时遇到此帖子。

我正在使用 Asp.Net,经过一些研究,我发现当您绑定到后面代码中的日期值时,您可以删除时间,这样它就不会显示在屏幕上。

C#:

DateTime Today = DateTime.Now;

aspx:

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

J
James

利用

DateTime.Now.ToString("dd-MM-yyyy");

I
Ian

您可以在下面使用这个简单的代码。

代码:DateTime.Now.ToShortDateString();

前任。 Console.WriteLine(DateTime.Now.ToShortDateString());


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

如果您从日历中获取日期,那么我们也可以获得时间。这不是一直需要的。使用它我们可以从日期中删除时间。


V
Vishal Suthar

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

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

该问题特别指出日期需要是一个对象,而不是一个字符串。此解决方案返回一个字符串。
c
codeMagic

将变量声明为字符串。

例子 :

public string dateOfBirth ;

然后分配一个值,如:

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

人们应该阅读这个问题,并无缘无故地停止将结构(在堆栈上)转换为对象(在堆上)。
G
Guillermo Gutiérrez

我知道这是一篇有很多答案的旧帖子,但我还没有看到这种删除时间部分的方法。假设您有一个名为 myDateDateTime 变量,其中包含日期和时间部分。您可以使用以下构造函数从中创建一个新的 DateTime 对象,而无需时间部分:

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

像这样:

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

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


H
HichemSeeSharp

这可以简单地这样做:

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

m
mason

创建一个仅包含所需属性的结构。然后是一个扩展方法,可以轻松地从 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();

n
nate.py

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

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

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


J
Jota

使用 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

D
DividedByZero

使用一点正则表达式:

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

以以下格式生成日期:dd/mm/yyyy