CTime zweistellig



  • hi leute

    ich benutz CTime um die aktuelle systemzeit zu holen und dann in einem dialog an zu zeigen

    ich wuerd gern immre zweistellig anzeigen lassen

    12:12:12
    02:02:02

    aber die zeit wird von CTime immer einstellig gegeben

    2:2:2

    gibts eine praktischere funktion es zweistellig zu machen ausser einer if ?

    CTime time = CTime::GetCurrentTime();
    int iAktHour = time.GetHour();
    
    if( iAktHour < 10 )
        _stprintf( tcBuf, _T("0%d"), iAktHour ); 
    else
        _stprintf( tcBuf, _T("%d"), iAktHour );
    

    waere praktisch wenn ich dieses if los werden wuerd, da ich das fuer H:M:S D:M machen muss /=

    vor allem bei der anzeige was gesetzt wurde

    _stprintf( tcBuf, _T("Actualy set to:\n%d:%d:%d\n%d.%d.%d"), m_iHour, m_iMin, m_iSec, m_iDay, m_iMon, m_iYear );
    

    waer das ein riesen vorteil da ich hier nirgends das zweistellige benutzen kann
    %2d bringt nix, das sagt nur ne position, aber packt keine 0 vor der einstelligen int zahl /=

    jemand ne idee ?

    danke



  • CTime hat eine Funktion Format. Schau dir die mal an. 😉



  • // Example for CTime::Format and CTime::FormatGmt
    CTime t( 1999, 3, 19, 22, 15, 0 ); 
    // 10:15 PM March 19, 1999
    CString s = t.Format( "%A, %B %d, %Y" );
    ATLASSERT( s == "Friday, March 19, 1999" );
    

    das hilft mir irgendwie nicht weiter
    da kann ich doch immernoch das selbe benutzen was ich schon hab

    mal ein beispiel

    ich hab 1:2:3 also 1H 2M 3S

    und daraus will ich
    01:02:03 machen

    CTime time = CTime::GetCurrentTime(); 
    
    int iAktHour = time.GetHour();           
    int iAktMin = time.GetMinute();          
    int iAktSec = time.GetSecond();          
    int iAktDay = time.GetDay();             
    int iAktMon = time.GetMonth();         
    int iAktYear = ( time.GetYear() - 2000 );
    
    TCHAR tcBuf[50] = {'\0'};
    
    CString csbuff = _T( "" );
    CString csOutput = _T ("Actualy set to:\n" );
    
    if( m_iHour < 10 )
        csbuff.Format( _T( "0%d" ), m_iHour );
    else
        csbuff.Format( _T( "%d" ), m_iHour );
    csOutput += csbuff;
    csOutput += _T( ":" );
    csbuff = _T( "" );
    
    if( m_iMin < 10 )
        csbuff.Format( _T( "0%d" ), m_iMin );
    else
        csbuff.Format( _T( "%d" ), m_iMin );
    csOutput += csbuff;
    csOutput += _T( ":" );
    csbuff = _T( "" );
    
    if( m_iSec < 10 )
        csbuff.Format( _T( "0%d" ), m_iSec );
    else
        csbuff.Format( _T( "%d" ), m_iSec );
    csOutput += csbuff;
    csbuff = _T( "" );
    csOutput += _T( "\n" );
    
    if( m_iDay < 10 )
        csbuff.Format( _T( "0%d" ), m_iDay );
    else
        csbuff.Format( _T( "%d" ), m_iDay );
    csOutput += csbuff;
    csOutput += _T( "." );
    csbuff = _T( "" );
    
    if( m_iMon < 10 )
        csbuff.Format( _T( "0%d" ), m_iMon );
    else
        csbuff.Format( _T( "%d" ), m_iMon );
    csOutput += csbuff;
    csOutput += _T( "." );
    csbuff = _T( "" );
    
    if( m_iYear < 10 )
        csbuff.Format( _T( "0%d" ), m_iYear );
    else
        csbuff.Format( _T( "%d" ), m_iYear );
    csOutput += csbuff;
    
    SetDlgItemText( IDC_SHOWSTATUS, csOutput );
    

    nur das is halt total bloed - dann haette ich schon 3x so viel kram fuer so nen pillepalle - waere praktisch wenn ich gleich sagen koennte
    CString csHour = (if einstellig +0)iAktHour;
    oder sowas /=

    vorher
    "Actually set to:
    1:2:3
    1.2.3"

    nachher:
    "Actually set to:
    01:02:03
    01.02.03"

    bloed dafuer so ne lange funktion zu brauchen


  • Mod

    %I von CTime::Format liefert Dir die entsprechende Stunde mit führenden Nullen.

    Das ist natürlich Quatsch, es geht viel einfacher.

    if( iAktHour < 10 )
        _stprintf( tcBuf, _T("0%d"), iAktHour ); 
    else
        _stprintf( tcBuf, _T("%d"), iAktHour );
    

    Führende Nullen macht einfach:

    _stprintf( tcBuf, _T("%01d"), iAktHour );
    

    Zudem: Warum dieses umständliche Zusammensetzen des Strings?
    Es geht doch direkt in einem aufwasch...

    strText.Format("%02d:%02d:%02d",iHour,iMinute,iSecond);
    


  • %02d - wird bei 12 nicht daraus 012 ?



  • Ich hab jetzt grade die MSDN nicht griffbereit, also ausm Kopf:

    CTime t = CTime::GetCurrentTime();
    AfxMessageBox(t.Format("%h:%m:%s"));
    

    Könnte auch ein grosses M sein, ich weiß gerade nicht, was Monat und was Minute war. 🙄


  • Mod

    Mr Evil schrieb:

    %02d - wird bei 12 nicht daraus 012 ?

    Nein. Das bedeutet minimale Ausgabe 2 Stellen und bei Bedarf eben mit 0 auffüllen!



  • aaaaaah - dankeschoen - hatte das mit dem %02d anders in erinnerung - dankeschoen dadurch wird alles viel einfacher und uebersichtlicher {=


  • Administrator

    @MrEvil, ich hoffe mal du hast den Vorschlag von estartu befolgt, denn irgendwie scheint es mir nicht so zu sein ^^

    @estartu, alle gross dann stimmt es ^^

    CTime t = CTime::GetCurrentTime();
    AfxMessageBox(t.Format(_T("%H:%M:%S")));
    

    Gibt es übrigens auch für COleDateTime.

    Am besten zudem hier nachschauen, für alle Abkürzungen die mach benutzen kann.

    Grüssli



  • Dravere, ich glaube ich wurde überlesen. 😉
    Aber danke für die Korrektur. 🙂 Ich kopiere sowas sonst eigentlich blos noch im Projekt hin und her.


Anmelden zum Antworten