К сожалению, как вы видели, gawk просто не может этого сделать напрямую. gawk manual говорит:
Все известные POSIX-совместимые метки времени системы поддержки от 0 до 2^31 - 1, что является достаточным для представления раз через 2038-01-19 3:14:07 UTC. Многие системы поддерживают более широкий диапазон временных меток, включая отрицательные временные метки, которые представляют время до эпохи.
В руководстве не указано, что такое strftime()
, если задана дата выхода на дальность.
Но даже на моей системе, которая делает себя благоразумно для отрицательных значений time_t
, простофиля-х strftime()
функцию не поддерживает (хотя mktime()
делает), и поэтому не может работать с датами до 1970 года, я считаю, что это ошибка, в gawk.
(Мой совет должен был бы использовать Perl вместо Awk, но это не дает ответа на вопрос, который вы просили.)
В принципе, вы можете изобретать колесо заново реализовать функцию как strftime()
в AWK , Но это было бы излишним.
Если в вашей системе имеется команда GNU coreutils date
, вы можете вызвать ее с gawk
. Использование примера 1 января 1960 года:
$ cat 1960.awk
#!/usr/bin/awk -f
BEGIN {
timestamp = mktime("1960 00 00 00 00 00")
print "mktime() returned " timestamp
if (0) {
# This doesn't work
s = strftime("%Y-%m-%d %H:%M:%S", timestamp)
print "strftime() returned ", s
}
else {
# This works
"date '+%Y-%m-%d %H:%M:%S' -d @" timestamp | getline t
print "The date command printed \"" t "\""
}
}
$ ./1960.awk
mktime() returned -318355200
The date command printed "1959-11-30 00:00:00"
$
(. Я отказался от выяснить последовательность цитат и обратные косые черт, необходимых, чтобы сделать это как однострочник из командной строки оболочки)
Это, вероятно, имеет смысл, если у вас есть большая существующая awk-программа, и вам нужно добавить к ней эту функцию. Но если вы не застряли с этим в awk, вы можете подумать об использовании чего-то другого; awk не может быть правильным инструментом для того, что вы пытаетесь выполнить.
Или, если вы действительно амбициозны, вы можете изменить источники gawk
, чтобы правильно обрабатывать этот случай.
У вас есть использовать молоток и долото в их каменные плиты ;-) –
Похоже, что strftime не принимает отрицательное значение для параметра timestamp (second), который представляет ts количество секунд с 1970 01 01 00 00 00 UTC. Время до этого будет иметь отрицательное количество секунд *, так как тогда. – ReluctantBIOSGuy
Вы можете опустить 'echo '" | 'с помощью' awk' BEGIN {...} ' –