Làm cách nào để loại bỏ phần thời gian của ngày chỉ trong C # trong đối tượng DateTime?


458

Tôi cần xóa phần thời gian của ngày giờ hoặc có thể có ngày ở định dạng sau dưới dạng objectkhông phải ở dạng string.

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

Tôi không thể sử dụng bất kỳ stringphương thức chuyển đổi nào vì tôi cần ngày ở objectdạng.

Trước tiên tôi đã thử chuyển đổi DateTimethành a string, xóa ngày cụ thể từ ngày đó, nhưng nó sẽ thêm 12:00:00 AMngay sau khi tôi chuyển đổi DateTime objecttrở lại.


10
Không có lớp / cấu trúc chỉ ngày trong C #. Nếu bạn muốn có một cái, bạn phải thêm lớp / cấu trúc của riêng bạn.
oleschri

12
Chỉ cần sử dụng DateTime.Now.ToShortDateString ()
Mohammad Shahnawaz Alam

@ShahnawazAalam tôi tin rằng nó vẫn là một chuỗi, tôi cũng gặp rắc rối với datetime. chỉ cần ngày từ biến datetime

Xem thêm câu trả lời này mô tả các lựa chọn thay thế.
Matt Johnson-Pint

var dateTime = DateTime.Now.Date;
PrathapG

Câu trả lời:


826

Sử dụng thuộc tính Ngày :

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

Các datebiến sẽ chứa ngày, phần thời gian sẽ 00:00:00.


36
Không phải phần thời gian là 12:00:00 sáng như người hỏi đã đề cập sao?
FIre Panda

13
Phần thời gian bằng không (nửa đêm). Khi định dạng này được định dạng dưới dạng chuỗi sử dụng định dạng AM / PM, giá trị này được biểu thị là 12 giờ sáng.
năm11

98
Điều này không trả lời câu hỏi. Như câu trả lời cho thấy, DateTime.Date (là một DateTime tự nó!) Có một phần thời gian mặc định là 00:00:00. Các aswer nên là: với DateTime, bạn không thể. Xây dựng cấu trúc của riêng bạn, hoặc xem Noda Time.
Tomas Vinter

23
@TomasVinter là chính xác. Không có cấu trúc "đúng ngày" trong khung .NET. Bạn sẽ phải tạo riêng của bạn. Tuy nhiên, DateTime hiển thị phương thức .ToShortDateTime (), sẽ định dạng một chuỗi chỉ đại diện cho phần ngày của giá trị và sẽ định dạng ngày bằng cách sử dụng DateFormat được định cấu hình trong Văn hóa hiện tại (Thread.Civerse.CiverseCocate), vì vậy MM-dd -yyyy cho Hoa Kỳ, dd-MMM-yyyy cho EU, v.v.
Michael J. Heier 18/12/13

16
Đối với những người nói rằng đây không phải là câu trả lời đúng: Câu trả lời là đúng, nhưng câu hỏi là sai. Nó hiển thị sự thiếu hiểu biết của người hỏi về chủ đề này. Không có định dạng cho ngày có ở dạng đối tượng. Định dạng chỉ có ý nghĩa khi nó được chuyển đổi thành một chuỗi. Những gì thực sự được lưu trữ trong đối tượng của anh ta không phải 06/26/2009 00:00:00.000, nhưng 63381571200000000, đó là số lượng Ticks DateTime.MinValue(1/100000000 của một giây) kể từ (01/01/0001). Nếu bạn định hiển thị ngày thì chuyển đổi nó thành một chuỗi, nếu không, nó có thành phần thời gian là nửa đêm. Đối phó với nó.
CptRulk

165

Bạn có thể sử dụng chuỗi định dạng để cung cấp cho chuỗi đầu ra định dạng bạn thích.

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

Đọc thêm về chuỗi định dạng ngày và giờ tùy chỉnh .


48
DateAndTime.ToShortDateString ();
John Peters

