OVH Cloud OVH Cloud

Ecrire l'heure dans une string

11 réponses
Avatar
stat
Bonjour,

je dois ecrire l'heure dans une string selon le format suivant :
YYYYMMDD hh:mm:ss:nn

Pour ce faire j'ai ecrit la fonction suivante :

std::string TimeToStr(const SYSTEMTIME & st, bool IsIncludeDate =
false)
{
std::ostringstream s;

s.fill('0');
if (IsIncludeDate)
{
s.width(4);
s << st.wYear;
s.width(2);
s << st.wMonth;
s.width(2);
s << st.wDay < " ";
}

s.width(2);
s << st.wHour << ":";
s.width(2);
s << st.wMinute << ":";
s.width(2);
s << st.wSecond << ":";
s.width(3);
s << st.wMilliseconds;
return s.str();
}

N'y a-t-il pas moyen de faire plus simple ?

Merci.

--
This is an automatic signature of MesNews.
Site : http://www.mesnews.net

10 réponses

1 2
Avatar
Serge Paccalin
Le 30.11.2006 11:35, :

je dois ecrire l'heure dans une string selon le format suivant :
YYYYMMDD hh:mm:ss:nn

Pour ce faire j'ai ecrit la fonction suivante :

std::string TimeToStr(const SYSTEMTIME & st, bool IsIncludeDate =
false)


Vu que tu utilises SYSTEMTIME qui est propre à Windows, autant appeler
GetDateFormat() et GetTimeFormat().

