Bash Shell生成日期范围

Bash Shell生成日期范围,你已经有了一个日期(参考提供默认日期),希望再自动产生另一个日期。

解决方案

GNU date 命令的功能非常强大,用法灵活,但 -d 选项的威力并不为人们所熟知。你的系统可能会将其记录在 getdate 名下(尝试查看 getdate 手册页)。以下是几个示例。

$ date '+%Y-%m-%d %H:%M:%S %z'
2005-11-05 01:03:00 -0500

$ date -d 'today' '+%Y-%m-%d %H:%M:%S %z'
2005-11-05 01:04:39 -0500

$ date -d 'yesterday' '+%Y-%m-%d %H:%M:%S %z'
2005-11-04 01:04:48 -0500

$ date -d 'tomorrow' '+%Y-%m-%d %H:%M:%S %z'
2005-11-06 01:04:55 -0500

$ date -d 'Monday' '+%Y-%m-%d %H:%M:%S %z'
2005-11-07 00:00:00 -0500

$ date -d 'this Monday' '+%Y-%m-%d %H:%M:%S %z'
2005-11-07 00:00:00 -0500

$ date -d 'last Monday' '+%Y-%m-%d %H:%M:%S %z'
2005-10-31 00:00:00 -0500

$ date -d 'next Monday' '+%Y-%m-%d %H:%M:%S %z'
2005-11-07 00:00:00 -0500

$ date -d 'last week' '+%Y-%m-%d %H:%M:%S %z'
2005-10-29 01:05:24 -0400

$ date -d 'next week' '+%Y-%m-%d %H:%M:%S %z'
2005-11-12 01:05:29 -0500

$ date -d '2 weeks' '+%Y-%m-%d %H:%M:%S %z'
2005-11-19 01:05:42 -0500

$ date -d '-2 weeks' '+%Y-%m-%d %H:%M:%S %z'
2005-10-22 01:05:47 -0400

$ date -d '2 weeks ago' '+%Y-%m-%d %H:%M:%S %z'
2005-10-22 01:06:00 -0400

$ date -d '+4 days' '+%Y-%m-%d %H:%M:%S %z'
2005-11-09 01:06:23 -0500

$ date -d '-6 days' '+%Y-%m-%d %H:%M:%S %z'
2005-10-30 01:06:30 -0400

$ date -d '2000-01-01 +12 days' '+%Y-%m-%d %H:%M:%S %z'
2000-01-13 00:00:00 -0500

$ date -d '3 months 1 day' '+%Y-%m-%d %H:%M:%S %z'
2006-02-06 01:03:00 -0500

讨论

-d 选项允许你指定特定的日期,不再使用字符串“now”,但并非所有的 date 命令都支持此选项。GNU 版本没有问题,我们建议你尽一切可能获取并使用该版本。

-d 选项不容易掌握。下列参数都能按照预期工作。

$ date '+%a %Y-%m-%d'
Sat 2005-11-05

$ date -d 'today' '+%a %Y-%m-%d'
Sat 2005-11-05

$ date -d 'Saturday' '+%a %Y-%m-%d'
Sat 2005-11-05

$ date -d 'last Saturday' '+%a %Y-%m-%d'
Sat 2005-10-29

$ date -d 'this Saturday' '+%a %Y-%m-%d'
Sat 2005-11-05

如果你是在周六执行该命令,想看看下周六的日期,但其实得到的还是今天的日期。

但是在译者使用的 Linxu 发行版 CentOS 7(GNU date 版本号 8.22)中并没有出现这种情况。

$ date -d 'next Saturday' '+%a %Y-%m-%d'
Sat 2005-11-05
$

另外还要注意 this week day,因为只要指定的那天已经过去,本周(this week)就会变成 下周(next week)。因此,如果在 2005 年 11 月 5 日周六执行下列命令,你得到的就是以下结果,这可能和你预想的并不一样。

$ date -d 'this week Friday' '+%a %Y-%m-%d'
Fri 2005-11-11

-d 选项非常有用,但一定要全面测试你的代码,并提供相应的错误检查。

如果你手边没有 GNU date 命令可用,Unix Review 杂志 2005 年 9 月刊的“Shell Corner: Date-Related Shell Functions”一文中给出的下列 shell 函数也许能派上用场。

pn_month
  给定月份的前 x 个月和后 x 个月
end_month
  给定月份的月末
pn_day
  给定日期的前 x 天和后 x 天
cur_weekday
  给定日期是星期几
pn_weekday
  给定日期的前 x 天和后 x 天是星期几

在较新的 bash 版本中,下列函数也是可用的。

pn_day_nr
  (非递归)给定日期的前 x 天和后 x 天
days_between
  两个日期之间隔了几天

注意,pn_month、end_month、cur_weekday 独立于其余的函数。但是,pn_day 是在 pn_month 和 end_month 之上构建的,pn_weekday 是在 pn_day 和 cur_weekday 之上构建的。

酷客网相关文章:

赞(0)

评论 抢沙发

评论前必须登录!