Data e ora: supporto di automazione

In questo articolo viene descritto come sfruttare i servizi della libreria di classi correlate fino a quel momento e gestione di tempo.Le procedure riportate di seguito:

La classe COleDateTime fornisce una modalità per rappresentare le informazioni su data e ora.Fornisce la granularità più precisa e un intervallo maggiore della classe CTime.La classe COleDateTimeSpan rappresenta il tempo trascorso, ad esempio la differenza tra due oggetti COleDateTime.

Le classi COleDateTimeSpan e COleDateTime sono progettate per essere utilizzate con la classe COleVariant utilizzata in automazione.COleDateTime e COleDateTimeSpan sono utili anche nella programmazione di database MFC, ma può essere utilizzato ogni qualvolta si desidera modificare i valori di data e ora.Sebbene la classe COleDateTime dispongono di un elevato intervallo di valori e di granularità più precisa della classe CTime, richiede più archiviazione per l'oggetto che CTime.Esistono inoltre alcune considerazioni speciali quando si utilizza il tipo sottostante DATE.Vedere Il tipo RELATIVO ALLA DATA per ulteriori informazioni sull'implementazione DATE.

Gli oggetti diCOleDateTime possono essere utilizzati per rappresentare date tra il 1° gennaio, 100 e il 31 dicembre, 9999.Gli oggetti diCOleDateTime sono valori a virgola mobile, con una risoluzione approssimativa di 1 millisecondi.COleDateTime è basato sul tipo di dati DATE, definito nella documentazione MFC in DATA di COleDateTime::operator.L'effettiva implementazione DATE estende oltre i limiti.L'implementazione COleDateTime impone questi limiti per facilitare l'utilizzo della classe.

COleDateTime non supporta le date giuliano.Il calendario gregoriano viene utilizzato per estendere indietro nel tempo fino il 1° gennaio, 100.

COleDateTime ignora l'ora legale (DST).Nell'esempio di codice confronta due metodi di calcolo dell'intervallo di tempo crossing la data di modifica di DST: uno tramite CRT e l'altro utilizzando COleDateTime.DST cambia, nella maggior parte delle impostazioni locali, la seconda settimana ad aprile e il terzo ad ottobre.

Il primo metodo imposta due oggetti CTime, time1 e time2, a 5 aprile e il 6 aprile rispettivamente, utilizzando le strutture tm e time_tdi tipo C standard.Il codice visualizza time1 e time2 e l'intervallo tra loro.

Il secondo metodo crea due oggetti, oletime1 e oletime2di COleDateTime e vengono impostati sulle stesse date di time1 e di time2.Visualizzare oletime1 e oletime2 e l'intervallo tra loro.

CRT correttamente calcola la differenza di 23 ore.COleDateTimeSpan calcola la differenza di 24 ore.

Si noti che una soluzione alternativa è utilizzata da alla fine dell'esempio per visualizzare la data l'utilizzo corretto COleDateTime::Format.Vedere l'articolo della Knowledge Base "OSTACOLARE: Formattare ("%D") non riesce a COleDateTime e 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);
}

Vedere anche

Concetti

Data e ora