26 Aralık 2017 Salı

Time Zone Database Parser kütüphanesi

Giriş
Şu satırı dahil ederiz.
#include "tz.h"
Bu kütüphane Howard Hinnant tarafından geliştirilmiş.

current_zone metodu
time_zone* döner. Windows Time Zone isminden IANA Time Zone ismine çevirir.
Örnek
Şöyle yaparız.
#include "date/tz.h"
#include <iostream>

std::cout << date::current_zone()->name() << '\n';
Çıktı olarak şunu alırız.
America/New_York
format metodu
strftime gibi çalışır. zoned_time nesnesini formatlar.

Örnek
Şöyle yaparız.
date::format("%A", date::make_zoned("Europe/Rome", std::chrono::system_clock::now())
Örnek
Şöyle yaparız.
constexpr auto fmt = "%F %T";
auto cet_time = make_zoned("...", ...);
return format(fmt, cet_time);   
locate_zone metodu
Şöyle yaparız.
int
main(int argc, char **argv)
{
  try
  {
    auto tz = date::locate_zone(argv[1]);
    std::cout << "good timezone " << tz->name() << std::endl;
    
  }
  catch (std::exception const& e)
  {
    std::cout << "bad timezone " << e.what() << std::endl;
  }
}
Çıktı olarak şunu alırız.
good timezone America/New_York
Hata varsa çıktı olarak şunu alırız.
bad timezone America/New_Yor not found in timezone database
make_zoned metodu
Birinci parametre zaman dilimi ismi, ikinci parametre local_time cinsinden nesnedir. zoned_time nesnesi döner.
Örnek
Şöyle yaparız.
std::cout << date::make_zoned("Europe/Rome", std::chrono::system_clock::now()) << '\n';
Çıktı olarak şunu alırız
2017-11-29 16:24:32.710766 CET
Örnek
Şöyle yaparız.
date::sys_seconds my_parse (const std::string& in)
{
  using namespace std;
  using namespace std::chrono;
  using namespace date;
  local_seconds ls;
  istringstream infile{in};
  infile >> parse("%F", ls);
  assert(!infile.fail());
  return make_zoned("America/Los_Angeles", ls + seconds{1}).get_sys_time();
}
Çağırmak için şöyle yaparız.
std::cout << my_parse("2017-05-04").time_since_epoch().count() << '\n';
Çıktı olarak şunu alırız
1493881201
Örnek
Şöyle yaparız.
auto tz = date::locate_zone(argv[1]);
std::cout << "good timezone " << tz->name() << std::endl;
date::local_seconds tp;
std::istringstream in{"2017-09-08 11:30:15"};
in >> date::parse("%Y-%m-%d %H:%M:%S", tp);
auto zt = date::make_zoned(tz, tp);
zoned_time Sınıfı
Saat dilimini bilen saati temsil eder.

Constructor - zone + system_clock
Şöyle yaparız
auto zt = make_zoned(current_zone(), system_clock::now());
Constructor - zone + local_days
Şöyle yaparız
auto zt = make_zoned(current_zone(),
                     local_days{2016_y/oct/5} + 17h + 36min + 27s + 701162us);
Şöyle yaparız
auto zt = make_zoned("Europe/Madrid",
                     local_days{2016_y/oct/5} + 17h + 36min + 27s + 701162us);
Constructor - zone + local_time
İki zaman dilimi arasında çevrim yapar. Şöyle yaparız.
local_time<microseconds> tp = ...;
auto et_time  = make_zoned("America/New_York", tp);
auto cet_time = make_zoned("Europe/Paris", et_time); // 11
get_local_time metodu
Şöyle yaparız.
std::cout << "local_time:      " << az.get_local_time() << '\n';
Çıktı olarak şunu alırız.
local_time:      2016-10-05 17:36:27.701162
get_time_zone metodu
Şöyle yaparız.
std::cout << "Zone " << zt.get_time_zone()->name() << '\n';
Çıktı olarak şunu alırız.
Zone Europe/Madrid
get_sys_time metodu
Örnek
Şöyle yaparız.
std::cout << "utc_time: " << az.get_sys_time() << '\n';
Çıktı olarak şunu alırız.
utc_time:        2016-10-05 15:36:27.701162
Örnek
Şöyle yaparız.
#include "tz.h"
#include <iostream>
#include <sstream>

int
main(int argc, char **argv)
{
  try
  {
    auto tz = date::locate_zone(argv[1]);
    std::cout << "good timezone " << tz->name() << std::endl;
    date::local_seconds tp;
    std::istringstream in{"2017-09-08 11:30:15"};
    in >> date::parse("%Y-%m-%d %H:%M:%S", tp);
    auto zt = date::make_zoned(tz, tp);
    std::cout << date::format("%Y-%m-%d %T %Z which is ", zt);
    std::cout << date::format("%Y-%m-%d %T %Z\n", zt.get_sys_time());
  }
  catch (std::exception const& e)
  {
    std::cout << "bad timezone " << e.what() << std::endl;
  }
}
Çıktı olarak şunu alırız
good timezone America/New_York
2017-09-08 11:30:15 EDT which is 2017-09-08 15:30:15 UTC
Eğer hata varsa çıktı olarak şunu alırız
bad timezone America/New_Yor not found in timezone database
operator << metodu
Nesnesi %F %T %Z olarak formatlar.

Örnek
Şöyle yaparız.
auto et_time  = make_zoned("...", ...);
cout << "et_time  = " << et_time << '\n';

Hiç yorum yok:

Yorum Gönder