¿Cómo eliminar la porción de tiempo de la fecha en C # solo en el objeto DateTime?

459

Necesito eliminar la parte de tiempo de la fecha o probablemente tenga la fecha en el siguiente formato en objectforma no en forma de string.

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

No puedo usar ningún stringmétodo de conversión, ya que necesito la fecha en el objectformulario.

Primero intenté convertir el DateTimea a string, eliminar la fecha específica de tiempo, pero se agrega 12:00:00 AMtan pronto como lo convierto de DateTime objectnuevo.

soy inútil
fuente
10
No hay una clase / estructura de solo fecha en C #. Si desea tener uno, debe agregar su propia clase / estructura.
Oleschri
12
Simplemente use DateTime.Now.ToShortDateString ()
Mohammad Shahnawaz Alam
@ShahnawazAalam, creo que todavía es una cadena, también tuve problemas con la fecha y hora. solo necesita la fecha de la variable datetime
Vea también esta respuesta que describe alternativas.
Matt Johnson-Pint
var dateTime = DateTime.Now.Date;
PrathapG

Respuestas:

827

Use la propiedad Fecha :

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

La datevariable contendrá la fecha, la parte del tiempo será 00:00:00.

driis
fuente
36
¿No sería la parte del tiempo 12:00:00 AM como lo menciona el interrogador?
Fuego Panda
13
La parte del tiempo es cero (medianoche). Cuando esto se formatea como una cadena con el formato AM / PM, se representa como 12 AM.
driis
98
Esto no responde la pregunta. Como sugiere la respuesta, DateTime.Date (que es un DateTime en sí mismo) tiene una parte de tiempo predeterminada a 00:00:00. La respuesta debería ser más bien: con DateTime, no puedes. Construye tu propia estructura o echa un vistazo a Noda Time.
Tomas Vinter
23
@TomasVinter es correcto. No hay una estructura "estrictamente de fecha" en .NET Framework. Tendrás que crear el tuyo. Sin embargo, DateTime expone el método .ToShortDateTime (), que formateará una cadena que representa solo la parte de fecha del valor, y formateará la fecha usando el DateFormat configurado en el Culture actual (Thread.Current.CurrentCulture), por lo que MM-dd -aaaa para EE. UU., dd-MMM-aaaa para la UE, etc.
Michael J. Heier
16
Para aquellos que dicen que esta no es la respuesta correcta: la respuesta es correcta, pero la pregunta es incorrecta. Muestra la ignorancia del interlocutor sobre el tema. No hay formato para la fecha en forma de objeto. El formato solo es significativo cuando se convierte en una cadena. Lo que realmente está almacenado en su objeto no lo es 06/26/2009 00:00:00.000, pero 63381571200000000es el número de Ticks (1/100000000 de segundo) desde DateTime.MinValue(01/01/0001). Si va a mostrar la fecha, conviértala en una cadena, de lo contrario, tiene un componente de hora de medianoche. Tratar con él.
CptRobby
165

Puede usar cadenas de formato para darle a la cadena de salida el formato que desee.

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

Lea más sobre cadenas de formato de fecha y hora personalizadas .

0x49D1
fuente
48
DateAndTime.ToShortDateString ();
John Peters
Necesitaba esto, pero solía CultureInfo.DateTimeFormat.ShortDatePatternser fácil de usar
Dzmitry Lahoda
Esto dará un resultado incorrecto en configuraciones regionales que no usan este formato. Es mejor usar ToShortDateString, que es compatible con la configuración regional
Matt Wilko
1
¡Asegúrese de actualizar el formato dd/MM/yyyya lo que desea antes de usar esto!
slayernoah
.ToString()con el formato deseado es exactamente lo que necesitaba, ¡gracias!
Willem Ellis
39

Eche un vistazo a la propiedad DateTime.Date .

Obtiene el componente de fecha de esta instancia.

Mella
fuente
20
deberías explicar más, esta no es una respuesta, es un enlace
Malachi
27
@Malachi: Copié y pegué la primera línea de la API oficial vinculada en caso de que la gente no entienda los hipervínculos.
Nick
var dateTime = DateTime.Now.Date;
PrathapG
29

El Dateestablecimiento devolverá la fecha a medianoche.

Una opción podría ser obtener los valores individuales (día / mes / año) por separado y almacenarlos en el tipo que desee.

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

string.Format("{0}/{1}/{2}", month, day, year);
NoviceProgrammer
fuente
20

Ninguna de las respuestas anteriores resolvió mi problema en winforms.

