Bagaimana cara menghapus bagian waktu dari tanggal di C # di objek DateTime saja?

459

Saya perlu menghapus bagian waktu dari waktu tanggal atau mungkin memiliki tanggal dalam format berikut dalam objectbentuk bukan dalam bentuk string.

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

Saya tidak dapat menggunakan stringmetode konversi apa pun karena saya memerlukan tanggal dalam objectformulir.

Saya mencoba terlebih dahulu mengonversikan DateTimeke string, menghapus tanggal waktu tertentu dari itu, tetapi menambahkan12:00:00 AM segera setelah saya mengonversinya kembali ke DateTime objectkembali.

saya tidak berguna
sumber
10
Tidak ada kelas / struktur hanya tanggal di C #. Jika Anda ingin memilikinya, Anda harus menambahkan kelas / struktur Anda sendiri.
oleschri
12
Cukup gunakan DateTime.Now.ToShortDateString ()
Mohammad Shahnawaz Alam
@ShahnawazAalam saya percaya itu masih string, saya punya masalah dengan datetime juga. hanya perlu tanggal dari variabel datetime
Lihat juga jawaban ini yang menjelaskan alternatif.
Matt Johnson-Pint
var dateTime = DateTime.Now.Date;
PrathapG

Jawaban:

827

Gunakan properti Date :

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

The datevariabel akan berisi tanggal, waktu bagian akan 00:00:00.

driis
sumber
36
Bukankah bagian waktunya adalah jam 12:00 pagi seperti yang disebutkan oleh si penanya?
API Panda
13
Bagian waktu adalah nol (tengah malam). Ketika ini diformat sebagai string menggunakan format AM / PM, ini direpresentasikan sebagai 12 AM.
driis
98
Ini tidak menjawab pertanyaan. Seperti jawabannya, DateTime.Date (yang merupakan DateTime sendiri!) Memiliki bagian waktu yang disetel ke 00:00:00. Jawabannya seharusnya: dengan DateTime, Anda tidak bisa. Bangun struktur Anda sendiri, atau lihat Noda Time.
Tomas Vinter
23
@TomasVinter benar. Tidak ada struktur "ketat-tanggal" dalam kerangka NET. Anda harus membuatnya sendiri. Namun, DateTime memperlihatkan metode .ToShortDateTime (), yang akan memformat string yang hanya mewakili bagian tanggal dari nilai, dan akan memformat tanggal menggunakan DateFormat yang dikonfigurasikan dalam Budaya saat ini (Thread.Current.CurrentCulture), jadi MM-dd -yyyy untuk AS, hh-MMM-yyyy untuk UE, dll.
Michael J. Heier
16
Kepada mereka yang mengatakan bahwa ini bukan jawaban yang benar: Jawabannya benar, tetapi pertanyaannya salah. Ini menampilkan ketidaktahuan penanya tentang subjek. Tidak ada format untuk tanggal dalam bentuk objek. Format hanya bermakna ketika dikonversi menjadi string. Apa yang sebenarnya disimpan di objeknya bukan 06/26/2009 00:00:00.000, tapi 63381571200000000, yang merupakan jumlah Kutu DateTime.MinValue(1/10000000 per detik) sejak (01/01/0001). Jika Anda akan menampilkan tanggal lalu mengubahnya menjadi string, jika tidak, ia memiliki komponen waktu tengah malam. Menghadapinya.
CptRobby
165

Anda dapat menggunakan string format untuk memberikan string output format yang Anda suka.

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

Baca lebih lanjut tentang string format tanggal dan waktu kustom .

0x49D1
sumber
48
DateAndTime.ToShortDateString ();
John Peters
Saya membutuhkan ini, tetapi dulunya CultureInfo.DateTimeFormat.ShortDatePatternramah pengguna
Dzmitry Lahoda
Ini akan memberikan output yang salah pada lokal yang tidak menggunakan format ini. Lebih baik menggunakan ToShortDateString yang sadar lokal
Matt Wilko
1
Pastikan Anda memperbarui format dd/MM/yyyyke apa yang Anda inginkan sebelum menggunakan ini!
slayernoah
.ToString()dengan format yang diinginkan persis seperti yang saya butuhkan, terima kasih!
Willem Ellis
108

