2009-04-28 21 views
74

Estoy trabajando en un programa que requiere la fecha de devolución de un evento. Estoy buscando una "Fecha", no un "DateTime". Tiene que haber un tipo de datos que devuelva solo la fecha ... ¿está ahí?Fecha frente a DateTime

Respuesta

93

No, no hay. DateTime representa un punto en el tiempo que se compone de una fecha y una hora. Sin embargo, puede recuperar la parte de la fecha a través de la propiedad Date (que es otra DateTime con el tiempo configurado en 00:00:00).

Y puede recuperar propiedades de fecha individuales a través de Day, Month y Year.

1

Puede devolver DateTime donde la porción de tiempo es 00:00:00 y simplemente ignórelo. Las fechas se manejan como enteros de fecha y hora, por lo que tiene sentido combinar la fecha con la hora, ya que está presente en el entero de todos modos.

12

Desafortunadamente, no en .Net BCL. Las fechas generalmente se representan como un objeto DateTime con la hora establecida en la medianoche.

Como puedes adivinar, esto significa que tienes todos los problemas de la zona horaria asistente a su alrededor, a pesar de que para un objeto Date no deseas absolutamente ninguna gestión de zona horaria.

+0

Si está utilizando un valor DateTime como una fecha, establecer el tipo de UTC. No hay ajustes de zona horaria para tratar. DateTime date = DateTime.SpecifyKind (DateTime.Today, DateTimeKind, Utc); – Suncat2000

+0

Sí, puedo decir por experiencia que usar 'date' para cualquier cosa es una mala idea a menos que esté 100% seguro de que su aplicación solo funcionará en un solo huso horario. Guardar todo como 'datetime' te ofrece lo mejor de ambos mundos, incluido el más crítico, una manera fácil de evitar pesadillas en la zona horaria si la configuración de la zona horaria de tu servidor cambia alguna vez ... y comienza a escribir datos de formas que no anticipabas. 'Datetime' puede guardarte allí,' date' no puede en absoluto, y se volverá extremadamente difícil de corregir si alguna vez comienzas a escribir 'date' con el contexto de la zona horaria equivocada. – Kelseydh

0

Usted podría intentar una de las siguientes:

DateTime.Now.ToLongDateString(); 
DateTime.Now.ToShortDateString(); 

Pero no hay ningún tipo "Fecha" en el BCL.

4

El tipo de fecha es solo un alias del tipo DateTime utilizado por VB.NET (como int se convierte en entero). Ambos tipos tienen una propiedad Date que le devuelve el objeto con la parte de hora establecida en 00:00:00.

+1

Es cierto. [La página de documentación de MSDN para el tipo de fecha VB.NET] (http://msdn.microsoft.com/en-us/library/3eaydw6e.aspx) dice: * El tipo correspondiente en .NET Framework es el [System.DateTime] (http://msdn.microsoft.com/en-us/library/system.datetime.aspx) structure. * – miroxlav

3

DateTime tiene una propiedad Date que puede usar para aislar la parte de la fecha. El método ToString también hace un buen trabajo al mostrar solo la parte Fecha cuando la parte de tiempo está vacía.

1

Para esto, debe usar la fecha, pero ignore el valor del tiempo.

Ordinariamente una fecha habría un DateTime con el tiempo de 00:00:00

DateTime El tipo tiene una propiedad que devuelve el .DateDateTime con el valor establecido que el anterior.

1

El objeto DateTime tiene una propiedad que devuelve solo la parte de la fecha del valor.

public static void Main() 
{ 
    System.DateTime _Now = DateAndTime.Now; 
    Console.WriteLine("The Date and Time is " + _Now); 
    //will return the date and time 
    Console.WriteLine("The Date Only is " + _Now.Date); 
    //will return only the date 
    Console.Write("Press any key to continue . . . "); 
    Console.ReadKey(true); 
} 
+0

Esta respuesta es incorrecta. La fecha devuelve un 'DateTime' con el tiempo configurado en 0:00:00 –

7

Crear una clase contenedora. Algo como esto:

public class Date:IEquatable<Date>,IEquatable<DateTime> 
    { 
     public Date(DateTime date) 
     { 
      value = date.Date; 
     } 

     public bool Equals(Date other) 
     { 
      return other != null && value.Equals(other.value); 
     } 

     public bool Equals(DateTime other) 
     { 
      return value.Equals(other); 
     } 

     public override string ToString() 
     { 
      return value.ToString(); 
     } 
     public static implicit operator DateTime(Date date) 
     { 
      return date.value; 
     } 
     public static explicit operator Date(DateTime dateTime) 
     { 
      return new Date(dateTime); 
     } 

     private DateTime value; 
    } 

y exponer lo que sea de value desea.

+0

implícito y explícito son incorrectos? – Behrooz

+3

Sugeriría que su constructor establezca el [DateTime.Kind] (http://msdn.microsoft.com/en-us/library/system.datetime.kind (v = vs.110) .aspx) en ' DateTimeKind.Unspecified' para que cuando se serialice se deserialice sin convertir (puede cambiar la fecha en función de diferentes en zonas horarias). – OffHeGoes

+1

@OffHeGoes Establece DateTime.Kind en 'DateTimeKind.Utc'. * No * configúrelo en 'DateTimeKind.Unspecified' porque eso garantizará que se serialice/deserialice con un desplazamiento de zona horaria incluido. Una fecha del calendario es la misma independientemente de la zona horaria, así que no permita que el sistema la ajuste. – Suncat2000

16

Creé un simple Date struct para los momentos en los que necesita una fecha simple sin preocuparse por la porción de tiempo, zonas horarias, local vs. utc, etc.

Date today = Date.Today; 
Date yesterday = Date.Today.AddDays(-1); 
Date independenceDay = Date.Parse("2013-07-04"); 

independenceDay.ToLongString(); // "Thursday, July 4, 2013" 
independenceDay.ToShortString(); // "7/4/2013" 
independenceDay.ToString();  // "7/4/2013" 
independenceDay.ToString("s");  // "2013-07-04" 
int july = independenceDay.Month; // 7 

https://github.com/claycephus/csharp-date

+2

¡Gracias! Eso es útil. – garfbradaz

1

No hay Date tipo de datos.

Sin embargo, puede usar DateTime.Date para obtener solo la fecha.

E.G.

DateTime date = DateTime.Now.Date; 
+0

Hay una estructura de fecha y los objetos se pueden declarar como tipo fecha. –

+0

@KalebAnderson no en la implementación predeterminada .NET, no hay. Si está hablando de la fecha de VB.net, todavía es un DateTime. –

+0

'DateTime.Now.Date' es lo mismo que' DateTime.Today'. Hay un 'DateTime.UtcNow' que devuelve el valor de fecha y hora como hora universal (UTC), pero no existe un método o propiedad equivalente de UTC para Today; 'DateTimeKind.UtcNow.Date' es la expresión adecuada. – Suncat2000

1
public class AsOfdates 
{ 
    public string DisplayDate { get; set; } 
    private DateTime TheDate; 
    public DateTime DateValue 
    { 
     get 
     { 
      return TheDate.Date; 
     } 

     set 
     { 
      TheDate = value; 
     } 
    }  
} 
+4

Poner alguna explicación a su respuesta sería útil. – Guanxi