La forma más fácil de alcanzar SOLO la fecha es la función simple en Fecha y hora:

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

Solo tendrá fecha en la cadena de cumpleaños.

MehraD
fuente
44
¿Por qué hay un (string)elenco? El tipo devuelto por ToShortDateStringes de hecho una cadena.
Askolein
15

Intenta hacer tu propia Estructura para eso. El objeto DateTime tendrá fecha y hora tanto

Umesh CHILAKA
fuente
3
Esta debería ser la respuesta. Parece ser la única respuesta a la pregunta real: no se puede eliminar el tiempo del objeto. Ruede el suyo, viva con la medianoche (o la hora del día) o trabaje con una representación de ToString de lo que desea.
Phil Cooper
Esta puede ser la respuesta más correcta, pero también es completamente académica para todos menos aquellos que no tienen vida, a quienes les gusta reinventar una rueda que gira muy bien por sí sola. Si realmente estamos preocupados por la memoria adicional utilizada para almacenar una propiedad larga adicional con nuestra estructura DateTime, tenemos mayores problemas que simplemente ignorarla.
iGanja
Gracias por la respuesta. Sin crear una Estructura, el usuario puede usar una variable de cadena en la mayoría de los casos. ¿Qué piensas?
Kushan Randima
@ KushanRandima, esto es cierto en la mayoría de los casos. Sin embargo, en la pregunta que el usuario no quiere en formato de cadena, por lo tanto, sugerí esto como una de las alternativas.
Umesh CHILAKA
15

No puedes Un DateTime en .NET siempre tiene un tiempo, por defecto a 00: 00: 00: 000. La propiedad Date de DateTime también es DateTime (!), Por lo que también tiene un tiempo predeterminado de 00: 00: 00: 000.

Esta es una escasez en .NET Framework, y se podría argumentar que DateTime en .NET viola el Principio de responsabilidad única .

Tomás Vinter
fuente
Esta es la respuesta correcta para esta pregunta. Los objetos de fecha y hora siempre tendrán tiempo.
Drkawashima
1
Fuera de interés, ¿por qué consideraría esto una violación de SRP? Si considera que la responsabilidad es representar un punto en el tiempo y la clase expone la propiedad subyacente de Ticks, las propiedades Año / Hora / Milisegundo están ahí para tratar con la convención (convencional).
Rob Church
Porque la fecha y la hora son dos conceptos diferentes, desafortunadamente en .NET Framework agrupados en la misma estructura. Por lo tanto, la estructura tiene más de una responsabilidad (manejar tanto la fecha como la hora) y, por lo tanto, viola SRP. DateTime en .NET no solo representa un punto en el tiempo, sino también muchas otras cosas. Por lo tanto, considerar su responsabilidad de representar solo un punto en el tiempo sería extraño.
Tomás Vinter
2
un punto en el tiempo, está representado por la fecha y la hora. Si le dice a alguien que se reúna con usted a la 1:00 p.m., está asumiendo que la persona sabe qué día. Incluso si hoy es el día, la precisión dicta que se establezca explícitamente. Ergo un valor único que representa un punto en el tiempo con cualquier precisión DEBE incluir tanto la fecha como la hora utilizando un punto de inicio de referencia. Por lo tanto, la fecha, a partir de una referencia inicial, y la hora, a partir de una referencia inicial, son claramente el MISMO concepto; tiempo agregando precisión adicional.
iGanja
1
El tiempo solo es útil cuando habla de varias instancias: por ejemplo, todos los días a la medianoche UTC; el primero de cada mes al mediodía hora local; etc. Podría decirse que TimeSpan se puede usar para representar eso por convención, pero puede ser más limpio tener un objeto Time que represente un punto dentro de un período de 24 horas y una zona horaria. En última instancia, hay 3 ideas que encapsula DateTime: fecha, hora y zona horaria.
David Beckman
12

DateTime.Date

var newDate = DateTime.Now; //newDate.Date property is date portion of DateTime
VikciaR
fuente
99
deberías explicar más. esta no es una respuesta, es un enlace
Malachi
2
var newDate = DateTime.Now; //newDate.Date propiedad es la porción de fecha de DateTime. ¿Qué no está claro? Si no está claro, siga el enlace.
VikciaR
10

Aquí hay otro método usandoString.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);

Salida:

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

Date Only : 04/09/2016

Esto también funciona si la fecha y hora se almacena en la base de datos.

Para obtener más formato de fecha y hora, consulte estos enlaces:

Referencia 1

Referencia 2

La esperanza ayuda.

