В посте про случайные числа рассматривалась функция стандартной библиотеки Си time() . Напомню, что, будучи вызванной с параметром NULL, она возвращает число секунд, прошедших с 01.01.1970. Это — дата основания операционной системы UNIX. Или по крайней мере так принято считать.
Возникает резонный вопрос. Можно ли использовать функцию time() в мирных целях, т.е. для извлечения текущей даты и времени (собственно по ее прямому назначению)?
Смелый программист скажет, что информации о количестве секунд вполне достаточно и минут за 15 изобретет велосипед.
На самом деле все несравненно проще, и в стандартной библиотеке предусмотрено все необходимое для быстрого и счастливого решения нашей задачи.
В частности, функция localtime() преобразует число секунд типа t_time в структуру типа tm , в которой в качестве полей содержатся целочисленные (int) значения секунд, минут, часа, дня, месяца и года (начиная от 1900, т.е. для 2009 года это будет число 109).
tm* localtime(const time_t* timer);
Я УЧИЛ C# НЕДЕЛЮ :3 | Вотб что вышло!
Можно оперировать значениями полей структуры напрямую, но для этого придумана функция asctime() , преобразующая все это дело к читабельному виду типа char* .
char* asctime(const struct tm* timeptr);
using namespace std;
Теперь немного расширим нашу задачу. Пусть нам требуется создать свой собственный формат строки времени, отличный от того, который предоставляет нам функция asctime() .
Приведенная выше программа выводит результат в виде
день_недели месяц день_месяца часы:минуты:секунды год
А мы, к примеру, хотим, чтобы год у нас выводился не последним, а после даты, да еще чтобы это все было разделено запятыми. И название дня недели пусть выводится полное, а не сокращенное.
Тут нам на помощь приходит функция strftime() , представляющая собой квинтэссенцию злого низкоуровневого стиля Си.
size_t strftime (char* ptr, size_t maxsize, const char* format, const tm* timeptr);
Если вкратце, функция формирует по адресу указателя ptr массив символов на основании строки формата, указанной в format , беря численные значения из структуры, на которую указывает указатель timeptr , при этом следя, чтобы уложиться в отведенные для этого maxsize символов. Этот-то итоговый массив символов по адресу ptr и является искомой форматированной строкой даты-времени.
В принципе, пояснений требует только строка формата. Она представляет собой обычную Си-строку, напичканную спецификаторами формата, полный список которых можно оценить здесь. Там же можно насладиться описанием особенностей использования функции strftime() .
Нам понадобятся следующие спецификаторы:
%A — полное название дня недели
%B — полное название месяца
%d — день месяца
%Y — год в виде 4 цифр
%H — час в 24-часовом формате
%M — минуты
%S — секунды
Наша строка (с учетом запятых) примет следующий вид:
Настало время для полноценного примера.
using namespace std;
Лекция 3. Работа с памятью, выполнение программ (Программирование на C++, часть 1)
int main()
<
char buffer[80];
time_t seconds = time(NULL);
tm* timeinfo = localtime(
char* format = «%A, %B %d, %Y %I:%M:%S»;
strftime(buffer, 80, format, timeinfo);
cout cin.get();
return 0;
>
Кстати, если вы вставите в код до вызова функции strftime() строку
то вас ждет приятный сюрприз. Объяснение ему — в определении локали, с которым можно ознакомиться здесь.
Источник: cppstudy.wordpress.com
Clock – интервал времени между событиями
Функция clock может быть использована для определения интервала времени между двумя событиями. Для определения времени в секундах, значение, возвращаемое функцией clock, должно быть поделено на значение макро CLK_TCK.
Возвращаемое значение
Функция clock возвращает время прошедшее с момента начала выполнения программы. Если время процессора недоступно или его значение не может быть интерпретировано, то функция возвращает значение -1.
Переносимость
Совместима с ANSI C.
Пример
#include #include #include int main(void) < clock_t start, end; start = clock(); delay(2000); end = clock(); printf(«The time was: %fn», (end — start) / CLK_TCK); return 0; >
Источник: cubook.pro
std::clock
Возвращает приблизительное время процессора, использованное процессом с начала определенной эпохой реализации, связанной с выполнением программы. Чтобы преобразовать значение результата в секунды, разделите его на CLOCKS_PER_SEC .
std::clock смысл только разница между двумя значениями, возвращаемыми различными вызовами std :: clock , так как начало эры std::clock не обязательно должно совпадать с началом программы. Время std::clock может продвигаться быстрее или медленнее, чем настенные часы, в зависимости от ресурсов выполнения, предоставленных программе операционной системой. Например, если ЦП совместно используется другими процессами, время std::clock может продвигаться медленнее, чем настенные часы. С другой стороны, если текущий процесс является многопоточным и доступно более одного исполнительного ядра, время std::clock может продвигаться быстрее, чем настенные часы.
Parameters
Return value
Время процессора, используемое программой до сих пор, или std::clock_t(-1) , если эта информация недоступна или ее значение не может быть представлено.
Exceptions
Notes
В POSIX-совместимых системах clock_gettime с идентификатором часов CLOCK_PROCESS_CPUTIME_ID предлагает лучшее разрешение.
Значение, возвращаемое функцией clock() , может повторяться в некоторых несоответствующих реализациях. Например, в такой реализации, если std::clock_t является 32-разрядным целым числом со знаком, а CLOCKS_PER_SEC равен 1000000, он будет перенесен примерно через 2147 секунд (около 36 минут).
Example
Этот пример демонстрирует разницу между временем clock() и реальным временем.
#include #include #include #include #include // функция f () выполняет трудоемкую работу void f() < volatile double d = 0; for(int n=0; n10000; ++n) for(int m=0; m10000; ++m) < double diff = d*n*m; d = diff + d; > > int main() < std::clock_t c_start = std::clock(); auto t_start = std::chrono::high_resolution_clock::now(); std::thread t1(f); std::thread t2(f); // f () вызывается в двух потоках t1.join(); t2.join(); std::clock_t c_end = std::clock(); auto t_end = std::chrono::high_resolution_clock::now(); std::cout setprecision(2) «CPU time used: » 1000.0 * (c_end — c_start) / CLOCKS_PER_SEC » msn» «Wall clock time passed: » durationdouble, std::milli>(t_end-t_start).count() » msn»; >
CPU time used: 1590.00 ms Wall clock time passed: 808.23 ms
Источник: runebook.dev