Я часто обнаруживаю, что мне нужно переходить от одного типа времени к другому, и я не нашел способ, которым я всегда был бы доволен. Каждый раз, выполняя быстрый поиск в Google, я придумываю разные (иногда до боли сложные) ответы.
Я доволен
date -d "Sep 5 1986" "+%s"
для преобразования стандартной даты во время эпохи, но я не могу заставить работать обратное (и страницы руководства, которые я просматривал, не очень помогают).
date -d "526276800" "+%m/%d/%y"
выдает ошибку при установке RHEL 5.
Может ли сообщество предложить мне несколько стратегий, позволяющих легко конвертировать туда и обратно? Я приму все формы: awk, perl, date. Каковы плюсы и минусы каждого метода?
date -d @ 526276800 "+% m /% d /% y"
На моем компьютере с Mac OS X я использую:
date -r 526276800 +%m/%d/%y
С датой GNU:
date -d '1970-01-01 946684800 секунд'
Или в Ruby:
% ruby -e 'puts Time.now.to_f'
1243620267.8988
% ruby -e 'puts Time.now.to_i'
1243620267
% ruby -e 'puts Time.at 1243620270'
Fri May 29 11:04:30 -0700 2009
% ruby -e 'puts Time.at(1243620270).strftime "at %I:%M%p"'
at 11:04AM
Вот strftime
форматы, взятые из рубина Time
документация класса:
%a - The abbreviated weekday name (``Sun'')
%A - The full weekday name (``Sunday'')
%b - The abbreviated month name (``Jan'')
%B - The full month name (``January'')
%c - The preferred local date and time representation
%d - Day of the month (01..31)
%H - Hour of the day, 24-hour clock (00..23)
%I - Hour of the day, 12-hour clock (01..12)
%j - Day of the year (001..366)
%m - Month of the year (01..12)
%M - Minute of the hour (00..59)
%p - Meridian indicator (``AM'' or ``PM'')
%S - Second of the minute (00..60)
%U - Week number of the current year,
starting with the first Sunday as the first
day of the first week (00..53)
%W - Week number of the current year,
starting with the first Monday as the first
day of the first week (00..53)
%w - Day of the week (Sunday is 0, 0..6)
%x - Preferred representation for the date alone, no time
%X - Preferred representation for the time alone, no date
%y - Year without a century (00..99)
%Y - Year with century
%Z - Time zone name
%% - Literal ``%'' character
$ perl -le 'print scalar localtime 1243620900'
Fri May 29 11:15:00 2009
Это может быть немного сложно, но в Perl есть отличный модуль под названием DateTime, который будет преобразовывать туда и обратно между множеством форматов даты и времени, включая эпоху. Использовать очень просто:
Лично я в качестве альтернативы использую для этого Python и bash. Но поскольку вас это раздражает ;-) Я бы сделал небольшой скрипт, который принимает дату в качестве параметра и записывает его так, чтобы иметь параметры --2epoch и --2normal.
Таким образом, вы можете преобразовать эпоху в нормальную с помощью
./script.sh --2normal 1243609635
и наоборот с
./script --2epoch "20090529 17:07"
Всегда ли дата ввода форматируется одинаково? Это упростило бы написание сценария.
Однострочный Perl:
$ perl -MDate :: Manip -le 'print UnixDate (ParseDateString ("эпоха" .shift ()), "% c")' 946684800
выгружайте временные метки эпох в читаемые формы из стандартного ввода (первый пример) или в виде аргументов (второй пример), и не забывайте о силе strftime!
perl -pe '$_=~s/(\d{10})/scalar localtime($1)/eg'
perl -e '$s=join(" ",@ARGV);$s=~s/(\d{10})/scalar localtime($1)/eg;print"$s\n"'
perl -pe 'use POSIX qw(strftime);s/(\d{10,10})/strftime("%Y%m%d-%H:%M:%S",$1)/eg'
Если у вас установлен модуль Date :: Manip для perl (который по умолчанию обычно ISNT), вы можете использовать:
perl -MDate::Manip -e '$stamp=UnixDate(ParseDate(join(" ",@ARGV)),"%s");printf"%d %s\n",$stamp,scalar localtime($stamp)' sep 9 2006
Иногда трудно решить, хотите ли вы ЗАМЕНИТЬ временные метки в вашем «фильтре» или хотите ли вы поставить перед строкой найденную временную метку. Я переворачиваю его назад и вперед.