Дата разработки из периода ISO-8601 в Bash Script - PullRequest
0 голосов
/ 25 октября 2019

У меня есть несколько дат периода ISO-8601, таких как:

a) P7M2D

b) P142D

(a = 7 месяцев 2Дней назад) (b = 142 дня назад)

Я пытаюсь выяснить, есть ли способ использовать сценарий bash (shell), чтобы посмотреть, смогу ли я определить дату из этого. Если сегодня, скажем, 25 октября 2019 , то ответ будет:

a будет: 23 марта 2019

b будет: 5 июня 2019 года

В идеале следует печатать дату в формате гггг / мм / дд.

$> ./script.sh P7M2D
   2019/03/23

$> ./script.sh P142D
   2019/06/05

Интересно, если это проще сделать в Python, не стесняйтесьприведите пример на Python, но я не слишком знаком с Python.

1 Ответ

1 голос
/ 25 октября 2019

Вы можете почти сделать это с обычным bash: bash printf имеет %(date_format)T форматер для strftime даты, заданной значением времени, но bash не имеет никакого способа разбирать строка даты и времени.

Эта версия зависит от даты GNU:

period_ago() {
    if [[ $1 =~ ^P(([0-9]+)M)?([0-9]+)D$ ]]; then
        local months=${BASH_REMATCH[2]:-0}
        local days=${BASH_REMATCH[3]}
        date -d "now - $months months - $days days" "+%Y/%m/%d"
    fi
}

затем

$ period_ago P142D
2019/06/05
$ period_ago P7M2D
2020/05/23

Быстрый просмотр документов Python вызывает у меня ощущениечто это будет трудно сделать в Python: timedelta не предоставляет поле «месяцы» (в конце концов, сколько дней в 7 месяцах?)

Но модуль Perl DateTime (который вам нужно установить) может сделать это:

period_ago_perl() {
    perl -MDateTime -E '
        my $period = shift @ARGV;
        if ($period =~ /^P(?:(\d+)M)?(\d+)D/) {
            say DateTime->now()
                ->subtract(months => ($1 || 0), days => $2)
                ->strftime("%Y/%m/%d")
        }
    ' "$1"
}
$ period_ago_perl P7M2D
2019/03/23
$ period_ago_perl P142D
2019/06/05
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...