Comment supprimer la partie heure de la date en C # dans l'objet DateTime uniquement?

459

J'ai besoin de supprimer la partie heure de la date heure ou probablement d'avoir la date au format suivant sous objectforme non sous forme de string.

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

Je ne peux utiliser aucune stringméthode de conversion car j'ai besoin de la date sous objectforme.

J'ai d'abord essayé de convertir le DateTimeen un string, de supprimer la date spécifique à l'heure, mais il l'ajoute 12:00:00 AMdès que je le reconvertis dos à DateTime objectdos.

je suis inutile
la source
10
Il n'y a pas de classe / structure de date uniquement en C #. Si vous voulez en avoir un, vous devez ajouter votre propre classe / structure.
oleschri
12
Utilisez simplement DateTime.Now.ToShortDateString ()
Mohammad Shahnawaz Alam
@ShahnawazAalam je crois que c'est toujours une chaîne, j'ai aussi eu des problèmes avec datetime. nécessite uniquement la date de la variable datetime
Voir également cette réponse qui décrit les alternatives.
Matt Johnson-Pint
var dateTime = DateTime.Now.Date;
PrathapG

Réponses:

827

Utilisez la propriété Date :

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

La datevariable contiendra la date, la partie heure sera 00:00:00.

driis
la source
36
La partie horaire ne serait-elle pas à 12 h 00, comme l'a mentionné le questionneur?
Fire Panda
13
La partie horaire est nulle (minuit). Lorsque celui-ci est formaté sous forme de chaîne au format AM / PM, il est représenté sous la forme 12 AM.
driis
98
Cela ne répond pas à la question. Comme la réponse le suggère, DateTime.Date (qui est lui-même DateTime!) A une partie de temps par défaut à 00:00:00. La réponse devrait plutôt être: avec DateTime, vous ne pouvez pas. Construisez votre propre structure ou jetez un œil à Noda Time.
Tomas Vinter
23
@TomasVinter est correct. Il n'y a pas de structure "strictement Date" dans le framework .NET. Vous devrez créer le vôtre. Toutefois, DateTime expose la méthode .ToShortDateTime (), qui formatera une chaîne représentant uniquement la partie date de la valeur et formatera la date à l'aide du DateFormat configuré dans la culture actuelle (Thread.Current.CurrentCulture), donc MM-dd -aaaa pour les États-Unis, jj-MMM-aaaa pour l'UE, etc.
Michael J. Heier
16
À ceux qui disent que ce n'est pas la bonne réponse: La réponse est correcte, mais la question est fausse. Il montre l'ignorance de l'interrogateur sur le sujet. Il n'y a pas de format pour la date sous forme d'objet. Le format n'a de sens que lorsqu'il est converti en chaîne. Ce qui est effectivement stocké dans son objet ne l'est pas 06/26/2009 00:00:00.000, mais 63381571200000000c'est le nombre de Ticks (1 / 100000000e de seconde) depuis le DateTime.MinValue(01/01/0001). Si vous allez afficher la date, convertissez-la en chaîne, sinon, elle a une composante horaire de minuit. Faites avec.
CptRobby
165

Vous pouvez utiliser des chaînes de format pour donner à la chaîne de sortie le format souhaité.

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

En savoir plus sur les chaînes de format de date et d'heure personnalisées .

0x49D1
la source
48
DateAndTime.ToShortDateString ();
John Peters
J'en avais besoin, mais j'avais l'habitude CultureInfo.DateTimeFormat.ShortDatePatternd'être convivial
Dzmitry Lahoda
Cela donnera la sortie incorrecte sur les paramètres régionaux qui n'utilisent pas ce format. Mieux vaut utiliser ToShortDateString qui est sensible aux paramètres régionaux
Matt Wilko
1
Assurez-vous de mettre à jour le format dd/MM/yyyyà votre guise avant de l'utiliser!
slayernoah
.ToString()avec le format souhaité est exactement ce dont j'avais besoin, merci!
Willem Ellis
39

Jetez un œil à la propriété DateTime.Date .

Obtient le composant date de cette instance.

pseudo
la source
20
vous devriez expliquer plus, ce n'est pas une réponse c'est un lien
Malachi
27
@Malachi: J'ai copié et collé la première ligne de l'API officielle liée au cas où les gens ne comprendraient pas les hyperliens.
Nick
var dateTime = DateTime.Now.Date;
PrathapG
29

L' Dateétablissement vous renverra la date à minuit.

Une option pourrait être d'obtenir les valeurs individuelles (jour / mois / année) séparément et de les stocker dans le type souhaité.

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
la source
20

Aucune des réponses ci-dessus n'a résolu mon problème sur les winforms.

