способы записи времени в C ++ - PullRequest
0 голосов
/ 24 апреля 2020

Каков наиболее адекватный способ записи времени в C ++ ( не время истекло, а время)

Сейчас я пытаюсь что-то вроде

#include <iostream>
#include <ctime>
#include <ratio>
#include <chrono>

    int main ()
    {

      using namespace std::chrono;
      high_resolution_clock::time_point t1= high_resolution_clock::now();

      time_t tt=system_clock::to_time_t(t1);
      std::cout<<"Right now it is: " << ctime(&tt)<<std::endl;

    }

, но я видите, что это требует (или я неправильно понимаю ??), что мы конвертируем из chrono в C способ синхронизации с to_time, поэтому не исключаем использование chrono?

Обычные примеры, которые я нашел при поиске, относятся к истекшему времени, но меня интересует только время записи, так как я не настолько знаком с C ++ 11

Ответы [ 4 ]

1 голос
/ 24 апреля 2020

Начиная с C ++ 17 std::chrono не имеет средств для простого разложения std::chrono::system_clock::time_point на его каландарную дату и время на настенных часах, кроме преобразования time_point в time_t и использования форматирования даты / времени функциональность, унаследованная от C.

Это возможно , чтобы сделать это, используя только std::chrono, но не просто. Например, что-то вроде этого может получить время настенных часов из std::chrono::system_clock::time_point:

std::string time_of_day(const std::chrono::system_clock::time_point& time_point)
{
    using days = std::chrono::duration<int, std::ratio<86400>>;
    auto midnight = std::chrono::floor<days>(time_point);
    auto time_since_midnight = time_point - midnight;
    auto hours = std::chrono::floor<std::chrono::hours>(time_since_midnight);
    auto minutes = std::chrono::floor<std::chrono::minutes>(time_since_midnight - hours);
    auto seconds = std::chrono::floor<std::chrono::seconds>(time_since_midnight - minutes - hours);

    std::ostringstream oss;
    oss << hours.count() << ":" << std::setw(2) << std::setfill('0') << minutes.count() << ":" << seconds.count();
    return oss.str();
}

int main() {
    std::cout << time_of_day(std::chrono::system_clock::now());
}

Live Demo

Это совсем не просто, и я Конечно, есть угловые случаи, которыми я пренебрегал, но он работает только с использованием std::chrono средств.


C ++ 20 представит несколько способов сделать это более легко. На момент написания ни одна из стандартных реализаций библиотеки не реализовала ни одну из них.


Прежде всего, если вы хотите указать полную дату / время, будет перегружен operator<<(std::ostream&, const std::chrono::system_clock::time_point&) который отформатирует и распечатает это для вас:

int main() {
    std::cout << std::chrono::system_clock::now();
}

Если вам нужна только часть даты или времени time_point, std::chrono::day_month_year, std::chrono::time_of_day, и друзья могут быть использованы для разложения time_point.

Например, вышеуказанная функция time_of_day может быть выполнена намного проще, как это:

std::chrono::time_of_day time_of_day(const std::chrono::sytem_clock::time_point& time_point)
{
    auto midnight = std::chrono::floor<std::chrono::days>(time_point);
    return std::chrono::time_of_day{time_point - midnight};
}

int main() {
    std::cout << time_of_day(std::chrono::system_clock::now());
}

Подробнее см. P3055 .


Другим методом является новое семейство функций std::format. Будет std::formatter специализация для std::chrono::system_clock::time_point, которая позволит вам отформатировать time_point в строку, используя strftime -подобную строку формата. Например, вывод следующего будет очень похож (если не совпадает) с двумя предыдущими time_of_day функциями:

int main() {
    std::cout << std::format("{%T}", std::chrono::system_clock::now());
}

См. P0645 и P1361 для получения дополнительной информации.

1 голос
/ 24 апреля 2020

auto t1 = system_clock::now(); - это исправление

time_point -

template<
    class Clock,
    class Duration = typename Clock::duration
> class time_point;

и system_clock::to_time_t хочет time_point<system_clock> тип, но вы предоставляете совершенно другой тип time_point<high_resolution_clock>

0 голосов
/ 24 апреля 2020

лучший способ производительности:

#include <stdint.h>

uint64_t get_time_us() {
  struct timeval tv {0, 0};
  gettimeofday(&tv, NULL);
  return tv.tv_sec * 1000000 + tv.tv_usec; // microsecond
}
uint64_t t0 = get_time_us();
// do_something
uint64_t t1 = get_time_us();
int time_cost = t1 - t0;

и для C ++ 11:

std::chrono::high_resolution_clock::time_point t1, t2
t1 = std::chrono::high_resolution_clock::now();
// do_something
t2 = std::chrono::high_resolution_clock::now();
int time_ms = std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t1).count(); // ms
// int time_us = std::chrono::duration_cast<std::chrono::microseconds>(t2 - t1).count(); // us

для повышения:

#include <date_time/posix_time/posix_time.hpp>
boost::posix_time::ptime t1(boost::posix_time::microsec_clock::universal_time());
// do_something
boost::posix_time::ptime t2(boost::posix_time::microsec_clock::universal_time());
boost::posix_time::time_duration diff(t2 - t1);
int micro_sec = diff.total_microseconds();
0 голосов
/ 24 апреля 2020

прочитайте примечание по этой ссылке

Примечания

Высокий_резолюция_clock не реализована согласованно в различных реализациях стандартной библиотеки, и его использования следует избегать. Часто это просто псевдоним для std :: chrono :: stable_clock или std :: chrono :: system_clock, но какой это зависит от библиотеки или конфигурации. Когда это системный час, он не монотонный c (например, время может go в обратном направлении). Например, для libstdc ++ g cc это system_clock, для MSV C это stable_clock, а для libc ++ clang это зависит от конфигурации.

Обычно нужно просто использовать std :: chrono :: устойчивый_клок или std :: chrono :: system_clock непосредственно вместо std :: chrono :: high_resolution_clock: используйте устойчивый_клок для измерения длительности и системный_клок для времени настенных часов.

int main()
{
    using namespace std::chrono;
    auto nowTime = std::chrono::system_clock::now();
    auto tt = system_clock::to_time_t(nowTime);
    std::cout << "Right now it is: " << ctime(&tt) << std::endl;
}
...