15 Ocak 2018 Pazartesi

std::chrono::system_clock::time_point Sınıfı

Giriş
Bu sınıf basit bir sayaçtan ibaret. Ancak sayacın çözünürlüğü bize açık değil. Örneğin Windows'ta Time Tick sayar. Time Tick 100 nano saniyede bir artar.

Alanlar
clock Alanı- Hangi saatin bu time_point nesnesini ürettiğini belirtir.
Örnek
Şöyle yaparız. Her clock nesnesin kendi ürettiği bir time_point'i std::time_t'ye (yani epoch'tan beri geçen süreye) çevirebilir.
#include <chrono>
#include <filesystem>
#include <iomanip>
#include <iostream>
#include <sstream>

namespace fs = std::filesystem;

int main() {
  fs::file_time_type file_time = fs::last_write_time(__FILE__);
  std::time_t tt = decltype(file_time)::clock::to_time_t(file_time);
  std::tm *gmt = std::gmtime(&tt);
  std::stringstream buffer;
  buffer << std::put_time(gmt, "%A, %d %B %Y %H:%M");
  std::string formattedFileTime = buffer.str();
  std::cout << formattedFileTime << '\n';
}
duration Alanı - time_point nesnesinin epoch'tan beri geçen zamanı hangi tip ile sakladığını belirtir. duration nanosaniye, milisaniye olabilir.

rep Alanı- duration içinde kaç tane tick olduğunu belirtir.

period Alanı- Bir tick'in std::period olarak süresini belirtir.

tanımlama
Şöyle yapabiliriz.
system_clock::time_point time_point = system_clock::now();// no time_point_cast
Ama en kolayı auto ile kullanmak.
auto time_point = system_clock::now(); 
constructor metodu
Örnek ver

max metodu
Şöyle yaparız.
std::chrono::time_point<std::chrono::system_clock>::max();
min metodu
Şöyle yaparız.
std::chrono::time_point<std::chrono::system_clock>::min();
operator += metodu
Örnek ver

operator -= metodu
Örnek ver

time_since_epoch metodu
Bu metod ile time_point nesnesi duration nenesine çevrilir. Böylece count() metodu ile içindeki değere erişebiliriz.
Örnek 1
Şöyle yaparız.
auto now = chrono::system_clock::now();
cout << "now: " << time_point_cast<seconds>(now).time_since_epoch().count();
Çıktı olarak şöyle bir sayı alırız.
now: 2800906746162
Örnek 2
Şöyle yaparız.
using namespace std::chrono;
milliseconds ms = duration_cast< milliseconds >(
    system_clock::now().time_since_epoch()
);

Diğer

time_point_cast metodu
time_point'i belirtilen çözünürlükteki bir başka time_point'e çevirir. Saatin çözünülürlüğü bilinmediği için, time_point'in içindeki sayı bize bir anlam ifade etmez. Bu sayı istediğimiz birime çevrilmelidir.

Örnek - Gün
Şöyle yaparız.
using days = duration<int, ratio<86400>>;
nanoseconds last_midnight =
        time_point_cast<days>(system_clock::now()).time_since_epoch();
cout << last_midnight.count();
Örnek - Saniye
Saatin verdiği time_point nesnesini saniyeye çevirmek için şöyle yaparız.
typedef std::chrono::system_clock Clock;

auto now = Clock::now();
auto seconds = std::chrono::time_point_cast<std::chrono::seconds>(now);
Küsuratlı saniye için şöyle yaparız.
using clock = std::chrono::system_clock;
using dsec = std::chrono::duration<double>;
using tps = std::chrono::time_point<clock, dsec>;
tps tp = clock::now();
Örnek - Milisaniye
Milisaniye için şöyle yaparız.
auto now_ms = std::chrono::time_point_cast<std::chrono::milliseconds>(now);

Hiç yorum yok:

Yorum Gönder