¿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.


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.


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 .


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.


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

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.


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


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 .


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

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.


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


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%


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

4

Me sorprende que nadie haya mencionado DateTime.Today

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

Ver MSDN


+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


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

3

utilizar

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

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.


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.


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

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

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.


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

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


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

1

Use un poco de RegEx:

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

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


1

Para usar por datalist, repetidor .. en la página 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

Esto podría hacerse simplemente de esta manera:

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

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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.