在bash中打印本周星期一的日期

43

我想要以“YYYYMMdd”格式获取当前周一的日期,例如今天是20110627。接下来从明天到星期日,我仍然想打印出周一(即今天)的日期。然后下周重新开始这个过程。


想必您需要使用年度周数和$(日期)格式来进行一些数学计算... - Tom Ritter
重新阅读一下,你是在问像“从周一到下周日”的范围吗? - matchew
1
一些Unix系统支持参数“--iso-8601”,可以返回日期格式为“%Y-%m-%d”,这个格式更容易手动扫描查找日期。 - Matthew Schinckel
基本上,date +"%F"可以很好地完成这个任务(补充Metthew Schinckel的评论)。因此,应用到这个问题上,如果你有当前日期为day=$(date +"%F"),那么date -d "$day -$(date -d $day +%u) days + 1 day" +"%F"应该总是给出星期一的日期(或者将%F替换为%Y%m%d以得到所需的格式)。 - RAM237
5个回答

90
#monday
date -dmonday +%Y%m%d

#last monday
date -dlast-monday +%Y%m%d

#next monday
date -dnext-monday +%Y%m%d

#two mondays from now
date -d'monday+14 days' +%Y%m%d

#two mondays ago
date -d'monday-14 days' +%Y%m%d

#although, if you fancy yourself an Abraham Lincolin
date -d'monday-fortnight ago' +%Y%m%d #2 weeks ago
date -d'monday+fortnight' +%Y%m%d #2 weeks from now

#Monday Next Year
date -d'52+monday' +%Y%m%d

#However, Monday Last Year
date -d'52-monday' +%Y%m%d  #DOES NOT  WORK




#you can try a day other than monday
#and format this differently.

如果您需要一个范围,您可能需要做一些事情。

#Tuesday to Sunday
#since today is monday, I'll use Tuesday
echo `date -dtuesday +%Y%m%d-``date -dnext-sunday +%Y%m%d`

这将输出:

20110628-20110703

更多日期格式信息

请注意,此方法仅适用于GNU date

我已经了解到:

Solaris版本的date不能支持-d选项,可以通过替换sunfreeware.com版本的date来解决。


所以它确实可以...很好的发现。我可能只尝试了一次。那么我的机智尝试就这样作罢了。正确的解决方案应该是 date -d'monday-fortnight ago' +%Y%m%d - matchew
6
这些答案都没有准确回答原始问题,“monday” 是未来最近的周一日期(如果今天不是周一),所以这并不能给出本周的周一。本周的周一可以通过略微绕弯的方式得到,即 date -d"next-monday - 1week" - vivi
1
是的,我发现这个解决方案不起作用,但最终选择了 date -d"last-sunday + 1 day" - Panda TG Attwood
这并没有回答问题。为什么它被接受了? - iconoclast
很棒的答案!如何获取从某一年(例如2021年)和某一周数(例如22周)开始的星期一日期? - aborruso
显示剩余2条评论

21

对于没有GNU日期命令(比如我们使用的OS X),我们可以使用“-v”参数。

然后可以这样做:

# Most recent Monday
date -v -Mon

# Output as of this writing
Mon Jun 24 12:35:48 EDT 2013

date -v -Mon "+%Y%m%d"

# Outputs
20130624

如果今天是周一,对于我的情况来说似乎也不是问题,但今天是周四。

# Today's date
date

# Outputs
Thu Jun 27 12:41:39 EDT 2013

# Most recent Thursday
date -v -Thu

# Outputs
Thu Jun 27 12:41:46 EDT 2013

很令人沮丧,GNU日期没有-v选项,因此这个解决方案无法在Mac和Linux上都使用。 - Lloyd Dewolf
3
在Max系统中,你可以通过使用brew install coreutils命令从Homebrew安装GNU date,之后你就可以使用gdate来代替它。请注意,这里不做任何解释或添加其他内容,只进行翻译。 - Ben XO
如果您使用其他逻辑来传递天数,也可以使用+/-天数,这可能会有所帮助,但会使问题更加复杂。 date -v'+2d' "+%Y-%m-%d" 或者从上周二到下周日 echo date -v -Tue "+%Y-%m-%d - "date -v +Sun "+%Y-%m-%d" - tristanbailey

10

尝试使用以下方法来获取当前周一的日期。

wd=`date +%u`; 
let wd=wd-1; 
mon=`date --date="-$wd day" +%Y%m%d`;

5
一句话翻译:mon=$(date -d "$(( $(date +%u) - 1 )) days ago" +%Y%m%d) 的含义是获取上周一的日期并以年月日格式表示。 - glenn jackman
1
我喜欢。从来没有尝试过那种方式烘焙它:总觉得如果试图将所有东西压缩成一行,闪电会劈到我身上。 :) - Femi

9

我认为这实际上回答了所请求的内容:

date -d "next monday - 7 days"

0
如果您想要给定日期之前的星期一,就像一个起始周函数,那么需要更多的工作。这就是我在搜索这个问题时寻找的内容,所以我会在这里添加我的答案。
我试图采用“可重用工具”的方法。
我的“星期一”脚本:
#!/bin/bash
date=${1:-now}
shift
dow=`date +%u -d "$date"`
dow0=$[ $dow - 1 ]
date -d "$date -$dow0 days" "$@"

工作原理:

  • 从第一个命令行参数中获取date -d参数,例如“2020-01-01 -2 weeks”
  • 其他参数将传递给最终的日期命令,例如使用+%F格式化
  • 使用%u(1..7)获取星期几;1代表星期一
  • 减去1,因为我们想要范围在0到6之间。
  • 显示给定日期的日期,减去“星期几”的偏移量

类似的sunday脚本,结果会更简单:

#!/bin/bash
date=${1:-now}
shift
dow=`date +%w -d "$date"`
date -d "$date -$dow days" "$@"

使用方法:

# monday 
Mon Aug 29 02:28:45 PM AEST 2022
# sunday now +%F
2022-08-28
# monday '2022-12-01' +%F
2022-11-28

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