Как удалить временную часть даты в C # только в объекте DateTime?


459

Мне нужно удалить часть времени даты или, возможно, дату в следующем формате, а objectне в форме string.

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

Я не могу использовать stringметоды конвертации, так как мне нужна дата в objectформе.

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


10
В C # нет класса / структуры только для даты. Если вы хотите иметь его, вы должны добавить свой собственный класс / структуру.
Олешри

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

@ShahnawazAalam Я верю, что это все еще строка, у меня тоже проблемы с датой и временем. нужна только дата из переменной datetime

Смотрите также этот ответ, который описывает альтернативы.
Мэтт Джонсон-

var dateTime = DateTime.Now.Date;
PrathapG

Ответы:


827

Используйте свойство 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!) Имеет временную часть по умолчанию 00:00:00. Ответ должен быть скорее: с DateTime вы не можете. Создайте свою собственную структуру или посмотрите на Noda Time.
Томас Винтер

23
@ TomasVinter правильно. В .NET Framework нет структуры «строго по дате». Вам придется создать свой собственный. Однако DateTime предоставляет метод .ToShortDateTime (), который отформатирует строку, представляющую только часть даты значения, и отформатирует дату, используя DateFormat, настроенный в текущей культуре (Thread.Current.CurrentCulture), поэтому MM-dd -гггг для США, дд-ммм-гггг для ЕС и т. д.
Майкл Дж. Хейер

16
Тем, кто говорит, что это не правильный ответ: ответ правильный, но вопрос неправильный. Это показывает незнание спрашивающего предмета. Не существует формата для даты в форме объекта. Формат имеет смысл только тогда, когда он конвертируется в строку. То, что на самом деле хранится в его объекте, нет 06/26/2009 00:00:00.000, но 63381571200000000это число тиков (1/100000000-й секунды) с DateTime.MinValue(01/01/0001). Если вы собираетесь отображать дату, то конвертируйте ее в строку, в противном случае она имеет компонент времени, равный полуночи. Смирись с этим.
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

39

Посмотрите на свойство DateTime.Date .

Получает компонент даты этого экземпляра.


20
Вы должны объяснить больше, это не ответ, это ссылка
Malachi

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

Ни один из приведенных выше ответов не решил мою проблему с winforms.

Самый простой способ достичь ТОЛЬКО даты - простая функция в 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
момент времени представлен как датой, так и временем. Если вы скажете кому-то встретиться с вами в 1:00 вечера, вы сделаете огромное предположение, что человек знает, в какой день. Даже если сегодня день, точность диктует это в явном виде. Следовательно, одно значение, представляющее момент времени с любой точностью, ДОЛЖНО включать в себя как дату, так и время с использованием контрольной начальной точки. Следовательно, дата из начальной ссылки и время из начальной ссылки - это одно и то же понятие; время добавления дополнительной точности.
iGanja

1
Время само по себе полезно, когда вы говорите о нескольких случаях: например, каждый день в полночь по UTC; первого числа каждого месяца в полдень по местному времени; и т.д. Можно утверждать, что TimeSpan может использоваться для представления этого посредством соглашения, но может быть более чистым иметь объект Time, который представляет точку в течение 24-часового периода, и часовой пояс. В конечном счете, есть три идеи, которые инкапсулирует DateTime: Date, Time и 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);

Где дт 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 ("дд / мм / гггг")

Примечание: мм в формате дд / мм / гггг должен быть заглавным


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

Используйте немного RegEx:

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

Производит дату в формате: дд / мм / гггг


1

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