Tôi cần điều này, nhưng đã từng CultureInfo.DateTimeFormat.ShortDatePatternthân thiện với người dùng
Dzmitry Lahoda

Điều này sẽ cung cấp đầu ra không chính xác trên các địa phương không sử dụng định dạng này. Sử dụng ToShortDateString tốt hơn để nhận biết ngôn ngữ
Matt Wilko

1
Hãy chắc chắn rằng bạn cập nhật định dạng dd/MM/yyyythành những gì bạn muốn trước khi bạn sử dụng này!
slayernoah

.ToString()với định dạng mong muốn là chính xác những gì tôi cần, cảm ơn!
Willem Ellis


39

Có một cái nhìn vào tài sản DateTime.Date .

Lấy thành phần ngày của trường hợp này.


20
bạn nên giải thích thêm, đây không phải là câu trả lời, đây là một liên kết
Malachi

27
@Malachi: Tôi đã sao chép và dán dòng đầu tiên từ API chính thức được liên kết chỉ trong trường hợp mọi người không hiểu siêu liên kết.
Nick

var dateTime = DateTime.Now.Date;
PrathapG

29

Các Datebất động sản sẽ trở lại ngày vào lúc nửa đêm.

Một tùy chọn có thể là lấy các giá trị riêng lẻ (ngày / tháng / năm) và lưu trữ nó theo loại bạn muốn.

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

Không có câu trả lời nào ở trên giải quyết được vấn đề của tôi về winforms.

cách dễ nhất để đạt được ngày CHỈ là hàm đơn giản trong Datetime:

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

Bạn sẽ chỉ có ngày trong chuỗi sinh nhật.


4
Tại sao có một (string)diễn viên? Loại được trả về ToShortDateStringthực sự là một chuỗi.
Askolein

15

Cố gắng tạo cấu trúc của riêng bạn cho điều đó. Đối tượng DateTime sẽ có cả ngày và thời gian


3
Đây nên là câu trả lời. Nó dường như là câu trả lời duy nhất cho câu hỏi thực tế - thời gian không thể xóa khỏi đối tượng. Tự mình lăn lộn, sống với nửa đêm (hoặc thời gian trong ngày) hoặc làm việc với đại diện ToString về những gì bạn muốn.
Phil Cooper

Đây có thể là câu trả lời đúng nhất nhưng cũng hoàn toàn mang tính học thuật cho tất cả những người không có cuộc sống, những người thích sáng tạo lại một bánh xe quay rất độc đáo. Nếu chúng tôi thực sự lo lắng về bộ nhớ đã thêm được sử dụng lưu trữ một thuộc tính dài bổ sung với cấu trúc DateTime của chúng tôi, chúng tôi có vấn đề lớn hơn, chỉ đơn giản là bỏ qua nó.
iGanja

Cảm ơn câu trả lời. Không cần tạo Cấu trúc, người dùng có thể sử dụng biến chuỗi trong hầu hết các trường hợp. Bạn nghĩ sao?
Kushan Randima

@KushanRandima, điều này đúng trong hầu hết các trường hợp. Tuy nhiên, trong câu hỏi người dùng không muốn ở định dạng chuỗi do đó tôi đã đề xuất đây là một trong những lựa chọn thay thế.
Umesh CHILAKA

15

Bạn không thể. Một DateTime trong .NET luôn có thời gian, mặc định là 00: 00: 00: 000. Thuộc tính Date của DateTime cũng là DateTime (!), Do đó cũng có thời gian mặc định là 00: 00: 00: 000.

Đây là một thiếu sót trong .NET Framework và có thể lập luận rằng DateTime trong .NET vi phạm Nguyên tắc Trách nhiệm duy nhất .


Đây là câu trả lời chính xác cho câu hỏi này. Các đối tượng DateTime sẽ luôn có Thời gian.
Drkawashima

