Ir ao conteúdo

Posts recomendados

Postado

Preciso que alguém me explique linha por linha desse código. Estou aprendendo a linguagem agora e preciso usar a data e a hora em formato ISO. Eu consegui usar dessa forma, mas não entendi nada. Existe alguma forma mais simples de fazer isso? Por favor, me ajudem!!!

 

#include <ctime>
#include <stdio.h>

int main(){
    
    time_t data_tempo;
    time(&data_tempo);
    
    struct tm*tempo = localtime(&data_tempo);
    struct tm*data = localtime(&data_tempo);
    
    int dia = data->tm_mday;
    int mes = data->tm_mon + 1;
    int ano = data->tm_year + 1900;
    
    int seg = tempo->tm_sec;
    int min = tempo->tm_min;
    int hora = tempo->tm_hour;
    
    
    printf("\n%.4d-%.2d-%.2dT%d: %.2d: %.2d -03:00", ano, mes, dia, hora, min, seg);
    
    return 0;
    
} 

 

  • Curtir 1
Postado

@Hiago Martins    você está começando a aprender c++ , então você pegou um código bem complicado , pois esse é com ponteiro , seria melhor um código mais simples como esse aqui   :

#include <iostream>
#include <windows.h>
using namespace std;

int main(){
    SYSTEMTIME tm;//variável do sistema referente ao tempo
    GetSystemTime(&tm);//comando que pega o tempo e coloca em tm
    int w=20,i,dia,mes,ano=0;
    char dias;
    do{
        GetSystemTime(&tm);//comando que pega o tempo
        cout<<"hora    : "<<tm.wHour-2<<endl;//mostra as horas
        cout<<"minuto  : "<<tm.wMinute<<endl;//mostra os minutos
        cout<<"segundo : "<<tm.wSecond<<endl;//mostra os segundos
        cout<<"A Hora eh -> "<<tm.wHour-2<<" : "<<tm.wMinute<<" : "<<tm.wSecond<<endl;

        cout << "Dia: " << tm.wDay << endl;//mpostra o dia do mês
        cout << "Mes: " << tm.wMonth << endl;//mostra o mês do ano
        cout << "Ano: " << tm.wYear << endl;//mostra o ano
        Sleep(999);
        system("cls");
        w--;
    }while(w);
}

 

  • Curtir 1
Postado

@Hiago Martins Olá. Creio que nesse link vai encontrar o que precisa:

http://linguagemc.com.br/exibindo-data-e-hora-com-time-h/

 

Aqui seria outra maneira de, em C, obter a data e hora do sistema:

#include <stdio.h>
#include <time.h>
#include <string.h> // para a função strftime

int main() {

    time_t now;
    struct tm *tm_now;
    char texto[40];

    time(&now);
    tm_now = localtime(&now);
    strftime(texto, sizeof(texto), "\t %H:%M:%S\n\t%d/%m/%Y\n", tm_now);
    printf("%s", texto);

    return 0;
}

Já se quiser obter a data e hora do sistema de uma forma mais simples ainda, seria isso:

#include <stdio.h>
#include <time.h>

int main() {

    time_t now;

    time(&now);

    printf("%s", ctime(&now));

    return 0;
}

Postei as resposta em C pois seu código está me C, e não C++ :)

 

Recomendo começar a aprender o C no padrão Ansi C

Postado

@r_Tray

#include <stdio.h>
#include <time.h>
#include <string.h> // para a função strftime

int main() {

    time_t now;
    struct tm *tm_now;
    char texto[40];

    time(&now);
    tm_now = localtime(&now);
    strftime(texto, sizeof(texto), "\t %H:%M:%S\n\t%d/%m/%Y\n", tm_now);
    printf("%s", texto);

    return 0;
}

Existe alguma forma de usar esse código sem string?  No meu trabalho eu não posso usar as API da string.h.

  • Curtir 1
Postado

@Hiago Martins Olá. Apenas um equívoco da minha parte: Para a função strftime não é preciso o arquivo de cabeçalho <string.h>, segundo a documentação do C/C++:

http://www.cplusplus.com/reference/ctime/strftime/

Para a função strftime: <time.h>

No link tem um exemplo de um código que pode servir para seu trabalho

Já o código poderia também ficar assim:

#include <stdio.h>
#include <time.h> /* time_t, time, localtime, strftime */

int main () {

    time_t now;
    char texto[80];

    time(&now);

    strftime(texto, sizeof(texto), "\t %H:%M:%S\n\t%d/%m/%Y", localtime(&now));
    puts(texto);

    return 0;
}

Não sei se é isso que você queria

Se não for é só dizer, ok?

Armazenar a data e hora formatadas em outro tipo de variável que não strings me parece bem estranho, mas em C se dá um jeito! :)

Em C strings são um vetor de char (vetor de caracteres). Logo, daria para imprimir o resultado assim:

