【问题标题】:Manipulate date in UNIX在 UNIX 中操作日期
【发布时间】:2018-12-23 09:41:13
【问题描述】:

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

【问题讨论】:

  • 您对的定义是什么?从星期一到星期五?周日到周六?
  • @Jens 如果我进入一周的星期三(18-07),我应该能够获得从 16-07 到 22-07 的所有日期。因此,要回答您的问题,可以将其定义为周一至周日
  • 你有-v 选项吗?
  • @Gox 不,这也不起作用:(
  • 在你的AIX系统上,TZ=GMT+48 date +'%d-%m'前天给你了吗?

标签: unix aix


【解决方案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"

【讨论】:

    【解决方案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
    

    这对于闰年、下溢/下溢没有问题,因为它使用了date 的内置知识。

    PS:我刚刚发现我的date(在 FreeBSD 上)从 UTC 获取这些偏移量,而不是系统时区;您应该针对 AIX 进行调查,如果是这样,请根据您的本地时区偏移量相应地调整偏移量到 UTC。

    【讨论】:

    • 我服务器中的 TZ 值为 EST5EDT。我想这是我服务器中的时区设置,即相应的 EST/EDT?请说清楚。如果我希望日期在 EST/EDT 中,我可以将上面的代码更新为 TZ="EST5EDT+$o" date +%d-%m 对于基本问题,我很抱歉,但试图理解 TZ 概念。谢谢您帮助!
    • 看起来,小时偏移量总是相对于 UTC(又名 GMT)。你似乎在东边 5 小时,所以在off 中的值上加上(或减去;这很令人困惑)5 应该可以工作。由于您在 AIX 上,请在此处查找时区信息:ibm.com/developerworks/aix/library/au-aix-posix/index.html
    • 我确实喜欢这个解决方案,但本地时间/UTC 的差异确实会导致问题。简约的 AIX!date 也不能用于任何重要的计算。 (注意:%w 可能比 %A 更好:它返回 0..6,与本地化无关)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-04
    • 1970-01-01
    相关资源
    最近更新 更多