Как получить значения даты и времени в программе на Си?

У меня есть что-то вроде этого:

char *current_day, *current_time;
system("date +%F");
system("date +%T");

Он печатает текущий день и время в stdout, но я хочу получить этот вывод или назначить их переменным current_day и current_time, чтобы впоследствии я мог выполнить некоторую обработку с этими значениями.

current_day ==> current day
current_time ==> current time

Единственное решение, о котором я могу думать сейчас, - направить вывод на некоторый файл, а затем прочитать файл, а затем назначить значения даты и времени current_day и current_time. Но я думаю, что это не очень хорошо. Есть ли другой короткий и элегантный способ?

Ответ 1

Используйте time() и localtime(), чтобы узнать время:

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

void main()
{
  time_t t = time(NULL);
  struct tm tm = *localtime(&t);
  printf("now: %d-%d-%d %d:%d:%d\n", tm.tm_year + 1900, tm.tm_mon + 1,tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec);
}

Ответ 2

time_t rawtime;   
time ( &rawtime );
struct tm *timeinfo = localtime ( &rawtime );

Вы также можете использовать strftime для форматирования времени в строку.

Ответ 3

strftime (C89)

Мартин упомянул это, вот пример:

main.c

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

int main(void) {
    time_t t = time(NULL);
    struct tm *tm = localtime(&t);
    char s[64];
    assert(strftime(s, sizeof(s), "%c", tm));
    printf("%s\n", s);
    return 0;
}

GitHub вверх по течению.

Скомпилируйте и запустите:

gcc -std=c89 -Wall -Wextra -pedantic -o main.out main.c
./main.out

Пример вывода:

Thu Apr 14 22:39:03 2016

Спецификатор %c создает тот же формат, что и ctime.

Одним из преимуществ этой функции является то, что она возвращает количество записанных байтов, что позволяет лучше контролировать ошибки в случае, если сгенерированная строка слишком длинная:

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

  Provided  that  the  result string, including the terminating null byte, does not exceed max bytes, strftime() returns the number of bytes (excluding the terminating null byte) placed in the array s.  If the length of the result string (including the terminating null byte) would exceed max bytes, then
   strftime() returns 0, and the contents of the array are undefined.

  Note that the return value 0 does not necessarily indicate an error.  For example, in many locales %p yields an empty string.  An empty format string will likewise yield an empty string.

asctime и ctime (C89)

asctime - это удобный способ форматирования struct tm:

main.c

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

int main(void) {
    time_t t = time(NULL);
    struct tm *tm = localtime(&t);
    printf("%s", asctime(tm));
    return 0;
}

Пример вывода:

Wed Jun 10 16:10:32 2015

И есть также ctime() который в стандарте называется сокращением:

asctime(localtime())

Как отметил Джонатан Леффлер, этот формат имеет недостаток отсутствия информации о часовом поясе.

POSIX 7 пометил эти функции как "устаревшие", чтобы их можно было удалить в следующих версиях:

Разработчики стандарта решили пометить функции asctime() и asctime_r() как устаревшие, хотя asctime() входит в стандарт ISO C из-за возможности переполнения буфера. Стандарт ISO C также предоставляет функцию strftime(), которую можно использовать, чтобы избежать этих проблем.

C++ версия этого вопроса: Как узнать текущее время и дату в C++?

Проверено в Ubuntu 16.04.

Ответ 4

Ответы, приведенные выше, являются хорошими ответами на CRT, но если вы хотите, вы также можете использовать решение Win32 для этого. Это почти идентично, но IMO, если вы программируете для Windows, вы можете просто использовать свой API (dunno, если вы программируете в Windows на самом деле, но что угодно)

char* arrDayNames[7] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}; // Jeez I hope this works, I haven't done this in ages and it hard without a compiler..
SYSTEMTIME st;
GetLocalTime(&st); // Alternatively use GetSystemTime for the UTC version of the time
printf("The current date and time are: %d/%d/%d %d:%d:%d:%d", st.wDay, st.wMonth, st.wYear, st.wHour, st.wMinute, st.wSecond, st.wMilliseconds);
printf("The day is: %s", arrDayNames[st.wDayOfWeek]);

В любом случае, это ваше решение для Windows. Надеюсь, он когда-нибудь окажется полезным для вас!

Ответ 6

Подробнее об ответе Ори Ошерова

Вы можете использовать WinAPI для получения даты и времени, этот метод специфичен для Windows, но если вы ориентируетесь только на Windows или уже используете WinAPI, то это определенно возможно 1:

Вы можете получить время и дату, используя struct SYSTEMTIME. Вам также нужно вызвать одну из двух функций (GetLocalTime() или GetSystemTime()), чтобы заполнить структуру.

GetLocalTime() предоставит вам время и дату, соответствующие вашему GetLocalTime() поясу.

GetSystemTime() сообщит вам время и дату в формате UTC.

SYSTEMTIME struct имеет следующие элементы:

wYear, wMonth, wDayOfWeek, wDay, wHour, wMinute, wSecond и wMilliseconds

Затем вам нужно просто получить доступ к структуре обычным способом


Фактический пример кода:

#include <windows.h> // use to define SYSTEMTIME , GetLocalTime() and GetSystemTime()
#include <stdio.h> // For printf() (could otherwise use WinAPI equivalent)

int main(void) { // Or any other WinAPI entry point (e.g. WinMain/wmain)

    SYSTEMTIME t; // Declare SYSTEMTIME struct

    GetLocalTime(&t); // Fill out the struct so that it can be used

    // Use GetSystemTime(&t) to get UTC time 

    printf("Year: %d, Month: %d, Day: %d, Hour: %d, Minute:%d, Second: %d, Millisecond: %d", t.wYear, t.wMonth, t.wDay, t.wHour, t.wMinute, t.wSecond, t.wMilliseconds); // Return year, month, day, hour, minute, second and millisecond in that order

    return 0;
}

