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:02aber 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 habmal ein beispiel
ich hab 1:2:3 also 1H 2M 3S
und daraus will ich
01:02:03 machenCTime 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
-
%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.
-
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 {=
-
@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.