Convert date time string to epoch in Bash
The date time string is in the following format: 06/12/2012 07:21:22. How can I convert it to UNIX timestamp or epoch?
6 Answers 6
What you’re looking for is date —date=’06/12/2012 07:21:22′ +»%s» . Keep in mind that this assumes you’re using GNU coreutils, as both —date and the %s format string are GNU extensions. POSIX doesn’t specify either of those, so there is no portable way of making such conversion even on POSIX compliant systems.
Consult the appropriate manual page for other versions of date .
Note: bash —date and -d option expects the date in US or ISO8601 format, i.e. mm/dd/yyyy or yyyy-mm-dd , not in UK, EU, or any other format.
Note: if you want to specify the time in another timezone (like UTC) add -HHMM or +HHMM to the end. So date —date=’06/12/2012 07:21:22 -0000′ +»%s» converts UTC date to unix time stamp
For GNU date, if you wish to use UTC note that the format is yyyy-mm-dd hh:mm:ss have a look at gnu.org/software/coreutils/manual/html_node/… : gdate —date=’2019-06-18 00:02:00 +0000′ +%s
For Linux, run this command:
For macOS, run this command:
date -jf "%Y-%m-%d %H:%M:%S" "1970-01-01 00:00:00" +%s
On OSX the timestamp increases somehow with the current time. I currently don’t have an explanation for that.
Update: That was because it adjusts the timestamp for my localtime I guess. Adding a -u flag should fix that.
@AbdulRehmanJanjua The -u flag should come before the -f flag, or else the shell interprets it the format string. So, it should be: date -j -u -f «%a. «
A lot of these answers overly complicated and also missing how to use variables. This is how you would do it more simply on standard Linux system (as previously mentioned the date command would have to be adjusted for Mac Users) :
#!/bin/bash orig="Apr 28 07:50:01" epoch=$(date -d "$" +"%s") epoch_to_date=$(date -d @$epoch +%Y%m%d_%H%M%S) echo "RESULTS:" echo "original = $orig" echo "epoch conv = $epoch" echo "epoch to human readable time stamp = $epoch_to_date"
RESULTS: original = Apr 28 07:50:01 epoch conv = 1524916201 epoch to human readable time stamp = 20180428_075001
# -- Converts from human to epoch or epoch to human, specifically "Apr 28 07:50:01" human. # typeset now=$(date +"%s") # typeset now_human_date=$(convert_cron_time "human" "$now") function convert_cron_time() < case "$" in epoch) # human to epoch (eg. "Apr 28 07:50:01" to 1524916201) echo $(date -d "$" +"%s") ;; human) # epoch to human (eg. 1524916201 to "Apr 28 07:50:01") echo $(date -d "@$" +"%b %d %H:%M:%S") ;; esac >
String to linux time
Функция strftime() форматирует время tm
в соответствии с указанным форматом format и помещает результат в символьный массив s размером max .
Обычно символы в строке форматирования копируются в s без преобразований. Символы, определяющие преобразования, предваряются символом `%’, и в s их заменяют следующие символы: %a (аббревиатура названия дня недели в зависимости от текущей локали); %A (полное название дня недели в зависимости от текущей локали); %b (аббревиатура названия месяца в зависимости от текущей локали); %B (полное название месяца в зависимости от текущей локали); %c (предпочтительный формат даты и времени для текущей локали); %C (век (год/100) как целое двухразрядное число (SU)); %d (день месяца в десятичной форме (от 01 до 31)); %D (формат даты в %м/%д/%г (только для американцев, в других странах обычная форма — %д/%м/%г (SU).); %e (то же, что и %d: десятичное число, обозначающее номер дня месяца, но вместо начального нуля ставится пробел (SU)); %E (модификатор: использовать другой формат, см. далее (SU)); %F (эквивалент %Y-%m-%d (формат даты ISO 8601). (C99)) %G (указывает год как четырехзначное число (по стандарту ISO 8601). Имеет тот же формат и значение, что и %y, но если неделя входит также в прошедший (или последующий) год (в соответствии со стандартом ISO о номерах недель), то в этом случае отображается прошедший год (TZ).); %g (то же, что и %G, но без первых двух чисел, то есть двухразрядное число, 00-99 (TZ)); %h (аналогично %b(SU)); %H (показывает час как десятичное число от 00 до 23); %I (показывает час как десятичное число от 01 до 12); %j (показывает день года как десятичное число от 001 до 366); %k (показывает час как десятичное число от 0 до 23; начальные нули заменяются пробелами (см. также %H,(TZ)); %l (показывает час, как десятичное число (от 1 до 12); начальные нули заменяются пробелами (см. также %I (TZ)); %m (показывает месяц как десятичное число от 01 до 12); %M (показывает минуты как десятичное число от 00 до 59); %n (символ новой строки (SU)); %O (модификатор: использовать другой формат, см. далее (SU)); %p (показывает `AM’ или `PM’, в зависимости от времени суток или от соответствующей локали. Полдень обозначен как `pm’, а полночь — как ‘am’.); %P (то же, что и %p, но в нижнем регистре (например, `pm’) (GNU)); %r (сообщает о времени с указанием a.m. или p.m. В локали POSIX это соответствует `%I:%M:%S %p’ (SU).); %R (показывает время в формате 24-х часов (%H:%M). В варианте %T, описанном ниже, указаны еще и секунды (SU).); %s (показывает количество секунд с начала 1970-01-01 00:00:00 UTC (TZ)); %S (отображает секунды в десятичной форме от 00 до 61); %t (символ табуляции (SU)); %T (показывает время в 24-часовом формате %H:%M:%S (SU)); %u (показывает день недели как десятичное число от 1 до 7. Понедельник считается равным 1. См. также %w (SU).); %U (показывает номер недели текущего года в виде десятичного числа от 00 до 53, начиная с первого воскресенья как первого дня первой недели. См. также %V и %W.); %V (по стандарту ISO 8601:1988 номер недели в году отображается в виде десятичного числа (от 01 до 53), где первая неделя — это неделя, минимум 4 дня которой находятся в текущем году. Первым днем недели считается понедельник. См. также %U и %W.); %w (показывает день недели как десятичное число от 0 до 6, и воскресенье считается равным нулю. См. также %u.); %W (показывает номер недели в году как десятичное число от 00 до 53, первый понедельник считается первым днем недели номер 01); %x (показывает дату в формате, указанном в текущей локали, без времени); %X (показывает время в формате, указанном в текущей локали, без даты); %y (показывает год как двухразрядное число от 00 до 99, без указания века); %Y (показывает год как четырехразрядное десятичное число (с указанием века)); %z (показывает часовой пояс как смещение от GMT (Гринвича). Требует совместимости с RFC822 (форматы: «%a, %d %b %Y %H:%M:%S %z» (GNU)); %Z (показывает часовой пояс, или его название, или аббревиатуру); %+ (показывает дату и время в формате date(1)(TZ)); %% (символ `%’);
(некоторые настройки могут иметь модификаторы, которые обозначаются буквами E или O. Если текущая локаль не поддерживает такие модификаторы или если они для нее не существуют, то данные будут представлены в виде, который соответствует указанному формату без модификатора (SU). Единая спецификация Unix имеет такие модификаторы: %Ec, %EC, %Ex, %EX, %Ry, %EY, %Od, %Oe, %OH, %OI, %Om, %OM, %OS, %Ou, %OU, %OV, %Ow, %OW, %Oy, где модификатор O означает использование альтернативных численных символов (например, римские цифры), а модификатор E отражает альтернативное представление, зависящее от текущей локали.
Отформатированный вывод структуры времени tm описан в . Смотрите также ctime (3)).
ВОЗВРАЩАЕМЫЕ ЗНАЧЕНИЯ
Функция strftime() возвращает количество символов в массиве s , не считая завершающие символы NULL. Иначе возвращается 0, а содержимое массива будет неопределенным (версии libc, изданные ранее 4.4.4 (например, libc 4.4.1), возвратят значение max , если массив слишком мал).
Заметьте, что возвращаемое значение 0 не всегда означает ошибку, например, во многих локалях %p представляет собой «пустую» строку.
ПЕРЕМЕННЫЕ ОКРУЖЕНИЯ
СООТВЕТСТВИЕ СТАНДАРТАМ
ANSI C, SVID 3, ISO 9899. Большинство таких настроек поддерживаются ANSI C (не помечены), единой спецификацией Unix (Single Unix Specification (помечена как SU)), пакетом, разграничивающим часовые пояса (Olson’s timezone package (помечены как TZ), glibc (помечена как GNU), кроме %+, которые не поддерживаются glibc2. С другой стороны, glibc2 имеет несколько других расширений и дополнительных настроек. POSIX.1 ссылается только на ANSI C; POSIX.2 описывает на примере date (1) несколько расширений, которые можно применить и к strftime . Формат %F включен в C99 и POSIX 1003.1-2001.
НАЙДЕННЫЕ ОШИБКИ
Некоторые сбойные версии gcc сообщают об использовании %c: внимание: в некоторых локалях `%c’ может содержать только последние 2 цифры года . Естественно, что программисты после этого спокойно используют %c, оно дает нужное им представление даты и времени. А потом появляются странные проблемы в этих gcc. Относительно спокойным решением этой проблемы является создание промежуточной функции size_t my_strftime(char *s, size_t max, const char *fmt, const struct tm *tm)
return strftime(s, max, fmt, tm);
>
How do I convert time from a string format to «Linux Time»?
I need this date to be in «Linux Time» so that I can use it with other functions. Unfortunately, I cannot change the format the date is saved as. How can I convert this to Linux Time?
Note .. i inserting the date to my database as (20/10/2000 2:2:02) so my question is how to convert from (20/10/2000 2:2:02) to linux format
See the MySQL UNIX_TIMESTAMP Function, it does what you’re looking for. The value returned can be used with date() for format it according to your needs.
Yes that exactly what i want .. , how i can use the reterned value from (strtodate function) in date() function ?
1 Answer 1
The PHP function «strtotime» takes a date in a string format (exactly what you have in the database) and converts it to epoch time (which you’ve referred to as linux time)
strtotime() uses american dates (MM/DD/YY) if you use /’s and English dates (DD/MM/YY) if you use dashes — so for you you’d need
This answer should be voteup .. not down , very useful for me ! now i am able to make (3 days ago) time format . but how to get the month name from this date format 20-10-2000 2:2:02
Osama, feel free to accept the answer! (and you’re probably better asking a second question for that one!)
(and the vote down was because the other person answering didn’t like that I’d voted down on their answer and told them that they’d not answered the question. So they voted me down — then deleted their answer. Petty)