Как конвертировать из одного формата даты в другой формат?

11

У меня есть одна проблема с моим форматом даты. Я хочу перейти с одного формата на другой и наоборот. Мои форматы даты

Формат 1

YYYY-MM-DD

Формат 2

MM/DD/YYYY

Я хочу изменить формат 1 на формат 2 и формат 2 на формат 1.

AIB
источник
Чтобы быть более понятным, у меня есть файл file1 имя: дата 2000-01-01 2000-01-02 2000-01-03 2000-01-04 .. Требуемый вывод 01 / 01.2000 01/02/2000 01/03 / 2000 01/02/2000 и вице Versal
AIB
Прямая косая черта является одним из двух символов, которые не могут быть в имени * nix-файла ...
evilsoup

Ответы:

14

Используйте GNU 'date' для этого. Он также будет конвертировать между другими форматами для вас (см. date --helpСписок форматов).

$ date -d 2013-07-05 +%m/%d/%Y
07/05/2013
$ date -d 07/05/2013 +%F
2013-07-05
Стефан Шазелас
источник
чтобы быть более понятным, у меня есть файл file1 имя: дата 2000-01-01 2000-01-02 2000-01-03 2000-01-04 .. Требуемый вывод 01 / 01.2000 01/02/2000 01/03 / 2000 01/02/2000 и вице Versal
AIB
1
@ Абрахам, как это не соответствует этому требованию?
Иордания
6

Предполагая, что у вас есть даты в текстовом виде, которые необходимо преобразовать

echo '2013-12-13' | awk -v FS=- -v OFS=/ '{print $2,$3,$1}'

И наоборот

echo '12/13/2013' | awk -v FS=/ -v OFS=- '{print $3,$1,$2}'
Iruvar
источник
чтобы быть более понятным, у меня есть файл file1 имя: дата 2000-01-01 2000-01-02 2000-01-03 2000-01-04 .. Требуемый вывод 01 / 01.2000 01/02/2000 01/03 / 2000 01/02/2000 и вице Versal
AIB
Спасибо 1_CR, теперь он работает после того, как я немного изменил !! #! / bin / bash echo '$ 1- $ 2- $ 3' | awk -v FS = - -v OFS = / '{print $ 2, $ 3, $ 1}' data.file
AiB
@Abraham, ты должен попытать счастья с подходом Дрюбенна date, который, конечно, более элегантен
iruvar
3
$ echo YYYY-MM-DD | { IFS=- read y m d && echo "$m/$d/$y"; }
MM/DD/YYYY

Если у вас есть файл с большим количеством этих дат, по одному в строке:

awk -F- -vOFS=/ '{print $2,$3,$1}' < that-file
Стефан Шазелас
источник
0

Используя sed следующим образом:

$ echo '2013-12-13' | sed -r 's/([[:digit:]]{2,4})-([[:digit:]]{1,2})-([[:digit:]]{1,2})/\2\/\3\/\1/g'
12/13/2013
$ echo '12/13/2013' | sed -r 's/([[:digit:]]{1,2})\/([[:digit:]]{1,2})\/([[:digit:]]{2,4})/\3-\1-\2/g'
2013-12-13
mark_infinite
источник
0

Отвечая на уточненный вопрос в комментариях о том, как изменить формат даты в имени файла, используйте вариант gnu dateподхода Дрюбенна . Эта команда находит все файлы в локальной папке и передает только имя файла xargs, подставляя dateизмененное имя файла в качестве второго аргумента, mvкоторый выполняет переименование.

Дополнительное, слегка контурное использование bashподстановки переменных необходимо при bashоценке dateкоманды.

find ./ -printf '%f\n' | xargs -I '{}' sh -c 'mv $1  $(date -j -f %Y-%m-%d $1 +%m/%d%Y)' -- {} \;
обкрадывать
источник