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

  • Curtir 1

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...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!