在UNIX中处理日期

时间:2018-07-15 19:48:31

标签: unix aix

我想找到一种在UNIX中列出当前星期的所有日期的方法。 例如,如果今天是2018年7月17日,那么如何获取整周的日期16-07、18-07、19-07等?即昨天,明天,后天等。 由于未安装GNU,因此我无法在 date 命令中使用--date / d选项。还有其他命令或用户定义的函数来获取给定的所有日期(当前日期或任何日期)吗?

2 个答案:

答案 0 :(得分:2)

假设您的date可以识别小时数内的TZ偏移量,则此功能适用于当前日期:

#!/bin/sh

case $(date +%A) in
  (Monday)    off="  +0  -24 -48 -72 -96 -120 -144";;
  (Tuesday)   off=" +24   +0 -24 -48 -72  -96 -120";;
  (Wednesday) off=" +48  +24  +0 -24 -48  -72  -96";;
  (Thursday)  off=" +72  +48 +24  +0 -24  -48  -72";;
  (Friday)    off=" +96  +72 +48 +24  +0  -24  -48";;
  (Saturday)  off="+120  +96 +72 +48 +24   +0  -24";;
  (Sunday)    off="+144 +120 +96 +72 +48  +24   +0";;
esac
for o in $off; do
   TZ="$o" date +%d-%m
done

样品运行:

$ date
Sun Jul 15 23:13:43 CEST 2018
$ ./x.sh
09-07
10-07
11-07
12-07
13-07
14-07
15-07

This年,下溢/上溢没有问题,因为它使用了date的内置知识。

PS:我刚刚发现我的date(在FreeBSD上)采用了UTC的偏移量,而不是系统时区的偏移量。您应该针对AIX对此进行调查,如果是这样,请通过将您的本地时区与UTC的时差进行相应调整。

答案 1 :(得分:1)

好吧,现在我认为它需要GNU!date或某种实际的编程语言。例如Perl。

#!/usr/bin/perl

use strict;
use POSIX;

my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst);
my ($w,$ts);

($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = gmtime();

$ENV{'TZ'}='GMT';
POSIX::tzset ();

$ts = POSIX::mktime (0, 0, 0, $mday, $mon, $year);
$ts = $ts - 24*60*60 * $wday;

for ($w= 1; $w<=7; ++$w) {
    ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) =
        gmtime($ts + (24*60*60)*$w);
    printf ("%04d-%02d-%02dn", $year+1900, $mon+1, $mday);
}

如果将其另存为$ HOME / bin / weekdays.pl,则可以在脚本中使用它:

set $(perl ~/bin/weekdays.pl)
echo "Monday is $1"