for (i = 0; texto[i] != '\0'; i++) {
    printf("%c", texto[i]); // aqui é impresso um caractere de cada vez
}

Meio que "gambiarra" isso. rs... Mas não deixa de ser válido!

Postado

@Hiago Martins Olá. Também daria para trabalhar com ponteiros para armazenar a data e hora formatadas (me empolguei com o exercício):

#include <stdio.h>
#include <time.h> /* time_t, time, localtime, strftime */
#include <stdlib.h> /* macro NULL, malloc, free */

int main () {

    time_t now;
    char *texto = NULL;

    texto = malloc(80 * sizeof(char));

    time(&now);

    strftime(texto, 80, "\t %H:%M:%S\n\t%d/%m/%Y", localtime(&now));
    puts(texto);

    free(texto);

    texto = NULL;

    return 0;
}

 

Postado

@Hiago Martins Olá. strftime é uma função do C, e não uma API

Uma API que é muito conhecida seria a API do Windows, que também pode ser chamada de Win32 API, que é a que o @devair1010 usou no código que postou acima

 

<string.h> é um arquivo de cabeçalho (mais conhecido como uma biblioteca do C)

Não estudei muito sobre APIs em C, a não ser alguma coisa da Win32 API

Outra API que poderia mencionar seria a RouterOS API

 

Resumindo: Nos códigos que postei, não estou fazendo uso de nenhuma API

Postado

@Hiago Martins

16 minutos atrás, Hiago Martins disse:

cara tu é fera demais!!!

Pode ter certeza que tem muita coisa para se aprender em C ainda (e como tem!) 😉

  • 11 meses depois...
Postado

tenho uma duvida uso esse relogio mas ele não atualiza os segundos alguém pode ajudar?


if (tag_info == "relogio") {
        ostringstream os;
        int desliga=0;
        char buffer [80];
  
            time_t rawtime;
  struct tm * timeinfo;
  time (&rawtime);
  timeinfo = localtime (&rawtime);

  strftime (buffer,80,"%H:%M:%S",timeinfo);
  puts (buffer);
    os <<buffer;
    info_tag = os.str();
    }else{
    
    info_tag = " ";
    }

Postado

Em 16/04/2019 às 22:44, Hiago Martins disse:

Preciso que alguém me explique linha por linha desse código. Estou aprendendo a linguagem agora e preciso usar a data e a hora em formato ISO. Eu consegui usar dessa forma, mas não entendi nada. Existe alguma forma mais simples de fazer isso?

  

Você tentou ler a documentação? Tem um livro? Qual é? Uma apostila ao menos?

 

Isso é bem simples, não sei o que dizer. Se você sabe usar printf() sabe usar isso. Se não sabe usar printf() seu problema não é strftime(). Você pega a hora, põe na tabela, formata como quer e usa.

 

strftime() é um printf() para hora
 

Essa rotina pega uma hora e um formato e gera uma string. Só isso. Como um

    printf("%s\n", "16/04/20");

Que mostra você sabe o que. Só que para strftime() é preciso avisar qual a data que quer usar. Igualzinho ao printf(). 


Leu ao menos a declaração de strftime()? Aqui está

    size_t strftime(
      char *str,
      size_t maxsize,
      const char *format,
      const struct tm *timeptr);

Como ler um trem desses? Você precisa saber a declaração de uma função... Não tem outro jeito. E é simples.

 

Ela retorna algo do tipo size_t. um número sem sinal, uma quantia. Adivinha o que é... O tamanho da string que ele gerou, tipo para "12/01/2002" strftime() retorna 10 porque você precisa saber o tamanho para por na tela. OK, nem sempre. mas muitas vezes você precisa e é muito gentil a rotina devolver o número para você não ter que fazer o óbvio e chamar strlen() na linha de baixo.

 

str

 

Sem surpresas: você precisa dizer onde vai gravar sua string certo? É aí.  char* claro, porque é uma string.

 

maxsize

 

Dá pra imaginar o que é: o tamanho máximo que pode usar em str. Porque dependendo do que você pedir o tamanho pode variar muito. Você pode querer so "11:35" para por um horário na tela, ou uma expressão grande com dia da semana, ano e hora com segundos... size_T claro porque é uma quantia positiva e algum maluco poderia chamar com -23

 

format

 

Complicado? Claro que format é descrição do que você quer. Numa convenção igual a que está acostumado a usar com printf() e scanf(). É uma string. Simples como essa aqui:

    const char* f_dia_mes_ano = "%d de %B de %Y";
const char* para você poder usar por exemplo "%d/%B/%Y" direto na chamada sem ter que criar uma variável para isso

 

timeptr

 

Você já sabia que a data tinha que vir de algum lugar. É desse: você passa o endereço de uma estrutura dessas, onde está o tal tempo que você quer formatar. Nem sempre você quer a data e hora de agora mesmo certo?

 

