Як видалити частину часу в C # лише в об'єкті DateTime?


458

Мені потрібно видалити частину часу дати або, можливо, мати дату у наступному форматі у objectформі, не у формі string.

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

Я не можу використовувати жодні stringметоди перетворення, оскільки мені потрібна дата у objectформі.

Я спробував спершу перетворити DateTimeна а string, видалити з нього конкретну дату, але вона додається, 12:00:00 AMяк тільки я знову конвертую її назад DateTime object.


10
У C # немає класу / структури, що містить лише дату. Якщо ви хочете мати його, ви повинні додати свій клас / структуру.
Олешрі

12
Просто використовуйте DateTime.Now.ToShortDateString ()
Мохаммад Шахнаваз Алам

@ShahnawazAalam Я вважаю, що це все ще рядок, і у мене виникли проблеми з датою. потрібна лише дата від змінної datetime

Дивіться також цю відповідь, яка описує альтернативи.
Метт Джонсон-Пінт

var dateTime = DateTime.Now.Date;
PrathapG

Відповіді:


826

Використовуйте властивість Date :

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

dateМінлива міститиме дату, час , частина буде 00:00:00.


36
Невже час не буде 12:00:00, як згадував запитуючий?
пожежна панда

13
Часова частина дорівнює нулю (опівночі). Коли це відформатоване як рядок у форматі AM / PM, це представляється як 12 AM.
дріс

98
Це не дає відповіді на запитання. Як свідчить відповідь, у DateTime.Date (що є DateTime it self!) Є часова частина, що за замовчуванням до 00:00:00. Швидше за все, це має бути: з DateTime, ви не можете. Побудуйте власну структуру або подивіться на Noda Time.
Томаш Вінтер

23
@TomasVinter правильний. У структурі .NET відсутня структура "строго-дата". Вам доведеться створити свій власний. Однак DateTime відкриває метод .ToShortDateTime (), який буде форматувати рядок, що представляє лише частину дати значення, і форматувати дату, використовуючи DateFormat, налаштований у поточній культурі (Thread.Current.CurrentCulture), так що MM-dd -yyyy для США, dd-MMM-yyyy для ЄС тощо.
Michael J. Heier

16
Тим, хто говорить, що це не правильна відповідь: Відповідь правильна, але питання неправильне. Він відображає незнання запитувачем теми. Немає формату для дати в об’єктній формі. Формат має сенс лише тоді, коли він перетворений у рядок. Те, що насправді зберігається в його об'єкті, не є 06/26/2009 00:00:00.000, але 63381571200000000це число тиків (1 / 100000000th секунди) з DateTime.MinValue(01.01.2001). Якщо ви збираєтеся відображати дату, то перетворіть її в рядок, інакше вона має часовий компонент опівночі. Змирися з цим.
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був зручним для користувачів
Дмитро Лагода

Це дасть неправильний вихід на локалі, які не використовують цей формат. Краще використовувати ToShortDateString, який відомий на
місцях

1
Переконайтесь, що ви оновите формат dd/MM/yyyyдо потрібного, перш ніж використовувати це!
slayernoah

.ToString()з потрібним форматом саме те, що мені було потрібно, дякую!
Віллем Елліс

108

Скористайтеся методом 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

2
ToShortDateStringне здійснює IFormatProvider: /
Muflix

У моєму випадку він повернувся 00.00.0000, а не 00/00/0000
bside

39

Подивіться на властивість DateTime.Date .

Отримує компонент дати цього примірника.


20
Ви повинні пояснити більше, це не відповідь. Це посилання
Малахій

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

Жодна з вищезазначених відповідей не вирішила мою проблему щодо форм гри.

найпростіший спосіб досягти ТОЛЬКО дати - це проста функція в Datetime:

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

У вас буде дата лише в рядку з днем ​​народження.


4
Чому існує (string)акторський склад? Тип, що повертається, ToShortDateString- це дійсно рядок.
Асколейн

15

Спробуйте створити для цього свою структуру. Об'єкт DateTime матиме і дату, і час


3
Це має бути відповіддю. Здається, це єдина відповідь на власне питання - час не може бути видалений з об'єкта. Робіть свій власний, живіть з опівночі (або часу дня) або працюйте з представленням ToString того, що ви хочете.
Філ Купер

