如何在OS X Leopard的Bash脚本中进行日期计算?

43

我知道我可以编写一个简单的C或Ruby程序来完成这个任务,但我希望我的脚本尽可能地少依赖其他程序。

考虑到这一点,如何在OS X的bash脚本中进行日期计算?我看到过另一个网站上有人这样做:

date -d“-1 day”

但在OS X上似乎无法工作。

补充:

有几个人评论和回答说,Ruby、Python、Perl等语言都是OS X的标准配备。我熟悉这三种语言,可以轻松地编写所需的脚本。事实上,我已经有了一个用Ruby编写的脚本,它可以完成我想要的任务。

因此,也许我应该澄清一下我对“外部依赖”的理解。我指的是,我不希望我的bash脚本调用任何外部脚本。换句话说,我希望它使用某些可在OS X原始安装中使用并已在路径上的实用程序。

然而,看起来这是不可能的,所以我将不得不使用我的外部依赖:一个Ruby脚本。


Ruby、Perl和Python都是OS X的标准配置,因此您不必担心依赖关系。 - Schwern
8个回答

56
$ date -v -1d

-d设置夏令时标志。

尝试man date获取更多信息。


使用命令 date -v -1d +%s 可以将日期转换为 Unix 时间戳。 - oschvr

29
例如,这个OS X日期命令将在输入字符串20160826(而不是当前时间)上添加14天:
date -j -f %Y%m%d -v+14d 20160826 +%Y%m%d

1
"对我来说,引号是必需的:date -j -f'%Y%m%d' -v +14d 20160826 +%Y%m%d" - Yichuan Wang

23

由于 MacOS 是基于 BSD 而不是 Linux,因此命令实际上是:

date -v-1d

adjust开关的格式为-v[+/-](数字)[ymwdHMS]


1

Matthew提到的命令在我Leopard上使用/bin/date很有效。另外,正如Schwern指出的那样,如果你确定你的shell脚本将在Mac OS X上运行,为什么不想使用Python或Ruby呢?它们都是标准的/usr/bin工具。在你特定的场景中,这不会对可移植性产生任何影响。


0
这是我用来在Google文档中打印日记日期的脚本:
    #!/bin/bash

    # ask user for variable details
    read -p 'Starting date in "mm-dd-yyyy" format: ' DATE

    # adjust the count by editing the "x" number in {0..x}
    # 91 days will give you about 3 months, currently set to 6 for testing
    # %a gives short day of the week, -m -d gives single digit months and days, capital Y gives 4 digit year

    for i in {0..6}
    do
         NEXT_DATE=$(date -j -f %m-%d-%Y -v+"$i"d $DATE +'%a %-m/%-d/%y')
         echo -e "$NEXT_DATE\n\n\n"
    done

这是样本输出,(我在每个日期之间使用3个新行):

周日 4/1/18

周一 4/2/18

周二 4/3/18

周三 4/4/18

周四 4/5/18

周五 4/6/18

周六 4/7/18


0

你可能正在寻找这个。 gdate '+%s' -d '2 weeks ago' 或者 gdate '+%s' -d '1 day ago'

这两个示例返回的是时代时间。我将这些秒转换成我的语言可以正常读取的东西 strptime(seconds, '%s')。Python、Ruby 和 Javascript 是我知道有它的几个语言。我相信 Java 和其他所有语言也都有。

此外,gdatedate (GNU coreutils),在 Mac 上只是被称为不同的名称。奇怪的是,在我的另一台 Mac 上,它让我使用 data 来获取相同的偏移量。不知道为什么,可能是他们最近更改了某些内容。


0
我意识到我可以编写一个小的C或Ruby程序来完成这个任务,但我希望我的脚本尽可能少地依赖其他程序。
使用C或Ruby脚本会减少依赖性,并且更具跨平台性。Bash脚本调用各种其他脚本/应用程序,主要是GNU实用程序。许多命令在其他平台上不可用,或者在其他平台上采用不同的参数(特别是在OS X和Linux之间)。
Ruby默认包含在OS X Leopard(以及10.4和可能的早期版本,如果我记得正确的话)中,如果您使用Ruby内置的日期库,它将在任何平台上都能够正常工作。
每当您尝试执行任何复杂操作时,通常最好使用“适当”的脚本语言!

0

我在 macOS Mojave 10.14.5 上使用以下命令来查找 DHCP 续订时间的开放状态

date -v +`ipconfig getoption en0 renewal_t1_time_value`S

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接