我在 Sun OS 中工作,我希望我的脚本从文件中读取日期(格式为 %Y%m%d)并在该日期上添加 1 天

我在 Sun OS 中工作,我希望我的脚本从文件中读取日期(格式为 %Y%m%d)并在该日期上添加 1 天

我在 Sun OS 环境中工作,我想向现有的 unix ksh 脚本添加一个功能,它允许从文件中读取日期(以 %Y%m%d 格式)并添加 1 天并将其重写到该文件中文件。 [请注意:不向当前日期添加日期,而是想向文件中存在的 i/p 日期添加 1 天]。例如:DateFile.dat 20200620 我希望我的脚本在运行结束时将其更改为 20200621。但是,在向保存 i/p 日期的变量添加 1 天时出现错误 我的代码如下:

#!/bin/ksh
ip_dte</home/{file_Path}
echo $ip_dte
dte_add=`TZ=AEST-24 "$ip_dte"`
echo $dte_add

答案1

使用 Perl:

perl -MPOSIX=strftime  -MTime::Local -lne '
    /^(\d{4})(\d{2})(\d{2})$/ or die "Cannot parse time: $_\n";
    ($year, $month, $day) = ($1, $2, $3);
    $time = timelocal 0, 0, 12, $day, $month-1, $year-1900;
    $time += 86400;  # add one day
    print strftime("%Y%m%d", localtime $time);
' datefile

如果安装的 perl 版本是 5.10 或更高版本,您应该能够执行以下操作:

perl -MTime::Piece -MTime::Seconds -lne '
    $fmt = "%Y%m%d";
    $time = Time::Piece->strptime($_, $fmt) or die "Cannot parse time: $_\n";
    $time += ONE_DAY;
    print $time->strftime($fmt);
' datefile

答案2

cal您可以使用日历工具轻松计算明天的日期。这是一个bash函数,但重写它并不困难

tomorrow() {
    local y=$1 m=${2#0} d=${3#0}

    ((++d))
    if cal $m $y | xargs | sed -e 's/$/ X/' -e 's/   */ /g' | grep -v " ${d#0} " >/dev/null
    then
        d=1
        [[ $((++m)) -gt 12 ]] && m=1 && ((++y))
    fi
    printf "%d %d %d\n" $y ${m#0} ${d#0}
}

有了它,就可以很容易地得出明天的日期

# Get today's date into $y $m $d
IFS='-' read -r y m d <<<"2020-06-29"; echo y=$y m=${m#0} d=${d#0}
y=2020 m=6 d=29

tomorrow $y $m $d
2020 6 30

使用任意日期的其他一些示例

tomorrow 2020 6 30
2020 7 1

tomorrow 2020 2 28
2020 2 29

tomorrow 2019 2 28
2019 3 1

这是补充功能

yesterday() {
    local y=$1 m=${2#0} d=${3#0}

    if [[ $((--d)) -eq 0 ]]
    then
        # Go back one month and find the last day
        [[ $((--m)) -eq 0 ]] && ((--y)) && m=12
        d=$(cal ${m#0} $y | xargs | awk '{print $NF}')
    fi
    printf "%d %d %d\n" $y ${m#0} ${d#0}
}

答案3

如果您使用类似 的内容TZ=XXX-24,则它将用作XXX新时区的名称和GMT+24时区偏移量。

如果您想获得您喜欢的时间,例如欧洲夏令时,则需要指定MET-26, 欧洲冬令时MET-25

相关内容