web-dev-qa-db-fra.com

soustrayez 2 champs datetime pour obtenir la différence en jours restants

Je serais reconnaissant si quelqu'un pouvait m'aider à comprendre comment soustraire 2 champs datetime pour obtenir la différence en jours restants.

30
Jobi

C'est très facile à faire avec C #. Pour comparer DateTimes, nous avons une classe appelée TimeSpan. La structure TimeSpan, dans ce cas, serait définie comme la différence entre vos deux dates/heures.

Disons que vos DateTimes s'appellent début et fin.

DateTime start = new DateTime(2009, 6, 14);
DateTime end = new DateTime(2009, 12, 14);

Nous avons établi nos DateTimes au 14 juin 2009 et au 14 décembre 2009.

Maintenant, trouvons la différence entre les deux. Pour ce faire, nous créons un TimeSpan:

TimeSpan difference = end - start;

Avec cet objet TimeSpan, vous pouvez exprimer la différence de temps de différentes manières. Cependant, vous avez spécifiquement demandé la différence en jours, alors voici comment vous pouvez l'obtenir:

Console.WriteLine("Difference in days: " + difference.Days);

Ainsi, la propriété s'appelle TimeSpan.Days.


Code final

//establish DateTimes
DateTime start = new DateTime(2009, 6, 14);
DateTime end = new DateTime(2009, 12, 14);

TimeSpan difference = end - start; //create TimeSpan object

Console.WriteLine("Difference in days: " + difference.Days); //Extract days, write to Console.

