Yalnızca DateTime nesnesindeki C #'da tarihin saat bölümünü nasıl kaldırabilirim?


459

Ben tarih saatinin zaman bölümünü kaldırmak veya büyük olasılıkla objectbiçiminde değil aşağıdaki biçimde tarih olması gerekir string.

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

Formda stringtarihe ihtiyacım olduğu için herhangi bir dönüştürme yöntemi kullanamıyorum object.

İlk dönüştürme çalıştı DateTimea string, ondan zaman belirli bir tarih kaldırmak, ancak ekler 12:00:00 AMen kısa sürede geri dönüştürmek olarak DateTime objecttekrar.


10
C # 'da salt tarih sınıfı / yapısı yoktur. Eğer bir tane almak istiyorsanız, kendi sınıfınızı / yapınızı eklemelisiniz.
oleschri

12
DateTime.Now.ToShortDateString () kullanın
Mohammad Shahnawaz Alam

@ShahnawazAalam hala bir dize olduğuna inanıyorum, datetime ile de sorunum var. sadece datetime değişkeninden itibaren tarih gerekir

Alternatifleri açıklayan bu cevaba da bakınız .
Matt Johnson-Pint

var dateTime = DateTime.Now.Date;
PrathapG

Yanıtlar:


827

Date özelliğini kullanın :

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

dateDeğişken tarih içerecektir, zaman parçası olacak 00:00:00.


36
Zaman bölümü, soru soran tarafından belirtildiği gibi 00:00:00 olmaz mı?
Ateşli Panda

13
Zaman bölümü sıfırdır (gece yarısı). Bu, AM / PM biçimi kullanılarak bir dize olarak biçimlendirildiğinde, bu, 12:00 olarak gösterilir.
driis

98
Bu soruya cevap vermiyor. Yanıtın da belirttiği gibi, DateTime.Date (ki bu bir DateTime kendisidir!) Varsayılan olarak 00:00:00 olarak ayarlanan bir zaman parçasına sahiptir. Aswer şöyle olmalıdır: DateTime ile yapamazsınız. Kendi yapınızı oluşturun ya da Noda Time'a bir göz atın.
Tomas Vinter

23
@TomasVinter doğru. .NET çerçevesinde "Kesinlikle Tarih" yapısı yoktur. Kendinizinkini oluşturmanız gerekecek. Ancak DateTime, değerin yalnızca tarih bölümünü temsil eden bir dizeyi biçimlendirecek ve geçerli Culture (Thread.Current.CurrentCulture) içinde yapılandırılmış DateFormat'ı kullanarak tarihi biçimlendirecek olan .ToShortDateTime () yöntemini ortaya koyar. ABD için -yyyy, AB için dd-MMM-yyyy, vs.
Michael J. Heier

16
Bunun doğru cevap olmadığını söyleyenlere: Cevap doğru, ama soru yanlış. Sorucunun konu hakkındaki bilgisizliğini gösterir. Tarihin nesne biçiminde olması için herhangi bir biçim yoktur. Biçim yalnızca bir dizeye dönüştürüldüğünde anlamlıdır. Aslında nesnesinde saklanan şey değil 06/26/2009 00:00:00.000, ama (01/01/0001) tarihinden 63381571200000000bu yana Kenelerin sayısıdır (saniyenin 1 / 100000000. sayısı DateTime.MinValue). Tarihi görüntüleyecekseniz, daha sonra bir dizeye dönüştürürseniz, gece yarısı bir zaman bileşenine sahiptir. Başa çıkmak.
CptRobby

165

Çıktı dizesine istediğiniz biçimi vermek için biçim dizelerini kullanabilirsiniz.

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

Özel tarih ve saat biçimi dizeleri hakkında daha fazla bilgi edinin .


