如何确定每月的星期数


10

在Linux CLI上,是否可以获取每月的星期几?也许还有另一种方法可以通过一个简单的date命令(如)来实现?假设第1至7天是第一周,第8至14天是第二周,依此类推。


您如何定义每月的星期?天数除以7并四舍五入吗?周日/周一/经过多少时间?
mgorven 2012年

假设第一周从1到7天,第二周从7到14,第三周从14到21,第四周从21到月底。我知道日期为nad if的简单bash脚本对此是很好的解决方案,但是我想知道是否可以使用一个命令而不用编写脚本来执行该操作。
B14D3'4

@ B14D3您的“一个月中的一周”的定义非常粗糙-您将其具体用于什么?
voretaq7 2012年

1
我一无所获,我一直在读人间的约会,这在我脑海中浮现(有时我有这么愚蠢的想法)。那么,什么是更好的定义?
B14D3'4

Answers:


21

date命令无法在内部执行此操作,因此您需要一些外部算法。

echo $((($(date +%-d)-1)/7+1))

编辑:在%和d之间添加了减号


那工作正常,但是我不明白为什么这个算术返回整数?
B14D3'4

2
Bash仅执行整数运算。
mgorven 2012年

哇不知道 Thx:D
B14D3'4

4
没错-第29天以上在每月的第5周。
mgorven 2012年

5
抱歉,我不知道如何设置注释的格式,以使其看起来更好。无论如何,要实现一个好主意,但是,如果日期是08或09,则将导致错误:-bash:(09:对于基数而言值太大(错误标记为“ 09”)。那是因为如果数值以0开头,它将由C语言解释为八进制数,因此08 09无效。对我来说,解决方法是将%d更改为%e,%e省略前导0:echo $(((($(date +% e)-1)/ 7 + 1))
2013年

2

您可以使用此:

星期一第一个工作日

WEEKNUMBER=$(( 1 + $(date +%V) - $(date -d "$(date -d "-$(($(date +%d)-1)) days")" +%V) ))

周日冷杉比赛周

WEEKNUMBER=$(( 1 + $(date +%U) - $(date -d "$(date -d "-$(($(date +%d)-1)) days")" +%U) ))


1

简化Victor Sanchez的解决方案:

expr 1 + $(date +%V) - $(date +%V -d $(date +%Y-%m-01))

如果要从星期日开始数周,请用%U替换%V。

顺便说一句:必须使用expr代替$((...)),因为后者似乎不喜欢前导零的数字。


0

如果您在任务中接受外部工具,请尝试使用dateutils。它具有月内发生日期的概念,即2012年4月27日是2012年4月4日(星期五),与您的周定义一致。要获得该号码,请使用:

dconv 2012-04-27 -f %c
=>
  04

%c(计数)是月份中发生次数的格式说明符。或者更酷尝试

dconv today -f '%cth %a in %b %Y'
=>
  1st Wed in Sep 2012
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.