Pour plus d'informations sur l'utilisation de la structure TimeSpan, voir cette documentation MSDN (en particulier les exemples C #).

J'espère que j'ai aidé!

UPDATE: Certaines réponses suggèrent de faire la soustraction en une étape, comme avec:

int days = (dt2 - dt1).Days;

ou

int numDaysDiff = Math.Abs(date2.Subtract(date1).Days);

Cependant, ce sont la même chose que dans ma réponse, seulement abrégée. En effet, la méthode DateTime.Subtract () et l'opérateur de soustraction de DateTimes retournent un TimeSpan, à partir duquel vous pouvez ensuite accéder au nombre de jours. J'ai spécifiquement utilisé utilisé l'approche la plus longue dans mon exemple de code pour que vous compreniez clairement ce qui se passe entre vos objets DateTime et TimeSpan et comment tout cela fonctionne. Bien sûr, les autres approches que je viens de mentionner sont bien aussi.

UPDATE # 2: 

Une question très similaire avait déjà été posée, et on peut la trouver ici . Cependant, l’essentiel de cette question était de savoir pourquoi l’échantillon de code (qui est essentiellement équivalent à celui de toutes les réponses) parfois fournit une réponse qui est un jour de congé. Je pense que cela est également important pour cette question.

Comme le suggère la réponse principale à l'autre question, vous pouvez utiliser ce code:

int days = (int)Math.Ceiling(difference.TotalDays);

Ce code utilise Math.Ceiling, qui, selon MSDN, est:

Retourne la plus petite valeur intégrale qui est supérieur ou égal à la double précision spécifiée nombre à virgule flottante.

Comment voulez-vous compter les jours?

Ainsi, nous avons maintenant un problème avec la façon dont vous voulez compter les jours. Voulez-vous compter une partie de la journée (telle que 0,5 par jour) comme:

  • Une journée complète - cela utiliserait Math.Ceiling pour arrondir TimeSpan.TotalDays, de sorte que vous comptiez les jours commencés.
  • Part of a day - vous pouvez simplement renvoyer TimeSpan.TotalDays (non arrondi) sous forme décimale (dans le type de données double)
  • Rien - vous pouvez ignorer cette partie de la journée et renvoyer le TimeSpan.Days.

Voici des exemples de code pour ce qui précède:

Compter comme une journée complète (en utilisant Math.Ceiling () pour arrondir):

//establish DateTimes
DateTime start = new DateTime(2009, 6, 14);
DateTime end = new DateTime(2009, 12, 14);

TimeSpan difference = end - start; //create TimeSpan object

int days = (int)Math.Ceiling(difference.TotalDays); //Extract days, counting parts of a day as a full day (rounding up).

Console.WriteLine("Difference in days: " + days); //Write to Console.

Comptage dans le cadre d'une journée (N'utilisez PAS Math.Ceiling (), laissez-le plutôt sous forme décimale dans le cadre d'une journée):

//establish DateTimes
DateTime start = new DateTime(2009, 6, 14);
DateTime end = new DateTime(2009, 12, 14);

TimeSpan difference = end - start; //create TimeSpan object

double days = difference.TotalDays; //Extract days, counting parts of a day as a part of a day (leaving in decimal form).

Console.WriteLine("Difference in days: " + days); //Write to Console.

Comptage comme rien du jour (arrondi au nombre de jours complets):

//establish DateTimes
DateTime start = new DateTime(2009, 6, 14);
DateTime end = new DateTime(2009, 12, 14);

TimeSpan difference = end - start; //create TimeSpan object

int days = difference.TotalDays; //Extract days, counting parts of a day as nothing (rounding down).

Console.WriteLine("Difference in days: " + days); //Write to Console.
80
Maxim Zaslavsky

Utilisation

TimeSpan

DateTime departure = new DateTime(2010, 6, 12, 18, 32, 0);
DateTime arrival = new DateTime(2010, 6, 13, 22, 47, 0);
TimeSpan travelTime = arrival - departure;  
5
rahul

La solution la plus simple consiste à utiliser TimeSpan () . Cette fonction Soustraction vous retournera la différence entre deux dates en termes de durée. Vous pouvez maintenant récupérer des champs tels que des jours, des mois, etc. Pour accéder aux jours, vous pouvez utiliser Voici un exemple de code;

Code VB.Net;

    Dim tsTimeSpan As TimeSpan
    Dim ldDate1 as Date
    Dim ldDate2 as Date
      'Initialize date variables here
       tsTimeSpan = ldDate1 .Subtract(ldDate2)
       Dim NumberOfDays as integer = tsTimeSpan.days

Code C # .Net;

    DateTime lDate1;
    DateTime lDate2;
    TimeSpan tsTimeSpan ;
    int NumberOfDays;
      //Initialize date variables here
      tsTimeSpan = ldDate1 .Subtract(ldDate2);
      NumberOfDays = tsTimeSpan.days;
4
Vijay Balkawade
DateTime dt1 = new DateTime(2009,01,01,00,00,00);
DateTime dt2 = new DateTime(2009,12,31,23,59,59);

int days = (dt2 - dt1).Days;
2
Jesper Palm

Différence en nombre de jours

Ces réponses prennent le nombre de jours sous la forme int de la structure System.TimeSpan qui résulte de la soustraction de deux champs System.DateTime ... 

Réponse rapide - obtient le nombre de jours de différence.

        int numDaysDiff = date2.Subtract(date1).Days;

Réponse alternative - utilise Math.Abs ​​pour s'assurer qu'il ne s'agit pas d'un nombre négatif, juste au cas où les dates pourraient être fournies dans l'un ou l'autre ordre.

        int numDaysDiff = Math.Abs( date2.Subtract(date1).Days );

Quelques exemples de données pour terminer le using System namespace:

        // sample data
        DateTime date1 = DateTime.Now;
        DateTime date2 = DateTime.Now.AddDays(10);

Références MSDN (et plusieurs exemples de code):

2
John K
DateTime theDate = DateTime.Today;
int datediff = theDate.Subtract(expiryDate).Negate().Days;
if expiryDate > theDate then you get Negative value: -14
expiryDate is less than theDate then you get positive value: 14

Vous pouvez évidemment vouloir cela dans un scénario tel que 

  1. Envoyer un e-mail de notification 14 jours avant l'expiration 
  2. Envoyer une autre notification Email 14 jours après l'expiration 

Vous avez besoin d'une différence qui pourrait être une valeur négative

2
Mvg Developer

Vous devriez regarder TimeSpan .

1
Myles

Pour obtenir les jours exacts en ignorant la section de temps

    DateTime d1 = Convert.ToDateTime(DateTime.Now.ToShortDateString());
    DateTime d2 = Convert.ToDateTime(DateTime.Now.AddDays(46).ToShortDateString());

    var days = Convert.ToInt32(d2.Subtract(d1).TotalDays)
0
PatWill