Data e hora no C++

280 views
Skip to first unread message

MARCOS UBIRAJARA

unread,
Jan 16, 2012, 10:18:03 PM1/16/12
to ccppb...@googlegroups.com
Oi pessoal,

Antes de tudo, gostaria de agradecer a ajuda dos mesters aqui do
fórum, a qual tem sido de grande valia para o meu aprendizado.

Eu estou dando continuidade ao meu projeto final da faculdade de
contas a pagar, e conforme eu expliquei anteriormente, eu decidi fazer
em C++.

Eu agora estou com uma dúvida, qual seria o tipo mais apropriado para
representar uma data em C++?

Eu sei que em java é a classe java.util.Date, qual seria a
contrapartida dessa classe, em C++?

Desde já agradeço,


Marcos

Batista Silva

unread,
Jan 17, 2012, 4:55:44 AM1/17/12
to ccppb...@googlegroups.com
At� onde eu conhe�o n�o existe class para data e hora em c++, eu uso os
recurso dessas bibliotecas:
#include <ctime>
#include <sys/time.h>
segue o exemplo da fun��o que criei

/**
* Metodo resposavel por retornar uma data
* para um formato informado.
* @param format "%Y-%m-%d %H:%M:%S"
* @return
*/
string TimeUtil::getTimeFormat(string format) {

time_t now;
struct tm *ts;
char buf[80];
char hora[80];

// Get the current time
time(&now);

//Format and print the time, "ddd yyyy-mm-dd hh:mm:ss zzz"
ts = localtime(&now); //"%Y-%m-%d %H:%M:%S"
strftime(buf, sizeof (buf), format.c_str(), ts);

sprintf(hora, "%s", buf);
string newhora(hora);

return newhora;
}

boa sorte!

gosto da �rea contabil, se desejar podemos trocar informa��es.


Em 17-01-2012 01:18, MARCOS UBIRAJARA escreveu:
> Oi pessoal,
>
> Antes de tudo, gostaria de agradecer a ajuda dos mesters aqui do

> f�rum, a qual tem sido de grande valia para o meu aprendizado.


>
> Eu estou dando continuidade ao meu projeto final da faculdade de
> contas a pagar, e conforme eu expliquei anteriormente, eu decidi fazer
> em C++.
>

> Eu agora estou com uma d�vida, qual seria o tipo mais apropriado para


> representar uma data em C++?
>

> Eu sei que em java � a classe java.util.Date, qual seria a


> contrapartida dessa classe, em C++?
>

> Desde j� agrade�o,
>
>
> Marcos
>
>

Gianni

unread,
Jan 17, 2012, 5:44:45 AM1/17/12
to ccppb...@googlegroups.com
Outra maneria, que � um pouco mais chata pois se tem que baixar e
instalar a lib, � usando a Boost[0].

A Boost tem a vantagem te de dar n�o s� o Date Time[1], mas mais um
monte de outras coisas, ent�o vale a pena j� se acostumar a usar a
Boost, pois voc� pode ainda precisar de muitas outras coisas dela.

[0] http://www.boost.org/doc/libs/1_48_0/
[1] http://www.boost.org/doc/libs/1_48_0/doc/html/date_time.html

Reuben Morais

unread,
Jan 17, 2012, 5:59:53 AM1/17/12
to ccppb...@googlegroups.com
E a própria std::chrono para quem tem esse luxo :)

-- reuben

Thiago Adams

unread,
Jan 17, 2012, 6:20:58 AM1/17/12
to ccppbrasil


On Jan 17, 8:59 am, Reuben Morais <reuben.mor...@gmail.com> wrote:
> E a própria std::chrono para quem tem esse luxo :)

A chrono não tem muita relação com calendários, dias da semana, meses,
formatação.
Se for este o objetivo não vai ser muito útil.

A chrono e compania têm uma forma de medir um tempo decorrido desde
uma determinada data usando um determinado relogio.
Você vai ter a informação que passou 21321321 ticks ou ms ou horas
desde o ponto inicial do tempo, mas depois disso ela não vai te ajudar
a saber que dia ou mês é este.

Reuben Morais

unread,
Jan 17, 2012, 7:03:02 AM1/17/12
to ccppb...@googlegroups.com
2012/1/17 Thiago Adams <thiago...@gmail.com>:

time_point e duration representam pontos no tempo e intervalos de
tempo, respectivamente, sem se importar com unidades específicas.
Mas se o objetivo é fazer operações locale-aware com semanas, meses
etc realmente não sei ela é útil. Alguns locales têm semanas cortadas
no começo e final do ano, por exemplo. Tenho 98.431% de certeza que
isso é levado em conta ao fazer operações com o locale certo, mas
nunca usei.

