如何在 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 Snow Leopard 上的 MOD_WSGI 困难
如何在Mac OS X 10.5 Leopard中刷新DNS