--
___________
_/ _ _`_`_`_) Serge PACCALIN -- sp ad mailclub.net
_L_) Pour bien répondre avec Google, ne pas cliquer
-'(__) « Répondre », mais « Afficher les options »,
_/___(_) puis cliquer « Répondre » (parmi les options).

Avatar
stat
Vu que tu utilises SYSTEMTIME qui est propre à Windows, autant appeler
GetDateFormat() et GetTimeFormat().


Je ne souhaite pas utiliser ces fonctions-la.
Merci.

--
This is an automatic signature of MesNews.
Site : http://www.mesnews.net

Avatar
Sylvain
stat wrote on 30/11/2006 11:35:

je dois ecrire l'heure dans une string selon le format suivant :
YYYYMMDD hh:mm:ss:nn
Pour ce faire j'ai ecrit la fonction suivante :

std::string TimeToStr(const SYSTEMTIME & st, bool IsIncludeDate = false)
{
[]
}
N'y a-t-il pas moyen de faire plus simple ?


du beau C++ tout çà! -- excepté que des *milli*secondes ça court de 000
à 999 donc ':nnn' serait plus juste.

plus "simple" je ne pense pas - car le code est en effet très simple (
et explicite) à lire.

plus court, oui, vais-je oser vu le thread précédent ?...

<bouh pas bo>
static char buffer[22];
sprintf(buffer, "%04d%02d%02d %02d:%02d:%02d:%03d",
st.wYear, st.wMonth, st.wDay,
st.wHour, st.wMinute, st.wSecond, st.wMilliseconds);
return buffer + ((IsIncludeDate) ? 0 : 9);
</bouh pas bo>

mais ceci est (objectivement) moins clair.
Sylvain.

Avatar
James Kanze
stat wrote:

je dois ecrire l'heure dans une string selon le format suivant :
YYYYMMDD hh:mm:ss:nn

Pour ce faire j'ai ecrit la fonction suivante :

std::string TimeToStr(const SYSTEMTIME & st, bool IsIncludeDate =
false)
{
std::ostringstream s;

s.fill('0');
if (IsIncludeDate)
{
s.width(4);
s << st.wYear;
s.width(2);
s << st.wMonth;
s.width(2);
s << st.wDay < " ";
}

s.width(2);
s << st.wHour << ":";
s.width(2);
s << st.wMinute << ":";
s.width(2);
s << st.wSecond << ":";
s.width(3);
s << st.wMilliseconds;
return s.str();
}

N'y a-t-il pas moyen de faire plus simple ?


Pas en C++ ; on ne connaît pas les milliseconds. En supposant
les avoir d'ailleur...
Je ne sais pas si c'est plus simple, mais :

std::string
timeToStr( time_t heure, int milliseconds, bool includeDate )
{
tm brokenDown = *localtime( &heure ) ;
char buffer[ 22 ] ;
if ( strftime( buffer,
sizeof( buffer ),
includeDate ? "%Y%m%d %H:%M%S" : "%H%M%S",
brokenDown ) == 0 ) {
abort() ;
}
std::ostringstream tmp ;
tmp << buffer << '.' << milliseconds ;
return tmp.str() ;
}

Sinon, quelque chose du genre :

std::string
timeToStr( time_t heure, int milliseconds, bool includeDate )
{
tm brokenDown = *localtime( &heure ) ;
std::ostringstream tmp ;
tmp.fill( '0' ) ;
if ( includeDate ) {
tmp << std::setw( 4 ) << brokenDown.tm_year + 1900
<< std::setw( 2 ) << brokenDown.tm_mon + 1
<< std::setw( 2 ) << brokenDown.tm_mday ;
<< ' ' ;
}
tmp << std::setw( 2 ) << brokenDown.tm_hour
<< ':' << std::setw( 2 ) << brokenDown.tm_min
<< ':' << std::setw( 2 ) << brokenDown.tm_sec
<< '.' << std::setw( 3 ) << milliseconds ;
return tmp.str() ;
}

Ni l'un, ni l'autre, particulièrement simple. À vrai dire, je
regarderais plutôt du côté d'une bibliothèque tièrce, genre
boost::date_time. Sinon, évidemment, quelque chose de spécifique
au système, vue qu'il va falloir être spécifique au système de
toute façon pour obtenir les millisecondes.

--
James Kanze (Gabi Software) email:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34

Avatar
James Kanze
Sylvain wrote:
stat wrote on 30/11/2006 11:35:

je dois ecrire l'heure dans une string selon le format suivant :
YYYYMMDD hh:mm:ss:nn
Pour ce faire j'ai ecrit la fonction suivante :

std::string TimeToStr(const SYSTEMTIME & st, bool IsIncludeDate = fal se)
{
[]
}
N'y a-t-il pas moyen de faire plus simple ?


du beau C++ tout çà! -- excepté que des *milli*secondes ça court de 000
à 999 donc ':nnn' serait plus juste.

plus "simple" je ne pense pas - car le code est en effet très simple (
et explicite) à lire.

plus court, oui, vais-je oser vu le thread précédent ?...

<bouh pas bo>
static char buffer[22];
sprintf(buffer, "%04d%02d%02d %02d:%02d:%02d:%03d",
st.wYear, st.wMonth, st.wDay,
st.wHour, st.wMinute, st.wSecond, st.wMilliseconds);
return buffer + ((IsIncludeDate) ? 0 : 9);
</bouh pas bo>

mais ceci est (objectivement) moins clair.


Et plus dangéreux. Qu'est-ce que tu as contre strftime ? Il
n'est pas particulièrement claire non plus -- je dois chercher
les options de formattage chaque fois dans la doc, mais il faut
dire qu'on manque sérieusement d'altérnatifs.

Évidemment, il faut ajouter les millisecondes à la main. Ni le C
ni le C++ ne reconnaissent un intervale de temps inférieur à la
seconde. Ce qui me fait penser qu'il a dû utiliser quelque chose
du propre au système pour les millisécondes, et que donc rien
n'empèche qu'il se sert aussi de quelque chose du propre au
système pour le formattage. (S'il y en a ; je n'en connaît pas
dans Posix/Unix.)

Sinon, il reste des bibliothèques tièrces. En ajouter une juste
pour ça ne se justifie que si on fait beaucoup de travail avec
des heures, mais si on se sert déjà d'une bibliothèque tièrce
pour d'autres chose, et qu'elle offre des possibilités, c'est
aussi une solution. (Boost a date_time, et c'est difficile à
imaginer un nouveau projet qui ne se sert pas de Boost.)

--
James Kanze (GABI Software) email:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34


Avatar
stat
Merci bien,
Vous aviez tous bien compris que tout le probleme etait ces fichues
millisecondes...

--
This is an automatic signature of MesNews.
Site : http://www.mesnews.net
Avatar
Serge Paccalin
Le jeudi 30 novembre 2006 à 18:57:56, stat a écrit dans
fr.comp.lang.c++ :

Vu que tu utilises SYSTEMTIME qui est propre à Windows, autant appeler
GetDateFormat() et GetTimeFormat().


Je ne souhaite pas utiliser ces fonctions-la.
Merci.


Dans ce cas, garde le code que tu as posté.

--
___________
_/ _ _`_`_`_) Serge PACCALIN -- sp ad mailclub.net
_L_) Pour bien répondre avec Google, ne pas cliquer
-'(__) « Répondre », mais « Afficher les options »,
_/___(_) puis cliquer « Répondre » (parmi les options).


Avatar
Sylvain
James Kanze wrote on 01/12/2006 09:19:

Et plus dangéreux.


