Condividi tramite


Data e ora

MFC supporta diversi modi di lavorare con date e ore:

  • Supporto per il tipo di dati di Automazione.DATE DATE supporta valori di data, ora e data/ora. Le COleDateTime classi e COleDateTimeSpan incapsulano questa funzionalità. Funzionano con la classe usando il COleVariant supporto di Automazione.

  • Classi temporali per utilizzo generico. Le CTime classi e CTimeSpan incapsulano la maggior parte delle funzionalità associate alla libreria temporale standard ANSI, dichiarata in time.h.

  • Supporto per l'orologio di sistema. Con MFC versione 3.0, è stato aggiunto il supporto a CTime per i tipi di dati Win32 SYSTEMTIME e FILETIME .

Data e ora: supporto per l'automazione

La COleDateTime classe fornisce un modo per rappresentare le informazioni di data e ora. Offre una granularità più fine e un intervallo maggiore rispetto alla CTime classe . La COleDateTimeSpan classe rappresenta il tempo trascorso, ad esempio la differenza tra due COleDateTime oggetti.

Le COleDateTime classi e COleDateTimeSpan sono progettate per l'uso con la COleVariant classe . COleDateTime e COleDateTimeSpan sono utili anche nella programmazione del database MFC, ma possono essere usati ogni volta che si desidera modificare i valori di data e ora. Anche se la COleDateTime classe ha un intervallo di valori maggiore e una granularità più fine rispetto alla CTime classe , richiede più spazio di archiviazione per oggetto rispetto CTimea . Esistono anche alcune considerazioni speciali quando si lavora con il tipo DATE sottostante. Per altre informazioni sull'implementazione di DATE, vedere Il DATE tipo.

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

COleDateTime non supporta date julian. Si presuppone che il calendario gregoriano si estenda nel tempo fino al 1° gennaio 100.

COleDateTime ignora l'ora legale (DST). Nell'esempio di codice seguente vengono confrontati due metodi per calcolare un intervallo di tempo che interseca la data di passaggio dell'ora DST: uno che usa CRT e l'altro usando COleDateTime.

Il primo metodo imposta rispettivamente due CTime oggetti, time1 e time2, rispettivamente il 5 aprile e il 6 aprile, usando le strutture tm di tipo C standard e time_t. Il codice visualizza time1 e time2 l'intervallo di tempo tra di essi.

Il secondo metodo crea due COleDateTime oggetti oletime1 e oletime2e li imposta sulle stesse date di time1 e time2. Viene visualizzato oletime1 e oletime2 l'intervallo di tempo tra di essi.

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

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

Ottiene l'ora corrente

La procedura seguente illustra come creare un COleDateTime oggetto e inizializzarlo con l'ora corrente.

Per ottenere l'ora corrente

  1. Creare un oggetto COleDateTime.

  2. Chiamare GetCurrentTime.

    COleDateTime timeNow;
    timeNow = COleDateTime::GetCurrentTime();   
    

Calcolare il tempo trascorso

Questa procedura illustra come calcolare la differenza tra due COleDateTime oggetti e ottenere un COleDateTimeSpan risultato.

Per calcolare il tempo trascorso

  1. Creare due COleDateTime oggetti.

  2. Impostare uno degli COleDateTime oggetti sull'ora corrente.

  3. Eseguire un'attività dispendiosa in termini di tempo.

  4. Impostare l'altro COleDateTime oggetto sull'ora corrente.

  5. Prendere la differenza tra le due volte.

    COleDateTime timeStart, timeEnd;
    timeStart = COleDateTime::GetCurrentTime();
    // ... perform time-consuming task
    timeEnd = COleDateTime::GetCurrentTime();
    COleDateTimeSpan spanElapsed = timeEnd - timeStart;   
    

Formattare un'ora

Per formattare un'ora

Utilizzare la Format funzione membro di o COleDateTimeSpan per creare una stringa di COleDateTime caratteri che rappresenta il tempo o il tempo trascorso.

COleDateTime time(1970, 12, 18, 17, 30, 0);
// 18 December 1970, 5:30 PM
CString s = time.Format(VAR_DATEVALUEONLY);
// s contains the date formatted based on 
// the current national language specifications
// (locale ID). The time portion is ignored for 
// formatting purposes in this case.   

Per ulteriori informazioni, vedere la classe COleVariant.

Data e ora: supporto per database

A partire dalla versione 4.0, la programmazione del database MFC usa le COleDateTime classi e COleDateTimeSpan per rappresentare i dati di data e ora. Queste classi, usate anche in Automazione, sono derivate dalla classe COleVariant. Forniscono un supporto migliore per la gestione dei dati di data e ora rispetto CTime a e CTimeSpan.

Data e ora: SYSTEMTIME supporto

La COleDateTime classe include costruttori che accettano tempi di sistema e file da Win32.

La struttura Win32 FILETIME rappresenta l'ora come valore a 64 bit. È un formato più pratico per l'archiviazione interna rispetto a una SYSTEMTIME struttura e il formato usato da Win32 per rappresentare l'ora di creazione del file. Per informazioni sulla SYSTEMTIME struttura, vedere SYSTEMTIME. Per informazioni sulla FILETIME struttura, vedere FILETIME.

Vedi anche

Concetti
Argomenti MFC generali