1
Không quan tâm, tại sao bạn lại coi đây là vi phạm SRP? Nếu bạn coi trách nhiệm là đại diện cho một thời điểm và lớp phơi bày thuộc tính Ticks cơ bản, thì các thuộc tính Năm / Giờ / Millisecond hoàn toàn ở đó để xử lý quy ước (chính thống).
Rob Church

Vì ngày và giờ là hai khái niệm khác nhau, không may trong .NET Framework được gói vào cùng một cấu trúc. Do đó, cấu trúc có nhiều hơn một trách nhiệm (xử lý cả ngày VÀ thời gian) và do đó vi phạm SRP. DateTime trong .NET không chỉ đại diện cho một thời điểm, mà còn nhiều thứ khác nữa. Do đó, việc xem xét trách nhiệm chỉ đại diện cho một thời điểm sẽ là kỳ quặc.
Tomas Vinter

2
một thời điểm, được thể hiện bằng cả ngày và thời gian. Nếu bạn bảo ai đó gặp bạn lúc 1:00 PM, bạn đang đưa ra một giả định rất lớn người đó biết ngày nào. Ngay cả khi hôm nay là ngày, chính xác ra lệnh được nêu rõ ràng. Xóa một giá trị duy nhất biểu thị một điểm trong thời gian với bất kỳ độ chính xác nào PHẢI bao gồm cả ngày và thời gian sử dụng điểm bắt đầu tham chiếu. Do đó, ngày, từ một tham chiếu bắt đầu và thời gian, từ một tham chiếu bắt đầu, rõ ràng là khái niệm CÙNG; thời gian thêm độ chính xác bổ sung.
iGanja

1
Thời gian một mình rất hữu ích khi bạn đang nói về nhiều trường hợp: ví dụ mỗi ngày vào lúc nửa đêm UTC; vào ngày đầu tiên hàng tháng vào buổi trưa giờ địa phương; v.v. Có thể cho rằng, TimeSpan có thể được sử dụng để thể hiện điều đó thông qua quy ước, nhưng có thể sạch hơn khi có một đối tượng Thời gian biểu thị một điểm trong khoảng thời gian 24 giờ và múi giờ. Cuối cùng, có 3 ý tưởng mà DateTime gói gọn: Ngày, Giờ và TimeZone.
David Beckman

12

DateTime.Date

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

9
bạn nên giải thích thêm đây không phải là câu trả lời, đây là một liên kết
Malachi

2
var newDate = DateTime.Now; Thuộc tính //newDate.Date là phần ngày của DateTime. Có gì không rõ ràng? Nếu không rõ ràng - theo liên kết.
VikciaR

10

Đây là một phương pháp khác sử dụngString.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);

Đầu ra:

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

Date Only : 04/09/2016

Điều này cũng hoạt động nếu Ngày giờ được lưu trữ trong cơ sở dữ liệu.

Để biết thêm định dạng Ngày và Giờ, hãy kiểm tra các liên kết sau:

Tham khảo 1

Tham khảo 2

Hy vọng giúp.


OP tuyên bố rõ ràng "Tôi không thể sử dụng bất kỳ phương thức chuyển đổi chuỗi nào vì tôi cần ngày ở dạng đối tượng."
ChrisF

7

Cách này chỉ nhận được ngày mà không có thời gian

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

Sản lượng = 5/16/2015


1
Vui lòng xem xét, rằng một câu trả lời muộn là đáng để thêm (và từ upvote phối cảnh người dùng khác), chỉ khi nó khác biệt rõ ràng với các câu trả lời khác. Điều gì không phải là một trường hợp ở đây.
m.cekiera

5

Tôi đã viết một DateOnlycấu trúc. Điều này sử dụng DateTime dưới da nhưng không có phần thời gian nào được hiển thị công khai:

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

Điều này được chuyển đổi từ VB.NET, vì vậy xin lỗi nếu một số chuyển đổi không phải là 100%


5

Sử dụng date.ToShortDateString () để lấy ngày mà không cần thành phần thời gian

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

sử dụng date.ToString () để tùy chỉnh định dạng của ngày

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

