Question Comment puis-je spécifier la dernière heure du jour avec DateTime


J'utilise un System.DateTime objet permettant à un utilisateur de sélectionner une plage de dates. L'utilisateur ne peut sélectionner qu'une date (pas l'heure) à l'aide d'un calendrier tiers. Il devra donc spécifier automatiquement l'heure à utiliser (par exemple: 00:00:00 ou 23:59:59) après la date. est choisi.

Comment puis-je spécifier l'heure après laquelle la date est déjà stockée en tant qu'objet DateTime par le sélecteur de calendrier? Je pourrais utiliser le AddHours, AddMinutes, AddSeconds méthodes mais celles-ci sont relatives à l'heure actuelle qui peut ne pas être 00:00:00.

le startDate devra avoir un temps de 00:00:00 et endDate avoir un temps de 23:59:59 pour tenir compte des jours entiers.


55
2018-05-04 19:04


origine


Réponses:


Si vous avez déjà un DateTime objet créé et que vous voulez remplacer le temps avec le 23:59:59 PM pour cette date donnée, alors vous pouvez utiliser le .Date propriété pour obtenir la date avec l'heure réglée à 00:00:00, puis ajoutez les heures, les minutes et les secondes. Par exemple:

var dt = yourDateInstance.Date.AddHours(23).AddMinutes(59).AddSeconds(59);

Si à la dernière heure, vous voulez dire 23h59:59, alors cela devrait aussi fonctionner:

var dt = new DateTime(Now.Year, Now.Month, Now.Day, 23, 59, 59);

71
2018-05-04 19:07



Pour obtenir le dernier instant pour aujourd'hui:

DateTime d = new DateTime(Now.Year, Now.Month, Now.Day);
d = d.AddDays(1);
d = d.AddTicks(-1);

En réponse à votre édition, voici ce que je ferais:

DateTime start = new DateTime(Now.Year, Now.Month, Now.Day);
DateTime end = start.AddDays(1).AddTicks(-1);

// Or - just use end = start.AddDays(1), and use a < for comparison

64
2018-05-04 19:09



DateTime d = DateTime.Today.AddDays(1).AddTicks(-1);

17
2018-05-04 19:12



On a déjà répondu à votre question, mais à mon humble avis, il ne faut pas tenter de soustraire une coche, une seconde ou autre chose de la fin de la plage, et comparer en utilisant strictement moins de.

Alors que si vous voulez toutes les dates dans un compris de startDate à endDate, en ignorant le temps, vous pouvez utiliser les éléments suivants en C #:

if ((myDate >= startDate.Date) && (myDate < endDate.Date.AddDays(1)))
{
    // ... it's in the range
}

ou dans T-SQL, en supposant que vos @StartDate et @EndDate sont exactement minuit, quelque chose comme:

WHERE SomeDate >= @StartDate AND SomeDate < DATEADD(d,1,@EndDate)

METTRE À JOUR

Exemple mis à jour pour montrer une plage inclusive en réponse aux commentaires.


9
2018-05-04 19:47



DateTime startDate = DateTime.Today;
DateTime stopDate = startDate.AddDays(1).AddTicks(-1);

Comme une note, DateTime.Today renvoie (depuis MSDN)

Un System.DateTime réglé à la date d'aujourd'hui,   avec le composant de temps défini sur   00:00:00.

Donc, comme d'autres l'ont noté, ajoutez un jour, puis soustrayez le plus petit temps quantique (une coche) et vous obtenez la dernière heure possible pour le jour en cours.

Bien sûr, vous devrez peut-être penser à TimeZones et à la manière dont le code est exécuté par rapport à l’utilisateur. L'heure UTC peut être bonne, mais cela pourrait vous faire perdre un jour (dans un sens ou dans l'autre) en fonction de votre code.


6
2018-05-04 19:28



Par exemple

DateTime.Now.Date.AddDays(1).AddSeconds(-1)

Ou AddTicks/AddMilliseconds/AddMinutes... basé sur la précision dont vous avez besoin.


1
2018-03-23 12:07



utilisez ceci

DateTime YourNewDate = new DateTime (YourDate .Year, YourDate .Mois, YourDate .Day, 23, 59, 59, 99);


0
2018-04-13 11:00



yourDateInstance.CloseDate = yourDateInstance.CloseDate.Date.AddDays (1) .AddMilliseconds (-1);


0
2018-04-14 09:21



Sur la base des autres réponses, j'ai créé cette méthode d'extension pratique:

public static class DateTimeExtensions
{
    public static DateTime EndOfDay(this DateTime dateTime)
    {
        return dateTime.Date.AddDays(1).AddTicks(-1);
    }
}

0
2018-06-12 13:21



cela vous donnera le résultat attendu:

DateTime startDate= DateTime.Now.Date;
DateTime endDate= startDate.AddDays(2).Add(new TimeSpan(23, 59, 59));
//startDate: 28/9/2017 0:0:0 endDate: 29/9/2017 23:59:59

0
2017-09-28 02:12