Partager via


Date et heure : Prise en charge d'automation

Cet article explique comment tirer parti des services de bibliothèque de classes connexes jusqu'à présent et de la gestion de la durée. Les procédures décrites incluent :

La classe de COleDateTime permet de représenter des informations d'horodatage. Il fournit une granularité plus fine et une plage supérieur à la classe de CTime . La classe de COleDateTimeSpan représente le temps écoulé, telles que la différence entre deux objets d' COleDateTime .

Les classes d' COleDateTime et d' COleDateTimeSpan sont conçues pour être utilisées avec la classe d' COleVariant utilisée dans l'automation. COleDateTime et COleDateTimeSpan sont également utiles en programmation de bases de données MFC, mais elles peuvent être utilisées chaque fois que vous souhaitez manipuler les valeurs de date et d'heure. Bien que la classe d' COleDateTime a une plage de valeurs supérieures et la granularité plus fine que la classe d' CTime , il requiert plus de mémoire pour chaque objet qu' CTime. Il existe également des considérations spéciales lorsque vous utilisez le type sous-jacent de DATE . Consultez Le type de DATE pour plus d'informations sur l'implémentation de DATE.

Les objets d'COleDateTime peuvent être utilisés pour représenter des dates entre le le 1er janvier, 100, et le 31 décembre, 9999. Les objets d'COleDateTime sont des valeurs à virgule flottante, avec une résolution approximative de 1 millisecondes. COleDateTime est basé sur le type de données de DATE , défini dans la documentation MFC sous DATE de COleDateTime::operator. L'implémentation réelle de DATE étend au delà de ces limites l'. L'implémentation d' COleDateTime applique ces limites pour faciliter l'utilisation de la classe.

COleDateTime ne prend pas en charge les dates julien. Il est supposé que le calendrier grégorien étend en arrière dans le temps au 1er janvier, 100.

COleDateTime ignore l'heure d'été (DST). L'exemple de code suivant compare deux méthodes de calculer un intervalle de temps qui traverse la date de basculement de Desktop prise en charge Technician : un à l'aide de le CRT, et l'autre à l'aide de COleDateTime. Commutateurs de Desktop prise en charge Technician plus de, dans la plupart des paramètres régionaux, dans la deuxième semaine en avril et le troisième en octobre.

La première méthode définit deux objets d' CTime , time1 et time2, le 5 avril et au 6 avril respectivement, en utilisant les structures tm et time_tC de standard. Le code affiche time1 et time2 et l'intervalle entre eux.

La deuxième méthode crée deux objets, oletime1 et oletime2d' COleDateTime , et les place les mêmes dates que time1 et time2. Elle affiche oletime1 et oletime2 et l'intervalle entre eux.

Le CRT calcule correctement une différence de 23 heures. COleDateTimeSpan calcule la différence de 24 heures.

Notez qu'une solution de contournement est utilisée à l'approche de la fin de l'exemple pour afficher la date correctement à COleDateTime::Format. Consultez l'article de la Base de connaissances « INTRODUIRE DES ERREURS POUR TESTS : Mettez en forme (« %D ») échoue pour COleDateTime et COleDateTimeSpan » (Q167338).

void CDTDlg::OnPaint()
{
   CPaintDC dc(this); // device context for painting

   time_t date1_t, date2_t;
   tm date_tm;

   date_tm.tm_hour = 12;
   date_tm.tm_min = 0;
   date_tm.tm_mon = 3;
   date_tm.tm_sec = 0;
   date_tm.tm_wday = 0; //Day of week (0-6; Sunday = 0)
   date_tm.tm_yday = 0;
   date_tm.tm_year = 97;
   date_tm.tm_isdst = -1; //Positive if Daylight Saving Time is in effect; 
                         //0 if Daylight Saving Time is not in effect;  
                         //Negative if status of DST is unknown.

   date_tm.tm_mday = 6;
   date2_t = mktime(&date_tm);

   date_tm.tm_mday = 5;
   date_tm.tm_isdst = 0;
   date1_t = mktime(&date_tm);

   CTime time1(date1_t), time2(date2_t);
   CTimeSpan ts = time2 - time1;

   dc.TextOut(0, 0, CString(_T("CTime")));
   dc.TextOut(0, 20, time1.Format(_T("%H:%M:%S %A, %B %d, %Y")));
   dc.TextOut(0, 40, time2.Format(_T("%H:%M:%S %A, %B %d, %Y")));
   dc.TextOut(0, 60, ts.Format(_T("%H:%M:%S and %D days")));


   COleDateTime oletime1(date1_t), oletime2(date2_t);
   COleDateTimeSpan olets = oletime2 - oletime1;

   dc.TextOut(0, 120, CString(_T("COleDateTime")));
   dc.TextOut(0, 140, oletime1.Format(_T("%H:%M:%S %A, %B %d, %Y")));
   dc.TextOut(0, 160, oletime2.Format(_T("%H:%M:%S %A, %B %d, %Y")));

   //Work-around bug in COleDateTime::Format("%D")
   CString str;
   str.Format(_T("%s and %d days"), (LPCTSTR)olets.Format(_T("%H:%M:%S")), 
      olets.GetDays());
   dc.TextOut(0, 180, str);
}

Voir aussi

Concepts

Date et heure