Как получить значения даты и времени в программе на Си?
У меня есть что-то вроде этого:
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. Надеюсь, он когда-нибудь окажется полезным для вас!
Ответ 5
В Timespec есть день года.
http://pubs.opengroup.org/onlinepubs/7908799/xsh/time.h.html
#include <time.h>
int get_day_of_year(){
time_t t = time(NULL);
struct tm tm = *localtime(&t);
return tm.tm_yday;
}'
Ответ 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, чтобы получить подробную информацию