Gunakan metode ToShortDateString. Lihat dokumentasi 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
Adriano Silva
sumber
2
ToShortDateStringtidak menerapkan IFormatProvider: /
Muflix
Dalam kasus saya, mengembalikan 00.00.0000, bukan 00/00/0000
bside
39

Lihatlah properti DateTime.Date .

Mendapat komponen tanggal dari instance ini.

Nick
sumber
20
Anda harus menjelaskan lebih lanjut, ini bukan jawaban, ini tautan
Maleakhi
27
@Malachi: Saya telah menyalin dan menempelkan baris pertama dari API resmi yang tertaut untuk berjaga-jaga kalau-kalau orang tidak mengerti hyperlink.
Nick
var dateTime = DateTime.Now.Date;
PrathapG
29

Itu Date properti akan kembali tanggal pada tengah malam.

Salah satu opsi bisa untuk mendapatkan nilai individual (hari / bulan / tahun) secara terpisah dan menyimpannya dalam tipe yang Anda inginkan.

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

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

Tidak ada jawaban di atas yang memecahkan masalah saya pada winforms.

cara termudah untuk mencapai tanggal SAJA adalah fungsi sederhana di Datetime:

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

Anda hanya akan memiliki tanggal di string Ulang Tahun.

MehraD
sumber
4
Mengapa ada (string)pemain? Jenis yang dikembalikan oleh ToShortDateStringmemang string.
Askolein
15

Cobalah untuk membuat Struktur Anda sendiri untuk itu. Objek DateTime akan memiliki tanggal dan waktu keduanya

Umesh CHILAKA
sumber
3
Ini seharusnya jawabannya. Tampaknya menjadi satu-satunya jawaban untuk pertanyaan aktual - waktu tidak dapat dihapus dari objek. Gulung sendiri, hidup dengan tengah malam (atau waktu hari itu) atau bekerja dengan representasi ToString dari apa yang Anda inginkan.
Phil Cooper
Ini mungkin jawaban yang paling benar tetapi juga sepenuhnya akademis untuk semua tetapi mereka yang tidak memiliki kehidupan, yang suka menciptakan kembali roda yang berubah sangat baik dengan sendirinya. Jika kita benar-benar khawatir tentang memori tambahan yang digunakan untuk menyimpan properti panjang tambahan dengan struct DateTime kita, kita memiliki masalah yang lebih besar, daripada sekadar mengabaikannya.
iGanja
Terima kasih atas jawabannya. Tanpa membuat Struktur, pengguna dapat menggunakan variabel string di sebagian besar kasus. Bagaimana menurut anda?
Kushan Randima
@ Kusushandima, ini benar dalam sebagian besar kasus. Namun, dalam pertanyaan pengguna tidak ingin dalam format string maka saya menyarankan ini sebagai salah satu alternatif.
Umesh CHILAKA
15

Kamu tidak bisa DateTime di .NET selalu punya waktu, standarnya adalah 00: 00: 00: 000. Properti Date dari DateTime juga merupakan DateTime (!), Sehingga memiliki waktu default ke 00: 00: 00: 000 juga.

Ini adalah kekurangan dalam .NET Framework, dan bisa dikatakan bahwa DateTime di .NET melanggar Prinsip Tanggung Jawab Tunggal .

