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);