如何在 OS X Leopard 上的 bash 脚本中进行日期数学运算?

Posted

技术标签:

【中文标题】如何在 OS X Leopard 上的 bash 脚本中进行日期数学运算?【英文标题】:How do I do date math in a bash script on OS X Leopard? 【发布时间】:2009-01-31 05:50:54 【问题描述】:

我意识到我可以编写一个小的 C 或 Ruby 程序来执行此操作,但我希望我的脚本具有尽可能少的依赖项。

鉴于警告,如何在 OS X 上的 bash 脚本中进行日期数学运算?我看过一个帖子(在另一个网站上),有人做了以下事情:

日期 -d "-1 天"

但这似乎不适用于 OS X。

附录:

许多人评论并回应说 Ruby、Python、Perl 等是 OS X 的标准配置。我熟悉所有这三种语言,并且可以轻松编写执行我想要的脚本。事实上,我已经有了这样的脚本,用 Ruby 编写的。

所以也许我应该澄清一下我所说的“外部依赖”是什么意思。我的意思是,我不希望我的 bash 脚本必须调用它外部的任何其他脚本。换句话说,我希望它使用一些在 OS X 的 vanilla 安装中可用并且已经在路径上的实用程序。

但是,这似乎是不可能的,所以我将不得不应付我的外部依赖:一个 Ruby 脚本。

【问题讨论】:

ruby、perl 和 python 都是 OS X 的标准配置,因此您不必担心依赖关系 【参考方案1】:
$ date -v -1d

-d 设置夏令时标志。

尝试 man date 以获取更多信息。

【讨论】:

date -v -1d +%s 在 unix 时间戳中获取它【参考方案2】:

例如,此 OS X 日期命令将在输入字符串 20160826(不是当前时间)中添加 14 天:

date -j -f %Y%m%d -v+14d 20160826 +%Y%m%d

【讨论】:

我需要报价:date -j -f '%Y%m%d' -v+14d 20160826 +%Y%m%d【参考方案3】:

因为MacOS是基于BSD,而不是linux,所以命令其实是:

date -v-1d

调整开关的格式为-v[+/-](number)[ymwdHMS]

【讨论】:

【参考方案4】:

Matthew 提到的命令适用于 Leopard 上的 /bin/date。此外,正如 Schwern 所指出的,如果您确定您的 shell 脚本将在 Mac OS X 上运行,您为什么不想使用 Python 或 Ruby,它们都是 /usr/bin 中的标准配置?这绝不会影响您特定场景中的可移植性。

【讨论】:

【参考方案5】:

我意识到我可以编写一个小的 C 或 Ruby 程序来执行此操作,但我希望我的脚本具有尽可能少的依赖项。

使用 C 或 Ruby 脚本执行将导致更少的依赖性,并且更跨平台。. Bash 脚本只调用各种其他脚本/应用程序,主要是 GNU 实用程序.. 许多命令不可用,或者在其他平台(尤其是在 OS X 和 Linux 之间)采取不同的论点..

默认情况下,Ruby 包含在 OS X Leopard(和 10.4,如果我没记错的话可能是以前的版本)中,如果您使用 Ruby 内置的日期库,它可以在任何平台上始终如一地工作。

当您尝试做任何远程复杂的事情时,您通常最好使用“正确”的脚本语言!

【讨论】:

【参考方案6】:

这是我用来在 google doc 中打印日记日期的脚本:

    #!/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 个新行):

2018 年 4 月 1 日星期日

2018 年 4 月 2 日星期一

2018 年 4 月 3 日星期二

2018 年 4 月 4 日星期三

2018 年 4 月 5 日星期四

2018 年 4 月 6 日星期五

2018 年 4 月 7 日星期六

【讨论】:

【参考方案7】:

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

这两个示例在 Epoch 时间返回。我把那几秒钟变成了我的语言可以正常阅读的东西strptime(seconds, '%s')。 Python Ruby 和 javascript 是我所知道的少数拥有它的。我相信 Java 和所有其他人也会这样做。

gdate 也是 date (GNU coreutils) 它只是在 mac 上调用了不同的东西。奇怪的是在我的另一台 Mac 上,它让我只使用 data 来获得同样的效果。不知道为什么他们最近会改变一些东西。

【讨论】:

【参考方案8】:

我在macOS Mojave 10.14.5上使用了以下,找到DHCP续订时间打开

date -v +`ipconfig getoption en0 renewal_t1_time_value`S

【讨论】:

以上是关于如何在 OS X Leopard 上的 bash 脚本中进行日期数学运算?的主要内容,如果未能解决你的问题,请参考以下文章

Mac OS X Leopard 上的 Emacs 键绑定

Mac OS X Leopard 上的 Emacs 键绑定

Mac OS X Snow Leopard 上的 MOD_WSGI 困难

如何在Mac OS X 10.5 Leopard中刷新DNS

如何在Apple OS X 10.5 Leopard上构建和安装GNU wget

如何在 Mac OS X Snow Leopard 上启用 mysqli?