48
) (DateAndTime.ToShortDateString;
John Peters

Buna ihtiyacım vardı, ama CultureInfo.DateTimeFormat.ShortDatePatterneskiden kullanıcı
dostuydı

Bu, bu biçimi kullanmayan yerel ayarlarda yanlış çıktı verir. Yerelden haberdar olan ToShortDateString'i kullanmak daha iyi
Matt Wilko

1
Bunu dd/MM/yyyykullanmadan önce biçimi istediğiniz şekilde güncellediğinizden emin olun !
slayernoah

.ToString()istenilen format ile tam olarak ihtiyacım olan şey, teşekkürler!
Willem Ellis


39

DateTime.Date özelliğine bir göz atın .

Bu örneğin tarih bileşenini alır.


20
daha fazla açıklamak gerekir, bu bir cevap değil bu bir bağlantı
Malachi

27
@Malachi: İnsanların köprüleri anlamaması durumunda ilk resmi bağlantılı resmi API'dan kopyaladım ve yapıştırdım.
Nick

var dateTime = DateTime.Now.Date;
PrathapG

29

Tesis Datetarihi gece yarısı iade edecektir.

Bir seçenek, değerleri (gün / ay / yıl) ayrı ayrı almak ve istediğiniz türde saklamak olabilir.

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

Yukarıdaki cevapların hiçbiri winformlarla ilgili sorunumu çözmedi.

SADECE tarihe ulaşmanın en kolay yolu Tarih saatindeki basit işlevdir:

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

Yalnızca Birthday dizesinde tarihiniz olur.


4
Neden (string)oyuncu kadrosu var? Tarafından döndürülen tür ToShortDateStringgerçekten bir dizedir.
Askolein

15

Bunun için kendi Yapınızı yapmaya çalışın. DateTime nesnesinin hem tarihi hem de saati olacak


3
Cevap bu olmalı. Asıl sorunun tek cevabı gibi görünüyor - zaman nesneden çıkarılamaz. Kendinizi yuvarlayın, gece yarısı (veya günün saati) ile yaşayın veya istediğiniz şeyin ToString temsili ile çalışın.
Phil Cooper

Bu en doğru cevap olabilir, ancak kendi başına çok güzel dönen bir tekerleği yeniden icat etmeyi seven, hayatı olmayan herkes için tamamen akademiktir. DateTime yapımızla ek bir uzun özellik saklamak için kullanılan ek bellek konusunda gerçekten endişeliysek, basitçe görmezden gelmekten daha büyük sorunlarımız var.
iGanja

Cevap için teşekkürler. Bir Yapı oluşturmadan, kullanıcı çoğu durumda bir dize değişkeni kullanabilir. Ne düşünüyorsun?
Kushan Randima

@KushanRandima, bu çoğu durumda doğrudur. Ancak, soru kullanıcı dize biçiminde istemiyor bu nedenle bu alternatiflerinden biri olarak önerdi.
Umesh CHILAKA

15

Yapamazsın. .NET'te bir DateTime'ın her zaman bir saati vardır, varsayılan olarak 00: 00: 00: 000'dır. DateTime öğesinin Date özelliği de bir DateTime (!) Öğesidir ve bu nedenle varsayılan olarak 00: 00: 00: 000 olarak ayarlanan bir zamana sahiptir.

Bu, .NET Framework'teki bir eksikliktir ve .NET'teki DateTime'ın Tek Sorumluluk İlkesini ihlal ettiği söylenebilir .


Bu soru için doğru cevap bu. DateTime nesnelerinde her zaman Saat olur.
Drkawashima

1
İlgi alanı dışında, bunu neden SRP'nin ihlali olarak değerlendiriyorsunuz? Sorumluluğun zaman içinde bir noktayı temsil ettiğini ve sınıfın temeldeki Ticks özelliğini sergilediğini düşünüyorsanız, Yıl / Saat / Milisaniye özellikleri yalnızca (ana akım) sözleşmeyle ilgilenmek için oradadır.
Rob Kilisesi

Tarih ve saat iki farklı kavram olduğundan, ne yazık ki aynı yapıda paketlenmiş .NET Framework. Bu nedenle, yapının birden fazla sorumluluğu vardır (hem tarih hem de saati idare eder) ve bu nedenle SRP'yi ihlal eder. .NET'te DateTime yalnızca zaman içinde değil, başka birçok şeyi de temsil eder. Dolayısıyla, sadece bir noktayı temsil etmenin sorumluluğunu düşünmek tuhaf olurdu.
Tomas Vinter

2
zaman içindeki bir nokta, hem tarih hem de zaman ile temsil edilir. Birine 13: 00'da buluşmasını söylerseniz, kişinin hangi günü bildiğini büyük bir varsayımda bulunuyorsunuz. Bugün gün olsa bile, hassasiyet açıkça ifade edilir. Herhangi bir hassasiyetle zamandaki bir noktayı temsil eden tek bir değer, bir referans başlangıç ​​noktası kullanan hem tarihi hem de saati içermelidir ZORUNLU. Bu nedenle, bir başlangıç ​​referansından tarih ve bir başlangıç ​​referansından saat, açıkça AYNI kavramdır; ek hassasiyet ekleyerek zaman.
iGanja

1
Birden çok durumdan bahsederken tek başına zaman yararlıdır: örneğin UTC'nin her gece yarısı; her ayın ilk günü öğlen yerel saatinde; Muhtemelen, TimeSpan bunu konvansiyon yoluyla temsil etmek için kullanılabilir, ancak 24 saatlik bir süre ve bir zaman dilimi içindeki bir noktayı temsil eden bir Time nesnesine sahip olmak daha temiz olabilir. Sonuç olarak, DateTime'ın kapsadığı 3 fikir vardır: Tarih, Saat ve Saat Dilimi.
David Beckman

12

DateTime.Date

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

9
daha fazla açıklamalısınız. bu bir cevap değil bir bağlantı
Malachi

2
var newDate = DateTime.Now; //newDate.Date özelliği, DateTime öğesinin tarih bölümüdür. Belirsiz olan nedir? Net değilse - bağlantıyı takip edin.
VikciaR

10

İşte başka bir yöntem kullanarakString.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);