la façon la plus simple d'atteindre UNIQUEMENT la date est la fonction simple dans Datetime:

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

Vous n'aurez que la date dans la chaîne d'anniversaire.

MehraD
la source
4
Pourquoi y a-t-il un (string)casting? Le type retourné par ToShortDateStringest en effet une chaîne.
Askolein
15

Essayez de créer votre propre structure pour cela. L'objet DateTime aura à la fois la date et l'heure

Umesh CHILAKA
la source
3
Cela devrait être la réponse. Cela semble être la seule réponse à la question réelle - l'heure ne peut pas être supprimée de l'objet. Roulez vous-même, vivez à minuit (ou à l'heure de la journée) ou travaillez avec une représentation ToString de ce que vous voulez.
Phil Cooper
C'est peut-être la réponse la plus correcte, mais c'est aussi complètement académique pour tous, sauf pour ceux qui n'ont pas de vie, qui aiment réinventer une roue qui tourne très bien toute seule. Si nous sommes vraiment inquiets de la mémoire supplémentaire utilisée pour stocker une propriété longue supplémentaire avec notre structure DateTime, nous avons de plus gros problèmes que de simplement l'ignorer.
iGanja
Merci d'avoir répondu. Sans créer de structure, l'utilisateur peut utiliser une variable chaîne dans la plupart des cas. Qu'est-ce que tu penses?
Kushan Randima
@KushanRandima, cela est vrai dans la plupart des cas. Cependant, dans la question, l'utilisateur ne veut pas au format chaîne, c'est pourquoi je l'ai suggéré comme l'un des suppléants.
Umesh CHILAKA
15

Tu ne peux pas. Un DateTime dans .NET a toujours une heure, par défaut 00: 00: 00: 000. La propriété Date d'un DateTime est également un DateTime (!), Ayant ainsi une heure par défaut à 00: 00: 00: 000 également.

Il s'agit d'une pénurie dans le .NET Framework, et on pourrait faire valoir que DateTime dans .NET viole le principe de responsabilité unique .

Tomas Vinter
la source
Ceci est la bonne réponse à cette question. Les objets DateTime auront toujours Time.
Drkawashima
1
Par intérêt, pourquoi considéreriez-vous cela comme une violation de la SRP? Si vous considérez que la responsabilité représente un point dans le temps et que la classe expose la propriété Ticks sous-jacente, les propriétés Year / Hour / Millisecond sont purement là pour traiter la convention (traditionnelle).
Rob Church
Parce que la date et l'heure sont deux concepts différents, malheureusement dans le .NET Framework regroupés dans la même structure. Ainsi, la structure a plus d'une responsabilité (gérer à la fois la date ET l'heure) et viole donc SRP. DateTime dans .NET ne représente pas seulement un point dans le temps, mais aussi bien d'autres choses. Par conséquent, compte tenu de sa responsabilité de ne représenter qu'un point dans le temps, il serait étrange.
Tomas Vinter
2
un point dans le temps, est représenté à la fois par la date et l'heure. Si vous dites à quelqu'un de vous rencontrer à 13 h 00, vous supposez que la personne sait quel jour. Même si aujourd'hui est le jour, la précision dicte d'être explicitement énoncée. Ergo une valeur unique représentant un point dans le temps avec n'importe quelle précision DOIT inclure à la fois la date et l'heure en utilisant un point de départ de référence. Par conséquent, la date, à partir d'une référence de départ, et l'heure, à partir d'une référence de départ, sont clairement le MÊME concept; temps ajoutant une précision supplémentaire.
iGanja
1
Le temps seul est utile lorsque vous parlez de plusieurs instances: par exemple, tous les jours à minuit UTC; le premier de chaque mois à midi, heure locale; etc. On peut dire que TimeSpan peut être utilisé pour représenter cela via une convention, mais il peut être plus propre d'avoir un objet Time qui représente un point dans une période de 24 heures et un fuseau horaire. En fin de compte, il y a 3 idées que DateTime encapsule: Date, Time et TimeZone.
David Beckman
12

DateTime.Date

var newDate = DateTime.Now; //newDate.Date property is date portion of DateTime
VikciaR
la source
9
vous devriez expliquer plus. ce n'est pas une réponse, c'est un lien
Malachi
2
var newDate = DateTime.Now; //newDate.Date est la partie date de DateTime. Qu'est-ce qui n'est pas clair? Si ce n'est pas clair - suivez le lien.
VikciaR
10

Voici une autre méthode utilisantString.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);

Production:

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

Date Only : 04/09/2016

Cela fonctionne également si la date et l'heure sont stockées dans la base de données.

Pour plus de formatage de date et d'heure, vérifiez ces liens:

Référence 1

Référence 2

L'espoir aide.

shaijut
la source
L'OP indique explicitement "Je ne peux utiliser aucune méthode de conversion de chaîne car j'ai besoin de la date sous forme d'objet."
ChrisF
7

Cette façon d'obtenir seulement une date sans heure

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

Sortie = 16/05/2015

Mayank Gupta
la source
1
Veuillez considérer qu'une réponse tardive mérite d'être ajoutée (et du point de vue des autres utilisateurs), uniquement si elle est distinctement différente des autres réponses. Ce qui n'est pas un cas ici.
m.cekiera
5

J'ai écrit une DateOnlystructure. Cela utilise un DateTime sous la peau, mais aucune partie de l'heure n'est exposée publiquement:

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

Ceci est converti à partir de VB.NET, donc excuses si certaines conversions ne sont pas à 100%

Matt Wilko
la source
5

Utilisez date.ToShortDateString () pour obtenir la date sans le composant time

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

utilisez date.ToString () pour personnaliser le format de la date

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

Je suis surpris que personne n'ait mentionné DateTime.

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

Voir MSDN

LukeF
la source
+1 uniquement parce que votre réponse produit une date avec les propriétés correctes, mais l'OP souhaite supprimer l'heure d'une date existante, pas créer une nouvelle date.
iGanja
3

Vous pouvez essayer ceci pour la seule date de la date / heure

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

Où dt est le DateTime

Vikas
la source
3

Je suis tombé sur ce message en essayant de résoudre le Q. original

J'utilise Asp.Net et après quelques recherches que j'ai trouvées lorsque vous vous liez à la valeur de la date dans le code derrière, vous pouvez laisser tomber l'heure afin qu'elle ne s'affiche pas à l'écran.

C #:

DateTime Today = DateTime.Now;

aspx:

<%: this.Today.ToShortDateString() %>
John
la source
3

utilisation

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

Si vous le convertissez en chaîne, vous pouvez facilement le faire comme ceci.

Je prends la date comme objet DateTime.

date.ToString("d");

Cela ne vous donnera que la date.

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

Si vous prenez la date du calendrier, nous obtenons également du temps. Ce qui n'est pas nécessaire tout le temps. En utilisant cela, nous pouvons supprimer l'heure de la date.

hizbul25
la source
2

d'après mon expérience, aucune desdites solutions n'a fonctionné, peut-être parce que je voulais supprimer l'heure de la date extraite de la base de données, mais le code ci-dessous a bien fonctionné:

var date = target_date.Value.ToString("dd/MM/yyyy"); 
Daniel
la source
La question précisait que la date devait être un objet et non une chaîne. Cette solution renvoie une chaîne.
saluce
2

Déclarez la variable sous forme de chaîne.

exemple :

public string dateOfBirth ;

puis attribuez une valeur comme:

dateOfBirth = ((DateTime)(datetimevaluefromDB)).ToShortDateString();
Saud Khan
la source
les gens devraient lire la question et arrêter de convertir les structures (sur la pile) en objets (sur le tas) sans raison.
iGanja
2

Je sais que c'est un ancien post avec de nombreuses réponses, mais je n'ai pas vu cette façon de supprimer la partie temps. Supposons que vous ayez une DateTimevariable appelée myDate, avec la partie date avec heure. Vous pouvez créer un nouvel DateTimeobjet à partir de celui-ci, sans la partie temps, en utilisant ce constructeur:

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

Comme ça:

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

De cette façon, vous créez un nouvel DateTimeobjet basé sur l'ancien, avec 00:00:00 comme partie horaire.

Guillermo Gutiérrez
la source
2

Créez une structure qui ne contient que les propriétés souhaitées. Ensuite, une méthode d'extension pour obtenir facilement cette structure à partir d'une instance 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
        };
    }
}

Usage

DateTime dt = DateTime.Now;
DateOnly result = dt.GetDateOnly();
le maçon
la source
2

Pour obtenir uniquement la partie date, utilisez la méthode ToString (),

exemple: DateTime.Now.Date.ToString ("jj / MM / aaaa")

Remarque: le mm au format jj / mm / aaaa doit être en majuscule

nate.py
la source
1

Utiliser .Date d'un objet DateTime ignorera la partie heure.

Voici le code:

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

Production:

>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
la source
1

Utilisez un peu de RegEx:

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

Produit une date au format: jj / mm / aaaa

DividedByZero
la source
1

Pour une utilisation par la base de données, le répéteur .. dans la page aspx: <% # Eval ("YourDateString"). ToString (). Remove (10)%>

Filip Dialm
la source
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
la source
1

Cela pourrait être simplement fait de cette façon:

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

Ce code vous donne une vision claire de l'écriture Dateainsi que Timeséparément

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

J'espère que cela t'aides.

Zéro
la source