Tomas Vinter
sumber
Ini jawaban yang benar untuk pertanyaan ini. Objek DateTime akan selalu memiliki Waktu.
Drkawashima
1
Karena minat, mengapa Anda menganggap ini sebagai pelanggaran SRP? Jika Anda menganggap tanggung jawab mewakili suatu titik waktu dan kelas memperlihatkan properti Ticks yang mendasarinya, properti Year / Hour / Millisecond murni ada di sana untuk menangani konvensi (arus utama).
Rob Church
Karena tanggal dan waktu adalah dua konsep yang berbeda, sayangnya dalam .NET Framework digabungkan ke dalam struktur yang sama. Dengan demikian, struktur memiliki lebih dari satu tanggung jawab (menangani tanggal dan waktu), dan karenanya melanggar SRP. DateTime di .NET tidak hanya mewakili suatu titik waktu, tetapi banyak hal lainnya juga. Oleh karena itu, mempertimbangkan tanggung jawab untuk hanya mewakili suatu titik waktu akan aneh.
Tomas Vinter
2
titik waktu, diwakili oleh tanggal dan waktu. Jika Anda memberi tahu seseorang untuk bertemu Anda pada pukul 13:00, Anda membuat asumsi besar bahwa orang itu tahu hari apa. Bahkan jika hari ini adalah hari, ketepatan menentukan yang secara eksplisit dinyatakan. Ergo nilai tunggal yang mewakili suatu titik waktu dengan ketelitian apapun HARUS mencakup tanggal dan waktu menggunakan titik awal referensi. Oleh karena itu tanggal, dari referensi awal, dan waktu, dari referensi awal, jelas merupakan konsep SAMA; waktu menambahkan presisi tambahan.
iGanja
1
Waktu sendirian berguna ketika Anda berbicara tentang banyak kejadian: misalnya setiap hari pada tengah malam UTC; pada hari pertama setiap bulan pada siang hari waktu setempat; dll. Dapat diperdebatkan, TimeSpan dapat digunakan untuk mewakili hal itu melalui konvensi, tetapi mungkin lebih bersih untuk memiliki objek Waktu yang mewakili titik dalam periode 24 jam dan zona waktu. Pada akhirnya, ada 3 ide yang DateTime merangkum: Date, Time, & TimeZone.
David Beckman
12

DateTime.Date

var newDate = DateTime.Now; //newDate.Date property is date portion of DateTime
VikciaR
sumber
9
Anda harus Menjelaskan lebih lanjut. ini bukan jawaban itu adalah tautan
Maleakhi
2
var newDate = DateTime.Now; Properti //newDate.Date adalah bagian tanggal dari DateTime. Apa yang tidak jelas? Jika tidak jelas - ikuti tautan.
VikciaR
10

Berikut adalah metode lain yang digunakanString.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);

Keluaran:

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

Date Only : 04/09/2016

Ini juga berfungsi jika Tanggal Waktu disimpan dalam database.

Untuk Lebih Banyak Format Tanggal dan Waktu, periksa tautan ini:

Referensi 1

Referensi 2

Semoga bisa membantu.

shaijut
sumber
OP secara eksplisit menyatakan "Saya tidak dapat menggunakan metode konversi string apa pun karena saya memerlukan tanggal dalam bentuk objek."
ChrisF
7

Cara ini hanya mendapatkan tanggal tanpa waktu

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

Output = 5/16/2015

Mayank Gupta
sumber
1
Harap pertimbangkan, bahwa jawaban yang terlambat layak untuk ditambahkan (dan dari perspektif pengguna lain yang naik daun), hanya jika itu berbeda dari jawaban yang lain. Apa yang bukan kasus di sini.
m.cekiera
5

Saya menulis sebuah DateOnlystruktur. Ini menggunakan DateTime di bawah kulit tetapi tidak ada bagian waktu yang terpapar secara publik:

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

Ini dikonversi dari VB.NET, jadi minta maaf jika beberapa konversi tidak 100%

Matt Wilko
sumber
5

Gunakan date.ToShortDateString () untuk mendapatkan tanggal tanpa komponen waktu

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

gunakan date.ToString () untuk menyesuaikan format tanggal

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

Saya terkejut tidak ada yang menyebutkan DateTime. Hari ini

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

Lihat MSDN

