В этом ответе есть несколько полезных советов, предлагающих путь наименьшего сопротивления с использованием таких языков сценариев, как Perl, Python, Ruby и т.д., Которые позволяют смешивать математические операции и операции сопоставления.
Вот быстрый взлом с Perl:
$ echo '2014-12-05 10:00:10, 1234, 2015-02-01 09:12:24' | perl -pe \
's/(\d{4}-\d{2}-\d{2} )(\d{2})(:\d{2}:\d{2})/join("",$1,$2+3,$3)/eg'
2014-12-05 13:00:10, 1234, 2015-02-01 12:12:24
$
В этом упрощенном примере класс цифровых символов (\d
), за которым следует индикатор повторения (например, {2}
), используется для захвата позиционных компонентов даты, и мы слепо выполняем арифметику в поле часа. Этот тип решения подходит только тогда, когда вы знаете свои данные достаточно хорошо, чтобы гарантировать, что упрощенная арифметика в поле часов не приведет к смещению дня.
Пересматривая эту проблему для решения правильной арифметики даты / времени, когда поле часов переполняется, как подсказывает @Lieven, можно использовать основной модуль Perl Time::Piece
(Perl> 5.8):
$ echo '2014-12-05 22:00:00, 1234, 2015-02-01 09:12:24' | \
perl -MTime::Piece -pe \
's/(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2})/( \
Time::Piece->strptime($1, "%Y-%m-%d %T") \
+ (60*60*3))->strftime("%Y-%m-%d %T")/eg'
2014-12-06 01:00:00, 1234, 2015-02-01 12:12:24
$
Входные данные этого примера были обновлены, чтобы показать изящную обработку значений часов, перенесенных на следующий день. Он извлекает модуль Time::Piece
из командной строки, сопоставляет дату и время с входных данных, преобразует их в объекты Time::Piece
для выполнения арифметики даты / времени, а затем переводит обратно в желаемый формат вывода.