j'ai mis un casque!

Qu'est-ce que tu as contre strftime ?


le PO utilise un SYSTEMTIME, pas un time_t.
qu'est-ce que tu as contre le fait de répondre à la question.

[...]

Évidemment, il faut ajouter les millisecondes à la main.


SYSTEMTIME contient les millisec.

Ni le C ni le C++ ne reconnaissent un intervale de temps
inférieur à la seconde. Ce qui me fait penser qu'il a
dû utiliser quelque chose du propre au système pour
les millisécondes, [...]


oui, un SYSTEMTIME.

pourquoi "ni le C++", éclaire ma lanterne si besoin, mais je n'ai vu
aucun apport de C++ (par rapport à C) sur ces foutus date/time.
et c'est plus que regrettable.

[...] (Boost a date_time, et c'est difficile à
imaginer un nouveau projet qui ne se sert pas de Boost.)


les miens le font (et que vois pas non plus en quoi Boost va m'aider à
migrer sur Vista, par exemple).

Sylvain.

Avatar
James Kanze
Sylvain wrote:
James Kanze wrote on 01/12/2006 09:19:

Et plus dangéreux.


j'ai mis un casque!


:-)

Qu'est-ce que tu as contre strftime ?


le PO utilise un SYSTEMTIME, pas un time_t.
qu'est-ce que tu as contre le fait de répondre à la question.


Parce que la seule représentation de la date de l'heure en C++
en C++ standard, c'est time_t. (Ou tm.) S'il veut une solution
pûrement Windows, je ne peux pas l'aider (et strictement
parlant, ce n'est pas ici qu'il faudrait démander). Vue la
faiblesse du support standard ici, je peux bien concevoir ce
qu'on préfère une solution propre au système, mais avec un
support plus complet. Mais il avait déjà répondu à Serge qu'il
ne voulait pas GetDateFormat() et GetTimeFormat(). Et s'il ne
veut pas les fonctions propre à Windows, évidemment, il va
falloir qu'il utilise time_t et tm (et qu'il rénonce aux
microsecondes:-().

Mais j'avoue que je ne sais pas au juste ce qu'il veut. Je n'ai
pas la moindre idée ce que c'est SYSTEMTIME, par exemple. Mais
je fais confiance à Serge qu'il existe des fonctions Windows qui
permettent à le formatter comme il faut. De toute façon, je
crois qu'il faut qu'il décide : ou bien, les types Windows, et
les fonctions Windows qui les accompagnent, ou bien, les types
standard, et les fonctions standard. Melanger les deux n'a pas
de sens.

[...]

Évidemment, il faut ajouter les millisecondes à la main.


SYSTEMTIME contient les millisec.


Et comment est-ce que je suis censé le savoir ?

Il a dit qu'il ne voulait pas utiliser les fonctions Windows
(qui, je suppose, s'attendent à ce type). Il faut donc bien
qu'il en rénonce aux types Windows aussi, et qu'il fasse comme
nous autres, qui ne développent pas sur des systèmes Windows.

Ni le C ni le C++ ne reconnaissent un intervale de temps
inférieur à la seconde. Ce qui me fait penser qu'il a
dû utiliser quelque chose du propre au système pour
les millisécondes, [...]


oui, un SYSTEMTIME.

pourquoi "ni le C++", éclaire ma lanterne si besoin, mais je n'ai vu
aucun apport de C++ (par rapport à C) sur ces foutus date/time.
et c'est plus que regrettable.


Je suis tout à fait d'accord. C'est vraiment dommage, mais le
C++ a resté au niveau du C en ce qui concerne les dates et
l'heure.

[...] (Boost a date_time, et c'est difficile à
imaginer un nouveau projet qui ne se sert pas de Boost.)


les miens le font (et que vois pas non plus en quoi Boost va m'aider à
migrer sur Vista, par exemple).


C'est quoi, Vista ?

Si tu développes un projet tout neuf, sans passif, ça serait
vraiment dommange de ne pas se doter de tous les moyens
modernes. Donc, le glaneur de cellules de Boehm, Boost, une
bonne bibliothèque de gestion de fenêtres (wxWidgets,
probablement), si l'application en a besoin, et que sais-je
d'autre. Ça serait bête de ne pas mettre tous les atouts de son
côté.

Évidemment, des projets tout neuf, il n'y en a pas des masses,
et la plupart du temps, il faut prendre en compte l'existant, ce
qui limite parfois les alternatifs. Alors, on fait ce qu'on
peut, mais ce n'est rarement autant qu'on voudrait.

--
James Kanze (Gabi Software) email:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34


Avatar
Sylvain
James Kanze wrote on 01/12/2006 22:01:

Parce que la seule représentation de la date de l'heure en C++
en C++ standard, c'est time_t. (Ou tm.) S'il veut une solution
pûrement Windows, je ne peux pas l'aider (et strictement
parlant, ce n'est pas ici qu'il faudrait démander). Vue la