(Кодировано для простоты и ясности, см. Оригинальный ответ для лучшего формата)

Результат будет примерно таким:

Year: 2018, Month: 11, Day: 24, Hour: 12, Minute:28, Second: 1, Millisecond: 572

Полезные ссылки:

Вся документация WinAPI (большинство уже перечислено выше):

Очень хороший учебник для начинающих по этому вопросу от Zetcode:

Простые операции с datetime в Codeproject:


1: Как упоминалось в комментариях к ответу Ори Ошерова (" Given that OP started with date +%F, they're almost certainly not using Windows. – melpomene Sep 9 at 22:17 "), однако OP не использует Windows так как этот вопрос не имеет специфического для платформы тега (и нигде не упоминается, что ответ должен быть для этой конкретной системы), и является одним из лучших результатов, когда Googling "получает время в c", оба ответа принадлежат здесь, некоторые пользователи ищут Ответ на этот вопрос может быть на Windows и поэтому будет им полезен.

Ответ 7

Я использовал C-компилятор командной строки, чтобы скомпилировать их, и это привело меня в замешательство, так как он отказался компилировать.

По какой-то причине мой компилятор ненавидел то, что я объявлял и использовал функцию в одной строке.

struct tm tm = *localtime(&t);

test.c
test.c(494) : error C2143: syntax error : missing ';' before 'type'
Compiler Status: 512

Сначала объявите вашу переменную, а затем вызовите функцию. Вот как я это сделал.

char   todayDateStr[100];
time_t rawtime;
struct tm *timeinfo;

time ( &rawtime );
timeinfo = localtime ( &rawtime );
strftime(todayDateStr, strlen("DD-MMM-YYYY HH:MM")+1,"%d-%b-%Y %H:%M",timeinfo);
printf("todayDateStr = %s ... \n", todayDateStr );

Ответ 8

вместо файлов использовать каналы, и если u wana использует C, а не С++, вы можете использовать popen, как это

#include<stdlib.h>
#include<stdio.h>

FILE *fp= popen("date +F","r");

и используйте * fp как обычный указатель файла с fgets и всеми

если u wana использует строки С++, fork child, вызовите команду, а затем передайте ее родительскому.

   #include <stdlib.h>
   #include <iostream>
   #include <string>
   using namespace std;

   string currentday;
   int dependPipe[2];

   pipe(dependPipe);// make the pipe

   if(fork()){//parent
           dup2(dependPipe[0],0);//convert parent std input to pipe output
           close(dependPipe[1]);
           getline(cin,currentday);

    } else {//child
        dup2(dependPipe[1],1);//convert child std output to pipe input
        close(dependPipe[0]);

        system("date +%F");
    }

//сделаем аналогичное значение 1 для даты + T, но на самом деле я рекомендую вам придерживаться материала во времени. h GL

Ответ 9

Я получаю следующую ошибку при компиляции кода Адама Розенфилда в Windows. Оказывается, в коде ничего не хватает.

Ошибка (до)

C:\C\Codes>gcc time.c -o time
time.c:3:12: error: initializer element is not constant
 time_t t = time(NULL);
            ^
time.c:4:16: error: initializer element is not constant
 struct tm tm = *localtime(&t);
                ^
time.c:6:8: error: expected declaration specifiers or '...' before string constant
 printf("now: %d-%d-%d %d:%d:%d\n", tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec);
        ^
time.c:6:36: error: expected declaration specifiers or '...' before 'tm'
 printf("now: %d-%d-%d %d:%d:%d\n", tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec);
                                    ^
time.c:6:55: error: expected declaration specifiers or '...' before 'tm'
 printf("now: %d-%d-%d %d:%d:%d\n", tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec);
                                                       ^
time.c:6:70: error: expected declaration specifiers or '...' before 'tm'
 printf("now: %d-%d-%d %d:%d:%d\n", tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec);
                                                                      ^
time.c:6:82: error: expected declaration specifiers or '...' before 'tm'
 printf("now: %d-%d-%d %d:%d:%d\n", tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec);
                                                                                  ^
time.c:6:94: error: expected declaration specifiers or '...' before 'tm'
 printf("now: %d-%d-%d %d:%d:%d\n", tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec);
                                                                                              ^
time.c:6:105: error: expected declaration specifiers or '...' before 'tm'
 printf("now: %d-%d-%d %d:%d:%d\n", tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec);
                                                                                                         ^
C:\C\Codes>

Решение

C:\C\Codes>more time.c
#include <stdio.h>
#include <time.h>

int main()
{
        time_t t = time(NULL);
        struct tm tm = *localtime(&t);

        printf("now: %d-%d-%d %d:%d:%d\n", tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec);
}

C:\C\Codes>

составление

C:\C\Codes>gcc time.c -o time

C:\C\Codes>    

Окончательный вывод

C:\C\Codes>time
now: 2018-3-11 15:46:36

C:\C\Codes>

Я надеюсь, что это тоже поможет другим

Ответ 10

#include<stdio.h>
using namespace std;

int main()
{
printf("%s",__DATE__);
printf("%s",__TIME__);

return 0;
}

Ответ 11

вы можете получить текущую дату и время, используя предопределенные макросы в C, например,   DATE  TIME также вы можете найти текущую дату по-другому. c-forbeginners.blogspot.in, чтобы получить подробную информацию