E o que tem nessa p$%%a?

 

Dá pra imaginar,  um horário. Mas não precisa imaginar porque vou te mostrar

struct tm
{
    int tm_sec;   // seconds after the minute - [0, 60] including leap second
    int tm_min;   // minutes after the hour - [0, 59]
    int tm_hour;  // hours since midnight - [0, 23]
    int tm_mday;  // day of the month - [1, 31]
    int tm_mon;   // months since January - [0, 11]
    int tm_year;  // years since 1900
    int tm_wday;  // days since Sunday - [0, 6]
    int tm_yday;  // days since January 1 - [0, 365]
    int tm_isdst; // daylight savings time flag
};

Bem óbvio, um horário. Completo.

 

Em C você o tempo é contado a partir de jan 1970. Não foi ideia minha. 

 

E como preencher isso?

 

Simples: você declara uma estrutura dessas e chama time() para preencher para você. Com que hora se você quiser agora mesmo? Algo assim:

    time_t              agora_mesmo;
    agora_mesmo = time(&agora_mesmo);

Aí você tem a hora que você quer. Precisa preencher aquela estrutura tm com essa hora. Claro que poderia ter feito na mesma linha mas isso aqui é pra explicar e não resumir

    Formulario_da_hora* tabela;
    tabela = localtime(&agora_mesmo);

Complexo? Você vê a hora, preenche a estrutura e formata como você quer. Faz sentido. Porque localtime()? Porque tem que incorporar a noção de fuso horário no ... horário. Assim é com as horas.

 

Veja uma tabela aqui https://www.tutorialspoint.com/c_standard_library/c_function_strftime.htm

 

Claro, tem um resumo

 

Pode ver mais no manual. Mas é o óbvio: formata as quantias que estão na tal tabela tm.

 

Veja uns formatos

    const char* f_dia_mes_ano = "%d de %B de %Y";
    const char* f_data_com_dia_da_semana = "%A, %d de %B de %Y";
    const char* f_hhmmss = "%H:%M:%S";
    const char* f_com_preguica = "%c";

Que mostram 

 

Dia, nome do mes, ano com 4 digitos '16 de April de 2020'

Agora com o dia da semana 'Thursday, 16 de April de 2020'

Depois do setlocale() 'quinta-feira, 16 de abril de 2020'

Hora Minuto Segundo: '13:00:23'

Com preguica, usando so %c: '16/04/2020 13:00:23'

A segunda e a terceira linha estão aí  para você ver que precisa usar setlocale() para cada usar os nomes adequados para a região onde vai rodar o seu programa. Não é complicado: é o mundo. Tem que traduzir os dias da semana se você quer que saia no idioma local.

 

Um exemplo, esse exemplo:
 

#define _CRT_SECURE_NO_WARNINGS
#include "locale.h"
#include "math.h"
#include "stdio.h"
#include "time.h"

typedef struct tm   Formulario_da_hora;
int main(int argc, char** argv)
{
    char texto[80];
    char* pHoraFormatada = texto;

    const char* f_dia_mes_ano = "%d de %B de %Y";
    const char* f_data_com_dia_da_semana = "%A, %d de %B de %Y";
    const char* f_hhmmss = "%H:%M:%S";
    const char* f_com_preguica = "%c";

    time_t              agora_mesmo;
    agora_mesmo = time(&agora_mesmo);

    Formulario_da_hora* tabela;
    tabela = localtime(&agora_mesmo);

    strftime(pHoraFormatada, 80, f_dia_mes_ano, tabela);
    printf("\nDia, nome do mes, ano com 4 digitos '%s'\n", texto);

    strftime(pHoraFormatada, 80, f_data_com_dia_da_semana, tabela);
    printf("\nAgora com o dia da semana '%s'\n", texto);
 
    setlocale(LC_ALL, "Portuguese");

    strftime(pHoraFormatada, 80, f_data_com_dia_da_semana, tabela);
    printf("\nDepois do setlocale() '%s'\n", texto);

    strftime(pHoraFormatada, 80, f_hhmmss, tabela);
    printf("\nHora Minuto Segundo: '%s'\n", texto);

    strftime(pHoraFormatada, 80, f_com_preguica, tabela);
    printf("\nCom preguica, usando so %%c: '%s'\n", texto);

    return 0;

};  // main()

Sobre API
 

Está sim usando uma API. API é uma abreviatura para Application Programming Interface, interface para programação de aplicações. E todo header é em essência uma API: ele faz exatamente isso: declara a interface para você usar o que está la dentro. 

 

Veja DENTRO de time.h a API para chamar strftime()
 

 

A API do windows é exposta (essa é a terminologia em português, creio) em boa parte em windows.h por exemplo

image.png

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!