4

Tôi ngạc nhiên không ai nhắc đến DateTime.Today

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

Xem MSDN


+1 chỉ vì câu trả lời của bạn tạo ra một ngày có các thuộc tính chính xác, tuy nhiên OP muốn xóa thời gian khỏi một ngày hiện tại, không tạo ra một ngày mới.
iGanja

3

Bạn có thể thử cái này cho ngày duy nhất từ ​​thời gian

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

Trong đó dt là DateTime


3

Đã qua bài đăng này khi cố gắng giải quyết Q. ban đầu.

Tôi đang sử dụng Asp.Net và sau một số nghiên cứu tôi đã tìm thấy khi bạn ràng buộc với giá trị của ngày trong mã phía sau, bạn có thể bỏ thời gian để nó không hiển thị trên màn hình.

C #:

DateTime Today = DateTime.Now;

aspx:

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

3

sử dụng

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

3

Nếu bạn đang chuyển đổi nó thành chuỗi, bạn có thể dễ dàng làm điều đó như thế này.

Tôi đang lấy ngày làm đối tượng DateTime của bạn.

date.ToString("d");

Điều này sẽ chỉ cung cấp cho bạn ngày.


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

Nếu bạn lấy ngày từ lịch, với điều này, chúng tôi cũng có thời gian. Mà không phải lúc nào cũng được yêu cầu. Sử dụng điều này, chúng tôi có thể loại bỏ thời gian từ ngày.


2

theo kinh nghiệm của tôi, không có giải pháp nào nói trên hoạt động, có thể vì tôi muốn xóa thời gian khỏi ngày trích xuất khỏi cơ sở dữ liệu, nhưng đoạn mã dưới đây hoạt động tốt:

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

Câu hỏi đặc biệt nêu rõ rằng ngày cần phải là một đối tượng, không phải là một chuỗi. Giải pháp này trả về một chuỗi.
sốt

2

Khai báo biến dưới dạng chuỗi.

thí dụ :

public string dateOfBirth ;

sau đó gán một giá trị như:

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

mọi người nên đọc câu hỏi và ngừng chuyển đổi các cấu trúc (trên ngăn xếp) sang các đối tượng (trên heap) mà không có lý do.
iGanja

2

Tôi biết đây là một bài viết cũ với nhiều câu trả lời, nhưng tôi chưa thấy cách xóa phần thời gian này. Giả sử bạn có một DateTimebiến được gọi myDate, với ngày có phần thời gian. Bạn có thể tạo một DateTimeđối tượng mới từ nó, mà không cần phần thời gian, sử dụng hàm tạo này:

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

Như thế này:

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

Bằng cách này, bạn tạo một DateTimeđối tượng mới dựa trên đối tượng cũ, với 00:00:00 là phần thời gian.


2

Tạo một cấu trúc chỉ chứa các thuộc tính bạn muốn. Sau đó, một phương thức mở rộng để dễ dàng lấy cấu trúc đó từ một thể hiện của 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
        };
    }
}

Sử dụng

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

2

Để chỉ lấy phần ngày, hãy sử dụng phương thức ToString (),

ví dụ: DateTime.Now.Date.ToString ("dd / MM / yyyy")

Lưu ý: mm trong định dạng dd / MM / yyyy phải được viết hoa


1

Sử dụng .Date của một đối tượng DateTime sẽ bỏ qua phần thời gian.

Đây là mã:

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

Đầu ra:

>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

Sử dụng một chút RegEx:

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

Tạo một ngày ở định dạng: dd / mm / yyyy


1

Để sử dụng bởi datalist, repeater .. trong trang aspx: <% # Eval ("YourDateString"). ToString (). Xóa (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

Điều này có thể được thực hiện đơn giản theo cách này:

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

1

Mã này cung cấp cho bạn một cái nhìn rõ ràng về văn bản Datecũng như Timeriêng biệt

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

Hi vọng điêu nay co ich.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.