Date vs DateHeure

110

Je travaille sur un programme qui nécessite la date d'un événement pour être retourné.

Je recherche un Date, pas un DateTime.

Existe-t-il un type de données qui renvoie uniquement la date?

MrM
la source

Réponses:

131

Non, il n'y en a pas. DateTimereprésente un point dans le temps composé d'une date et d'une heure. Cependant, vous pouvez récupérer la partie de date via la Datepropriété (qui en est une autre DateTimeavec l'heure définie sur00:00:00 ).

Et vous pouvez récupérer des propriétés de date individuelles via Day, Monthet Year.

Ronald Wildenberg
la source
23

J'ai créé une structure de date simple pour les moments où vous avez besoin d'une date simple sans vous soucier de la partie horaire, des fuseaux horaires, du local ou de l'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

Argile
la source
2
Merci! Cela est utile.
garfbradaz
16

Malheureusement, pas dans le .Net BCL. Les dates sont généralement représentées sous la forme d'un objet DateTime avec l'heure définie sur minuit.

Comme vous pouvez le deviner, cela signifie que vous avez tous les problèmes de fuseau horaire associés, même si pour un objet Date, vous ne voudriez absolument pas de gestion de fuseau horaire.

Jonathan Rupp
la source
1
Si vous utilisez une valeur DateTime comme Date, définissez le Kind sur UTC. Aucun ajustement de fuseau horaire à gérer. DateTime date = DateTime.SpecifyKind (DateTime.Today, DateTimeKind, Utc);
Suncat2000
Oui, je peux dire par expérience que l'utilisation datede n'importe quoi est une mauvaise idée, à moins que vous ne soyez sûr à 100% que votre application ne fonctionnera que dans un seul fuseau horaire. Tout enregistrer comme datetimevous donne le meilleur des deux mondes, y compris le plus critique, un moyen simple d'éviter les cauchemars de fuseau horaire si la configuration du fuseau horaire de votre serveur change un jour ... et commence à écrire des données d'une manière que vous n'aviez pas anticipée. Datetimepeut vous y sauver, datene peut pas du tout, et deviendra extrêmement difficile à réparer si jamais vous commencez à écrire dateavec le mauvais contexte de fuseau horaire.
Kelsey Hannan
2
@KelseyHannan à moins bien sûr que vous ayez affaire à des choses comme "date de naissance" ou "date d'achat", où vous ne voulez explicitement pas que les choses changent mystérieusement de jours simplement parce que vous avez déménagé de pays. Par exemple, le traitement des demandes de prêt hypothécaire irlandais en Nouvelle-Zélande est un exemple non aléatoire.
Roger Willcocks
9

Créez une classe wrapper. Quelque chose comme ça:

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

Et exposez tout valuece que vous voulez.

Øyvind Skaar
la source
4
Je suggérerais que votre constructeur définisse le DateTime.Kind sur DateTimeKind.Unspecifiedafin que, lorsqu'il est sérialisé, il soit désérialisé sans conversion (peut changer la date en fonction de différents fuseaux horaires).
oatsoda
1
@OffHeGoes Définissez DateTime.Kind sur DateTimeKind.Utc. Ne le définissez pas sur DateTimeKind.Unspecifiedcar cela garantira qu'il sera sérialisé / désérialisé avec un décalage de fuseau horaire inclus! Une date du calendrier est la même quel que soit le fuseau horaire, alors ne laissez pas le système l'ajuster.
Suncat2000
4

DateTime a une propriété Date que vous pouvez utiliser pour isoler la partie date. La méthode ToString fait également un bon travail en affichant uniquement la partie Date lorsque la partie heure est vide.

Traverser
la source
3

L'objet DateTime a une propriété qui renvoie uniquement la partie date de la valeur.

    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);
}
hmcclungiii
la source
Cette réponse est incorrecte. La date renvoie a DateTimeavec l'heure réglée à 0:00:00
Serj Sagan
3

Il n'y a pas Date DataType.

Cependant vous pouvez utiliser DateTime.Date pour obtenir uniquement la date.

PAR EXEMPLE

DateTime date = DateTime.Now.Date;
Nick N.
la source
Il existe une structure Date et les objets peuvent être déclarés en tant que type Date.
Kaleb Anderson
@KalebAnderson n'est pas dans l'implémentation par défaut .NET, il n'y en a pas. Si vous parlez de la date VB.net, c'est toujours une date / heure.
Nick N.
DateTime.Now.Dateest le même que DateTime.Today. Il y a un DateTime.UtcNowqui renvoie la valeur date-heure comme temps universel (UTC), mais il n'y a pas de méthode ou de propriété équivalente UTC pour Today; DateTimeKind.UtcNow.Dateest l'expression appropriée.
Suncat2000
2

Vous pouvez renvoyer DateTime où la partie heure est 00:00:00 et simplement l'ignorer. Les dates sont gérées comme des entiers d'horodatage, il est donc logique de combiner la date avec l'heure car elle est de toute façon présente dans l'entier.

Mikko Rantanen
la source
2

Pour cela, vous devez utiliser la date, mais ignorer la valeur de l'heure.

Normalement, une date serait un DateTime avec une heure de 00:00:00

Le DateTimetype a une .Datepropriété qui renvoie le DateTimeavec la valeur de temps définie comme ci-dessus.

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

        set 
        { 
            TheDate = value; 
        } 
    }    
}
William Mendoza
la source
4
Il serait utile d’expliquer votre réponse.
Guanxi
0

Vous pouvez essayer l’une des solutions suivantes:

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

Mais il n'y a pas de type "Date" dans la BCL.

Andrew Hare
la source