Bash-Scrip中ISO8601期间的编制日期

2024-09-30 22:23:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一些ISO-8601周期日期,例如:

a) P7M2D

b) P142D

(a=7个月2天前)(b=142天前)

我想弄清楚是否有一种方法可以使用bash脚本(shell)来确定日期。如果今天是2019年10月25日,那么答案是:

a日期:2019年3月23日

b日期:2019年6月5日

理想情况下,它应该以yyyy/mm/dd格式打印日期

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

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

不知道用Python是否更容易做到这一点,请随意给出一个Python示例,但我对Python不太熟悉


Tags: 方法答案脚本bashshscript情况iso
1条回答
网友
1楼 · 发布于 2024-09-30 22:23:42

您几乎可以用普通的bash来实现这一点:bash的printf有一个%(date_format)T格式化程序来对给定时间值的日期进行strftime,但是bash没有任何方法来解析一个datetime字符串

此版本取决于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 module(必须安装)可以做到:

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

相关问题 更多 >