Çıktı:

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

Date Only : 04/09/2016

Bu, Tarih Saati veritabanında saklanıyorsa da çalışır.

Daha Fazla Tarih ve Saat biçimlendirmesi için şu bağlantıları kontrol edin:

Referans 1

Referans 2

Umut yardımcı olur.


OP açıkça "Ben nesne biçiminde tarihe ihtiyacım olarak herhangi bir dize dönüştürme yöntemleri kullanamazsınız" belirtir.
ChrisF

7

Bu şekilde zaman olmadan sadece tarih alın

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

Çıktı = 16.05.2015


1
Geç bir yanıtın, diğer yanıtlardan belirgin bir şekilde farklı olması durumunda, (ve diğer kullanıcılara ait perspektif yukarı oyu) eklemeye değer olduğunu lütfen unutmayın. Burada durum böyle değil.
m.cekiera

5

Bir DateOnlyyapı yazdım . Bu, derinin altında bir DateTime kullanır, ancak zaman bölümleri herkese açık olarak gösterilmez:

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

Bu, VB.NET'ten dönüştürülür, bu nedenle bazı dönüşümler% 100 değilse özür dileriz


5

Tarihi saat bileşeni olmadan almak için date.ToShortDateString () öğesini kullanın

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

tarih biçimini özelleştirmek için date.ToString () yöntemini kullanın

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

4

Kimsenin DateTime'dan bahsetmediğine şaşırdım.

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

MSDN'ye bakın


+1 yalnızca yanıtınız doğru özelliklere sahip bir tarih oluşturduğundan, ancak OP yeni bir tarih oluşturmak yerine zamanı mevcut bir tarihten kaldırmak istiyor.
iGanja

3

Bunu Tarihten Tek Tarih İçin Deneyebilirsiniz

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

Dt nerede DateTime


3

Orijinal Q'yu çözmeye çalışırken bu yazıya rastladım.

Asp.Net kullanıyorum ve bazı kod sonra tarih kodunun arkasındaki tarih değerine bağlarken buldum sonra zaman ekranda görünmez böylece bırakabilirsiniz.

C #:

DateTime Today = DateTime.Now;

aspx:

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

3

kullanım

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

3

Eğer dizgeye dönüştürüyorsanız, bunu kolayca yapabilirsiniz.

DateTime nesneniz olarak tarih alıyorum.

date.ToString("d");

Bu size sadece tarihi verecektir.


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

Takvimden tarih alırsanız, bununla da zaman alırız. Bu her zaman gerekli değildir. Bunu kullanarak, zamandan itibaren zamanı kaldırabiliriz.


2

Deneyimlerime göre, söz konusu çözümlerin hiçbiri işe yaramadı, belki de veritabanından çıkarılan tarihten saati kaldırmak istedim, ancak aşağıdaki kod iyi çalıştı:

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

Soru özellikle tarihin bir dize değil bir nesne olması gerektiğini belirtti. Bu çözüm bir dize döndürür.
saluce

2

Değişkeni dize olarak bildirin.

misal :

public string dateOfBirth ;

sonra şöyle bir değer atayın:

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

insanlar soruyu okumalı ve yapıları (yığın üzerinde) nesnelere (yığın üzerinde) sebepsiz yere dönüştürmeyi bırakmalıdır.
iGanja

2

Bunun çok cevabı olan eski bir yazı olduğunu biliyorum, ama zaman kısmını kaldırmanın bu yolunu görmedim. Diyelim ki tarih bölümü saat bölümü olan bir DateTimedeğişkeniniz var myDate. DateTimeBu yapıcıyı kullanarak zaman bölümü olmadan ondan yeni bir nesne oluşturabilirsiniz :

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

Bunun gibi:

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

Bu şekilde DateTime, eskisine dayalı yeni bir nesne oluşturursunuz ve saat kısmı 00:00:00 olur.


2

Yalnızca istediğiniz özellikleri barındıran bir yapı oluşturun. Sonra bir DateTime örneğinden bu yapı kolayca almak için bir uzantı yöntemi.

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

kullanım

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

2

Yalnızca tarih bölümünü almak için ToString () yöntemini kullanın,

örnek: DateTime.Now.Date.ToString ("gg / aa / yyyy")

Not: gg / aa / yyyy biçimindeki mm büyük harfle yazılmalıdır


1

DateTime nesnesinin .Date öğesinin kullanılması saat bölümünü yoksayar.

İşte kod:

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

Çıktı:

>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

Biraz RegEx kullanın:

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

Şu tarih biçiminde bir tarih oluşturur: gg / aa / yyyy


1

Datalist tarafından kullanmak için aspx sayfasında yineleyici ..: <% # Eval ("YourDateString"). ToString (). Kaldır (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

Bu basitçe şu şekilde yapılabilir:

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

1

Bu kod, yazı yazmanın Dateyanı sıra Timeayrı ayrı net bir görünüm sağlar

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

Bu yardımcı olur umarım.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.