Це може бути найбільш правильною відповіддю, але також є абсолютно академічним для всіх, крім тих, хто не має життя, хто любить винаходити колесо, яке дуже красиво повертається самостійно. Якщо нас дуже турбує додана пам'ять, яка використовується для зберігання додаткової довгої властивості з нашою структурою DateTime, у нас виникають більші проблеми, ніж просто ігнорувати її.
iGanja

Дякую за відповідь. Без створення структури користувач може використовувати змінну рядка в більшості випадків. Як ти гадаєш?
Кушань Рандіма

@KushanRandima, це стосується більшості випадків. Однак у запитанні користувач не хоче в рядковому форматі, тому я запропонував це як один із заступників.
Умеш ЧИЛАКА

15

Ви не можете. DateTime у .NET завжди має час, дефолт - 00: 00: 00: 000. Властивість Date в DateTime також є DateTime (!), Таким чином, час за замовчуванням також до 00: 00: 00: 000.

Це нестача в .NET Framework, і можна стверджувати, що DateTime в .NET порушує єдиний принцип відповідальності .


Це правильна відповідь на це питання. В об'єктах DateTime завжди буде час.
Drkawashima

1
З інтересу, чому ви вважаєте це порушенням СРП? Якщо ви вважаєте, що відповідальність представляє момент часу і клас виставляє основну властивість Ticks, властивості Year / Hour / Millisecond суто існують для вирішення (основного) режиму.
Роб-Церква

Оскільки дата і час - це два різних поняття, на жаль, у .NET Framework, що вбудовані в одну структуру. Таким чином, структура має більше ніж одна відповідальність (обробка як дати, так і часу), а тому порушує SRP. DateTime в .NET не просто представляє момент часу, але й багато інших речей. Отже, вважати, що це відповідальність лише за представлення моменту, було б дивним.
Томаш Вінтер

2
момент часу, представлений як датою, так і часом. Якщо ви кажете комусь познайомитися з вами в 13:00, ви робите величезне припущення, що людина знає, який день. Навіть якщо сьогодні день, точність диктує, що чітко зазначено. Ergo - єдине значення, що представляє момент у часі з будь-якою точністю ОБОВ'ЯЗКОВО включати дату та час, використовуючи опорну початкову точку. Тому дата, починаючи з початкової посилання, і час, починаючи від вихідної посилання, явно є концепцією SAME; час додавання додаткової точності.
iGanja

1
Час поодинці корисний, коли ви говорите про кілька випадків: наприклад, щодня о півночі UTC; першого числа кожного місяця опівдні за місцевим часом; і т.д. Можливо, TimeSpan можна використовувати для представлення цього за допомогою конвенції, але може бути більш чистим об'єкт Time, який представляє собою точку протягом 24 годин та часовий пояс. Зрештою, є три ідеї, які DateTime інкапсулює: Дата, Час та TimeZone.
Девід Бекман

12

DateTime.Date

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

9
вам слід пояснити більше. це не відповідь, це посилання
Малахій

2
var newDate = DateTime.Now; //newDate.Date властивість - це частина дати DateTime. Що незрозуміло? Якщо незрозуміло - перейдіть за посиланням.
VikciaR

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

Надія допомагає.


В ОП чітко зазначено "Я не можу використовувати жодних методів перетворення рядків, оскільки мені потрібна дата в об'єктній формі".
ChrisF

7

Цей спосіб отримати лише побачення без часу

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

Вихід = 16.05.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 лише тому, що у вашій відповіді вказано дату з правильними властивостями, однак ОП хоче зняти час із існуючої дати, а не створити нову дату.
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

Якщо ви перетворюєте його в рядок, ви можете легко зробити це так.

Я приймаю дату як ваш об'єкт 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"); 

У запитанні конкретно зазначено, що датою потрібно бути об'єкт, а не рядок. Це рішення повертає рядок.
салюс

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 має бути написано з великої літери


1

Використовуйте .Date об'єкта DateTime ігнорує часовий проміжок.

Ось код:

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

Для використання даталістом, ретранслятором .. на сторінці aspx: <% # Eval ("YourDateString"). ToString (). Видалити (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);

Сподіваюсь, це допомагає.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.