3 Mayıs 2016 Salı

strptime

Giriş
Şu satır dahil edilir.
#include <ctime>
formatlı string'i struct tm yapısına çevirir. Yani C#'taki DateTime.ParseExact () metoduna benziyor. Tekrar formatlı string'e çevirmek için strftime kullanılır.

Bu metodun tersini yani struct tm yapısını formatlı string'e çevirme işini strftime yapar.

1. C dili ile strftime ile formatlanan bir string'i tekrar struct tm yapısına çevirmenin bir yolu yok. Ancak POSIX standardı ile gelen strptime bunu başarabiliyor. 
2. C++ ile std::get_time kullanılabilir.

Temel Kullanım
Şöyle kullanırız.
char myDate[] = "2012-01-01";

struct tm result;
char *end = strptime(myDate, "%Y-%m-%d", &result);
Tüm string'in düzgünce parse edildiğini şöyle kontrol ederiz.
if (end != NULL && *end == '\0') {...}

Hata varsa end null değerine eşittir
if (end == NULL)
{
  printf("Invalid date\n");
}
%Y : Yıl - 2016 gibi
%a : Kısa gün ismi - Mon gibi.
%b : Kısa ay ismi - Mar gibi
%d : gün - 15 gibi
%H : Saat - 09 gibi
%M : Dakika - 23 gibi
%S : Milisaniye - 6000000 gibi
%Z : Saat dilimi

Ay/Gün/Yıl için şöyle yapılır
struct tm tm;
strptime("01/26/12", "%m/%d/%y", &tm);
Saat dakika için şöyle yapılır.
std::tm tm = {};
char* snext = ::strptime("2016-Mar-15 09:23:58.665068", "%Y-%b-%d %H:%M:%S", &tm);

Saat Dilimi
Normalde tm yapısı içinde saat dilimi alanı yok. Bu alan bir GNU extension. Dolayısıyla derlerken time.h'tan önce şu #define'ları yapmak gerekiyor. Aslında benim anladığım sadece _GNU_SOURCE tanımlamasını yapmak yeterli.
#define __USE_XOPEN
#define _GNU_SOURCE

#include <time.h>
Ya da derleyiciye bu seçenekleri vermek gerekiyor.
gcc -Wall test.c -o test -D__USE_XOPEN -D_GNU_SOURCE

Anladığım kadarıyla bu metod saat dilimini çevirirken başarılı değil. Saati dilimi için %Z kullanılır.
Açıklaması şöyle
The %Z format specifier only accepts time zone abbreviations of the local time zone, or the value "GMT". This limitation is because of ambiguity due to of the over loading of time zone abbreviations. One such example is EST which is both Eastern Standard Time and Eastern Australia Summer Time.
Dolayısıyla yerel saat dilimi ve GMT dışında başka bir saat dilimi veremiyoruz. Eğer yerel saat dilimimiz EST ise şöyle yaparız.
const char* format =  "%b %d, %Y %H:%M:%S %Z";
const char* myDate = "Feb 19, 2016 01:00:00 EST";

struct tm result = {0};
char* end = strptime(myDate, format, &result);



Hiç yorum yok:

Yorum Gönder