LukeF
sumber
Memberi +1 hanya karena jawaban Anda menghasilkan tanggal dengan properti yang benar, namun OP ingin menghapus waktu dari tanggal yang ada, bukan membuat tanggal baru.
iGanja
3

Anda Dapat Mencoba Ini untuk Satu-Satunya Tanggal Dari Masa Lalu

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

Di mana dt adalah DateTime

Vara
sumber
3

Datang di pos ini ketika mencoba menyelesaikan Q asli.

Saya menggunakan Asp.Net dan setelah beberapa penelitian yang saya temukan ketika Anda mengikat nilai tanggal dalam kode di belakang, Anda dapat membatalkan waktu sehingga tidak akan ditampilkan di layar.

C #:

DateTime Today = DateTime.Now;

aspx:

<%: this.Today.ToShortDateString() %>
John
sumber
3

menggunakan

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

Jika Anda mengonversinya menjadi string, Anda dapat dengan mudah melakukannya seperti ini.

Saya menganggap tanggal sebagai objek DateTime Anda.

date.ToString("d");

Ini hanya akan memberi Anda tanggal.

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

Jika Anda mengambil tanggal dari kalender, dengan ini kami juga mendapatkan waktu. Yang tidak diperlukan sepanjang waktu. Dengan ini kita dapat menghapus waktu dari tanggal.

hizbul25
sumber
2

dalam pengalaman saya tidak ada solusi yang bekerja, mungkin karena saya ingin menghapus waktu dari tanggal diekstrak dari database, tetapi kode di bawah ini berfungsi dengan baik:

var date = target_date.Value.ToString("dd/MM/yyyy"); 
Daniel
sumber
Pertanyaan tersebut secara spesifik menyatakan bahwa tanggal harus berupa objek, bukan string. Solusi ini mengembalikan sebuah string.
bernilai
2

Deklarasikan variabel sebagai string.

contoh:

public string dateOfBirth ;

kemudian berikan nilai seperti:

dateOfBirth = ((DateTime)(datetimevaluefromDB)).ToShortDateString();
Saud Khan
sumber
orang harus membaca pertanyaan, dan berhenti mengubah struct (di stack) ke objek (di heap) tanpa alasan.
iGanja
2

Saya tahu ini adalah posting lama dengan banyak jawaban, tetapi saya belum melihat cara ini untuk menghapus porsi waktu. Misalkan Anda memiliki DateTimevariabel yang dipanggil myDate, dengan tanggal dengan bagian waktu. Anda dapat membuat DateTimeobjek baru darinya, tanpa waktu, menggunakan konstruktor ini:

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

Seperti ini:

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

Dengan cara ini Anda membuat DateTimeobjek baru berdasarkan yang lama, dengan 00:00:00 sebagai bagian waktu.

Guillermo Gutiérrez
sumber
2

Buat struct yang hanya menampung properti yang Anda inginkan. Kemudian metode ekstensi untuk dengan mudah mendapatkan struct itu dari instance 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
        };
    }
}

Pemakaian

DateTime dt = DateTime.Now;
DateOnly result = dt.GetDateOnly();
tukang batu
sumber
2

Untuk mendapatkan hanya bagian tanggal menggunakan metode ToString (),

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

Catatan: mm dalam format dd / MM / yyyy harus ditulis dengan huruf besar

nate.py
sumber
1

Gunakan. Tanggal objek DateTime akan mengabaikan bagian waktu.

Ini kode:

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

Keluaran:

>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
Jota
sumber
1

Gunakan sedikit RegEx:

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

Menghasilkan tanggal dalam format: dd / mm / yyyy

DividedByZero
sumber
1

Untuk menggunakan oleh datalist, repeater .. di halaman aspx: <% # Eval ("YourDateString"). ToString (). Hapus (10)%>

Filip Dialm
sumber
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();
}
ImranNaqvi
sumber
1

Ini bisa dilakukan dengan cara ini:

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

Kode ini memberi Anda pandangan yang jelas tentang penulisan Dateserta secara Timeterpisah

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

Semoga ini membantu.

Nol
sumber