两个日期之间以预期格式输出的日期

两个日期之间以预期格式输出的日期

我想要日期输出格式如下...

01/01/2020
02/01/2020
03/01/2020
04/01/2020
05/01/2020
06/01/2020
07/01/2020
08/01/2020
09/01/2020
10/01/2020
11/01/2020
12/01/2020
13/01/2020
14/01/2020
15/01/2020
16/01/2020
17/01/2020
18/01/2020
19/01/2020
20/01/2020
21/01/2020
22/01/2020
23/01/2020
24/01/2020
25/01/2020
26/01/2020
27/01/2020
28/01/2020
29/01/2020
30/01/2020

目前我正在使用...

cal 01 2020 | grep -v "[A-Z][a-z]"| tr ' ' '\n' | sort -n | awk '$1~/[0-9]/ { printf "%02s/%02s/%4s\n",$1,"01","2020"}'

01/01/2017我想要上面的格式31/12/2019。我该怎么做

答案1

#!/bin/bash

timestamp=$( date -d '2017-01-01 12:00' +%s )

while [ "$thedate" != '31/12/2019' ]; do
        printf -v thedate '%(%d/%m/%Y)T' "$timestamp"
        timestamp=$(( timestamp + 86400 ))

        printf '%s\n' "$thedate"
done

上面的脚本首先使用 GNUdate获取开始日期中午的 UNIX 时间戳(它将是1483268400)。然后迭代,直到找到并输出结束日期。在每次迭代中,我们增加timestamp86400 秒(24 小时)。

printf日期字符串是使用 中的内置实用程序生成的bash,该实用程序能够使用其%(...)T格式从 UNIX 时间戳格式化日期时间字符串(这需要bash版本 4.3 或更高版本)。它还直接打印到thedate带有 的变量-v

在某些没有 GNU 的系统上date,您可以使用date另一种格式的命令行参数通过本机实用程序获取开始日期的时间戳。例如,在 OpenBSD 上,它是通过

date -j +%s 201701011200

man date参阅您的特定 Unix。

awk还可以使用一些扩展实现:

awk 'BEGIN { print mktime("2017 01 01 12 00 00") }'

但如果你有这样的awk(GNUawkmawk),那么你不妨在 中完成整个事情awk

awk '
BEGIN {
        timestamp = mktime("2017 01 01 12 00 00")

        while (thedate != "31/12/2019") {
                thedate = strftime("%d/%m/%Y", timestamp)
                timestamp += 86400

                print thedate
        }
}'

答案2

您需要添加一个嵌套的 for 循环,其中包含当年和下个月的第一次迭代。对于每个月,您都会执行已经完成的操作,在 awk 末尾打印月份和年份。

相关内容