Para formatação você pode fazer por exemplo:
auto ontem = chrono::system_clock::now() - chrono::hours(24);
time_t t = chrono::system_clock::to_time_t(ontem);
cout << put_time(localtime(&t), "%A %F %T") << endl;

-- reuben

Thiago Adams

unread,
Jan 17, 2012, 7:22:42 AM1/17/12
to ccppbrasil


On Jan 17, 10:03 am, Reuben Morais <reuben.mor...@gmail.com> wrote:
> 2012/1/17 Thiago Adams <thiago.ad...@gmail.com>:
...
> Para formatação você pode fazer por exemplo:
> auto ontem = chrono::system_clock::now() - chrono::hours(24);
> time_t t = chrono::system_clock::to_time_t(ontem);
> cout << put_time(localtime(&t), "%A %F %T") << endl;
>

Legal não lembrava deste "to_time_t. "
Dependendo da necessidade de uso o time_t e as funções do C resolvem
muita coisa.


Alexandre Salles

unread,
Jan 19, 2012, 10:48:10 AM1/19/12
to ccppb...@googlegroups.com
Olá Marcos,

Uso uma da ATL:
ATL::COleDateTime


--
Antes de enviar um e-mail para o grupo leia:
                    http://www.ccppbrasil.org/wiki/Lista:AntesdePerguntar
--~--~---------~--~----~---------------------------------~----------~--~----~
[&] Colabore com a Pesquisa de Preferência de Conteúdo
             para Eventos do Grupo C & C++ Brasil:
                       http://www.surveymonkey.com/s/GBBGTXN
------~----~-------~---~---~---~---~----------------~------------~---------~
[&] C & C++ Brasil - http://www.ccppbrasil.org/
Para sair dessa lista, envie um e-mail para ccppbrasil-...@googlegroups.com
Para mais opções, visite http://groups.google.com/group/ccppbrasil
--~--~---------~--~----~--~-~--~---~----~-----------------~--~----------~
Emprego & carreira:  vag...@ccppbrasil.org
http://groups.google.com/group/dev-guys?hl=en

Djalma Rosa dos Santos Filho

unread,
Jan 19, 2012, 6:33:01 PM1/19/12
to ccppb...@googlegroups.com
Um problema conhecido do time_t é o bug do ano 2038.
O COleDateTime não tem esse problema, mas também nao é multiplataforma.
Na Internet existem várias implementações de classes para Data e Hora em C++, mas, até onde eu sei, nenhuma delas faz parte ou é candidata a entrar no padrão da linguagem.
Acho que Boost DateTime é mesmo a melhor opção, mais cedo ou mais tarde você vai ter mesmo que aderir a Boost.

2012/1/19 Alexandre Salles <salle...@gmail.com>

Rodrigo Madera

unread,
Jan 20, 2012, 7:47:10 AM1/20/12
to ccppb...@googlegroups.com
Eu uso o Boost date_time para tudo, e não dá pra reclamar.

O problema 2038 é quando são 31 bits usados, até onde eu sei. 

Se usar um tipo maior, não terá problemas. Ou usar 32 bits (ou seja, sem signo).

Mx

2012/1/19 Djalma Rosa dos Santos Filho <drsant...@gmail.com>

Rodrigo Strauss

unread,
Jan 20, 2012, 12:02:10 PM1/20/12
to ccppb...@googlegroups.com
Não tem mais. Pelo menos no Visual C++ o time_t já é 64bits faz tempo.

Rodrigo Strauss
http://www.1bit.com.br
@rodrigostrauss

2012/1/19 Djalma Rosa dos Santos Filho <drsant...@gmail.com>:

Djalma Rosa dos Santos Filho

unread,
Jan 21, 2012, 8:45:06 AM1/21/12
to ccppb...@googlegroups.com
Legal, obrigado pela informação.

Verifiquei que já foi mesmo corrigido desde o Visual Studio 2005 e usa por default um __int64.

#ifndef _TIME_T_DEFINED
#ifdef _USE_32BIT_TIME_T
typedef __time32_t time_t;      /* time value */
#else
typedef __time64_t time_t;      /* time value */
#endif
#define _TIME_T_DEFINED         /* avoid multiple def's of time_t */
#endif


2012/1/20 Rodrigo Strauss <rod...@1bit.com.br>

Rodrigo Strauss

unread,
Jan 22, 2012, 2:34:11 PM1/22/12
to ccppb...@googlegroups.com

E esse define _USE_32BIT_TIME_T não é suportado no Windows 64bits.

Reply all
Reply to author
Forward
0 new messages