19 Ekim 2017 Perşembe

std::chrono::system_clock

Giriş
Şu satır dahil edilir.
#include <chrono>
tanımlama
Chrono için eski derleyiciler ile typdef kullanılır.
typedef std::chrono::system_clock Clock;
Yeni derleyiciler ile using kullanılır.
using Clock = std::chrono::system_clock;
from_time_t metodu
time_point döner.

Örnek
Şöyle yaparız
time_t t = ...;
system_clock::time_point tp = std::chrono::system_clock::from_time_t (t);
Örnek
Şöyle yaparız.
std::tm tm =...;
auto time_point = std::chrono::system_clock::from_time_t(std::mktime(&tm));

now metodu
Bir time_point döndürür. Windows'ta now metodu GetSystemTimeAsFile metodunu kullanır.

time_since_epoch
Bu metod sadece system_clock sınıfında var. Diğer saatlerde yok. Epoch'tan beri geçen süreyi saatin ölçüm birimi cinsinden verir. Saatin birimi nanosaniye de olabilir, milisaniye de. Örnekte epoch'tan beri geçen süre milisaniye ye çevriliyor.
#include <iostream>
#include <chrono>
#include <ctime>

using namespace std::chrono;

int main()
{
  high_resolution_clock::time_point p = high_resolution_clock::now();

  milliseconds ms = duration_cast<milliseconds>(p.time_since_epoch());
  
}
to_time_t metodu
Bu metod static'tir yani state tutmaz sadece verilen değeri time_t yapısına çevirir. Metod sadece system_clock sınıfında var ve amacı C API'si ile beraber çalışabilmeyi sağlamak. Epoch'tan beri geçen süreyi saniye cinsinden verir.
#include <iostream>
#include <chrono>
#include <ctime>

using namespace std::chrono;

int main()
{
  system_clock::time_point p = system_clock::now();

  std::time_t t = system_clock::to_time_t(p);
  std::cout << std::ctime(&t) << std::endl; //Tue Sep 27 14:21:13 2011
}
Saat ve dakika bilgisine kadar sistem saatini yazdırmak için strftime kullanırız. Şöyle yaparız.
void print_date(std::chrono::time_point<std::chrono::system_clock> tp){
  time_t raw_time = system_clock::to_time_t(tp);
  tm* time_info = localtime(&raw_time);

  char date[20] = {};
  strftime(date, 20, "%Y-%m-%d %H:%M", time_info);

  cout << date;
}
Milisaniye için şöyle yaparız.
std::string TimePointToISOString(const time_point<system_clock>& time)
{
  std::time_t rawTime = std::chrono::system_clock::to_time_t(time);
  struct tm timeinfo;
  localtime_s(&timeinfo, &rawTime);

  milliseconds ms = duration_cast<milliseconds>(time.time_since_epoch());
  std::size_t frac_seconds = ms.count() % 1000;

  char buffer[32];
  std::strftime(buffer, 32, "%Y-%m-%dT%H:%M:%SZ", &timeinfo);
  std::string bufferStr(buffer);
  std::stringstream ss;
  ss << bufferStr.substr(0, 19) << "." << std::setw(3) 
     << std::setfill ('0') << frac_seconds << bufferStr.substr(20);

  return ss.str();
}
Aynı şey için std::put_time da kullanılabilir.

Hiç yorum yok:

Yorum Gönder