time_t est heureusement supporté sur wintel (time_t time(time_t*)) mais
à "l'inconvénient" de retourner un nb de sec. ... à convertir en struct
tm via localtime(), puis ajuster les valeurs, pourquoi le mois est
0-basé et le jour 1-basé, ..., tout cela est très archaïque!
bref GetSystemTime(SYSTEMTIME*) est plus direct (sous wintel tjrs).

faiblesse du support standard ici, je peux bien concevoir ce
qu'on préfère une solution propre au système, mais avec un
support plus complet. Mais il avait déjà répondu à Serge qu'il
ne voulait pas GetDateFormat() et GetTimeFormat(). Et s'il ne
veut pas les fonctions propre à Windows, évidemment, il va
falloir qu'il utilise time_t et tm (et qu'il rénonce aux
microsecondes:-().


ce n'est surement pas tant le caractère propre à windows, que le propos
même de Get/Date/Time/Format, ceux-ci utilisent une locale et produisent
des sorties un peu trop littéraires, par exemple:

int GetDateFormat(
LCID Locale, // locale
DWORD dwFlags, // options
CONST SYSTEMTIME *lpDate, // date
LPCTSTR lpFormat, // date format
LPTSTR lpDateStr, // formatted string buffer
int cchDate // size of buffer
);
(avec LCID=DWORD, DWORD=unsigned long, LPCTSTR=const char*, LPTSTR=char*
(si non unicode))

fonctionne à peu près comme strftime avec des identifiants spécifiques
(extraits:
d Day of month as digits with no leading zero for single-digit days.
dd Day of month as digits with leading zero for single-digit days.
ddd Day of week as a three-letter abbreviation. [...]
M Month as digits with no leading zero for single-digit months.
etc, etc)

bref, justement on peut avoir envie de s'en passer -- pour ne pas
"chercher les options de formattage chaque fois dans la doc" !

la question des millisec. est annexe, ils sont indispensables dans peu
de cas - chronométrage fin, qui à peu de chance de se satisfaire de
SYSTEMTIME de toute façon (je préfèrerais une carte National Instr. dans
ce cas).

Mais j'avoue que je ne sais pas au juste ce qu'il veut. Je n'ai
pas la moindre idée ce que c'est SYSTEMTIME, par exemple. Mais


typedef struct _SYSTEMTIME {
WORD wYear;
WORD wMonth;
WORD wDayOfWeek;
WORD wDay;
WORD wHour;
WORD wMinute;
WORD wSecond;
WORD wMilliseconds;
} SYSTEMTIME, *PSYSTEMTIME, *LPSYSTEMTIME;
(WORD=unsigned short)

donc "l'avantage" de quelque chose près à l'emploi vs le nb de sec.
depuis on-sait-jamais-quand.

je fais confiance à Serge qu'il existe des fonctions Windows qui
permettent à le formatter comme il faut. De toute façon, je


oui mais pas pour un résultat rapide, simple, non localisé.

crois qu'il faut qu'il décide : ou bien, les types Windows, et
les fonctions Windows qui les accompagnent, ou bien, les types
standard, et les fonctions standard. Melanger les deux n'a pas
de sens.


passer d'un SYSTEMTIME à un struct tm n'a pas de sens, soit, mais
formatter à-la-mano peut rester requis.

Il a dit qu'il ne voulait pas utiliser les fonctions Windows
(qui, je suppose, s'attendent à ce type). Il faut donc bien
qu'il en rénonce aux types Windows aussi, et qu'il fasse comme
nous autres, qui ne développent pas sur des systèmes Windows.


il pourrait, mais GetSystemeTime(&st) à l'avantage d'être court.

[...] (Boost a date_time, et c'est difficile à
imaginer un nouveau projet qui ne se sert pas de Boost.)


les miens le font (et que vois pas non plus en quoi Boost va m'aider à
migrer sur Vista, par exemple).


C'est quoi, Vista ?


la dernière vache à lait de MS (sortie cette semaine) - et la dernière
vacherie pour des développeurs qui pleuront leur chères API sacrifiées.

Si tu développes un projet tout neuf, sans passif, [...]


tout neuf, from rien-du-tout, c'est en effet assez rare.

Sylvain.



1 2