shaijut
fuente
El OP establece explícitamente "No puedo usar ningún método de conversión de cadenas ya que necesito la fecha en forma de objeto".
ChrisF
7

Esta forma de obtener solo una fecha sin tiempo

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

Salida = 16/05/2015

Mayank Gupta
fuente
1
Tenga en cuenta que vale la pena agregar una respuesta tardía (y desde la perspectiva de otros usuarios), solo si es claramente diferente de otras respuestas. Lo que no es un caso aquí.
m.cekiera
5

Escribí una DateOnlyestructura. Esto usa un DateTime debajo de la piel pero no hay partes de tiempo que estén expuestas públicamente:

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

Esto se convierte desde VB.NET, así que disculpas si algunas conversiones no son 100%

Matt Wilko
fuente
5

Use date.ToShortDateString () para obtener la fecha sin el componente de hora

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

use date.ToString () para personalizar el formato de la fecha

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

Me sorprende que nadie haya mencionado DateTime.Today

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

Ver MSDN

LukeF
fuente
+1 solo porque su respuesta produce una fecha con las propiedades correctas, sin embargo, el OP desea eliminar la hora de una fecha existente, no crear una nueva fecha.
iGanja
3

Puede probar esto para la única fecha desde la fecha y hora

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

Donde dt es el DateTime

Vikas
fuente
3

Encontré esta publicación al intentar resolver la Q original.

Estoy usando Asp.Net y después de algunas investigaciones que encontré cuando está vinculando el valor de la fecha en el código detrás, puede eliminar el tiempo para que no se muestre en la pantalla.

C#:

DateTime Today = DateTime.Now;

aspx:

<%: this.Today.ToShortDateString() %>
Juan
fuente
3

utilizar

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

Si lo está convirtiendo en cadena, puede hacerlo fácilmente de esta manera.

Estoy tomando fecha como su objeto DateTime.

date.ToString("d");

Esto solo le dará la fecha.

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

Si toma la fecha del calendario, con esto también tenemos tiempo. Lo cual no se requiere todo el tiempo. Con esto podemos eliminar el tiempo de la fecha.

hizbul25
fuente
2

en mi experiencia, ninguna de las soluciones mencionadas funcionó, tal vez porque quería eliminar el tiempo de la fecha extraída de la base de datos, pero el siguiente código funcionó bien:

var date = target_date.Value.ToString("dd/MM/yyyy"); 
Daniel
fuente
La pregunta indicaba específicamente que la fecha debía ser un objeto, no una cadena. Esta solución devuelve una cadena.
Salse
2

Declara la variable como una cadena.

ejemplo:

public string dateOfBirth ;

luego asigne un valor como:

dateOfBirth = ((DateTime)(datetimevaluefromDB)).ToShortDateString();
Saud Khan
fuente
la gente debería leer la pregunta y dejar de convertir estructuras (en la pila) en objetos (en el montón) sin ningún motivo.
iGanja
2

Sé que esta es una publicación antigua con muchas respuestas, pero no he visto esta forma de eliminar la porción de tiempo. Suponga que tiene una DateTimevariable llamada myDate, con la fecha con parte de tiempo. Puede crear un nuevo DateTimeobjeto a partir de él, sin la parte de tiempo, utilizando este constructor:

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

Me gusta esto:

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

De esta manera, crea un nuevo DateTimeobjeto basado en el anterior, con 00:00:00 como parte del tiempo.

Guillermo Gutiérrez
fuente
2

Cree una estructura que contenga solo las propiedades que desee. Luego, un método de extensión para obtener fácilmente esa estructura de una instancia de 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
        };
    }
}

Uso

DateTime dt = DateTime.Now;
DateOnly result = dt.GetDateOnly();
masón
fuente
2

Para obtener solo la parte de la fecha, use el método ToString (),

ejemplo: DateTime.Now.Date.ToString ("dd / MM / aaaa")

Nota: El mm en el formato dd / MM / aaaa debe estar en mayúscula

nate.py
fuente
1

El uso .Date de un objeto DateTime ignorará la porción de tiempo.

Aquí está el código:

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

Salida:

>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
fuente
1

Use un poco de RegEx:

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

Produce una fecha en el formato: dd / mm / aaaa

Dividido por cero
fuente
1

Para usar por datalist, repetidor .. en la página aspx: <% # Eval ("YourDateString"). ToString (). Remove (10)%>

Filip Dialm
fuente
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
fuente
1

Esto podría hacerse simplemente de esta manera:

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

Este código le brinda una visión clara de la escritura Date, así como por Timeseparado

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

Espero que esto ayude.

Cero
fuente