Linux поддерживает функцию getdate()
, которая, на мой взгляд, более практична, чем прямой вызов strptime()
. Это связано с тем, что функция getdate()
автоматически проверяет многие форматы. Это эквивалентно вызову strptime()
с различными форматами, пока функция не сработает или все форматы не будут протестированы.
// setenv() should be called only once
setenv("DATEMSK", "/usr/share/myprog/datemsk.fmt", 0);
// convert a date
struct tm * t1(getdate("2018-03-31 14:35:46"));
if(t1 == nullptr) ...handle error...
time_t date1(timegm(t1));
// convert another date
struct tm * t2(getdate("03/31/2018 14:35:46"));
if(t2 == nullptr) ...handle error...
time_t date2(timegm(t2));
Примечание: timegm()
похоже на mktime()
за исключением того, что оно игнорирует локаль и использует UTC. В большинстве случаев это правильный способ конвертировать ваши даты.
Файл datemsk.fmt будет содержать как минимум следующие два формата для поддержки вышеуказанных дат:
%Y-%b-%d %H:%M:%S
%b/%d/%Y %H:%M:%S
Количество поддерживаемых форматов не ограничено, хотя, возможно, вы не захотите иметь их слишком много. Это будет довольно медленно, если у вас слишком много форматов. Вы также можете динамически управлять форматами и вызывать strptime()
в цикле.
Linux также предлагает функцию getdate_r()
, которая является поточно-ориентированной.
Man Page: http://pubs.opengroup.org/onlinepubs/7908799/xsh/getdate.html