function weekof() {
local year=$2
local week=`echo $1 | sed 's/^0*//'` # Fixes random bug
local dateFormat="+%a %b %d %Y"
# Offset is the day of week, so we can calculate back to monday
local offset="`date -d "$year/01/01 +$((week - 1)) week" "+%u"`"
echo -n "`date -d "$year/01/01 +$((week - 1)) week +$((1 - $offset)) day" "$dateFormat"`" # Monday
echo -n " - "
echo "`date -d "$year/01/01 +$((week - 1)) week +$((7 - $offset)) day" "$dateFormat"`" # Sunday }
6条答案
按热度按时间6yt4nkrj1#
GNU date
:注:
正如OP所提到的,周数是通过
date +%W
得到的。根据GNU date的manual:%W
:一年中的第几周,星期一为第一天(00..53)所以:
1.每一天都从Mon开始。
1.如果Jan 1是Mon,那么 * 第一周将是 week #1。
1.如果Jan 1不是Mon,那么前几天将是 week #0,week #1 从第一个Mon开始。
zhte4eai2#
星期一是一周的第一天,ISO周数:
输出量:
tct7dpnv3#
一切都取决于你使用的周数的定义。
欧洲(ISO 8601)
这个ISO 8601 standard在世界上被广泛使用:欧盟和大多数其他欧洲国家,大多数亚洲和大洋洲
ISO 8601标准规定如下:
有了这个定义,就有可能有一个星期数53。这些发生在一月的第一个星期五(例如。2016-01-01,2010-01-01)。或者,如果前一年是闰年,也是星期六。(例如2005-01-01)
美国或伊斯兰(非ISO 8601)
并非所有国家都采用ISO 8601体系。他们使用更绝对的方法。美国的系统在加拿大、美国、新西兰、印度、日本等国使用。伊斯兰教体系在中东地区普遍使用。这两个系统非常相似。
* 美国:*
有了这个定义,在一年的开始和结束时可以有部分周。因此,一年中的第一周和最后一周不能包含所有的工作日。
* 伊斯兰教:*
有了这个定义,在一年的开始和结束时可以有部分周。因此,一年中的第一周和最后一周不能包含所有的工作日。
**注意:**还有其他定义周数的方法。尽管如此,方法保持不变。
yptwkmov4#
如果有人需要:我找到了一个更短的方法(不确定是否更容易):
我把一年的第一天,向前走n个星期,在正确的一周的某个地方。然后我把我的工作日和回去/前进到周一和周日。
3qpi33ja5#
如果一周的开始是星期日,你可以使用这个版本的weekof:
vybvopom6#
在Python的帮助下,你可以创建简单的Bash转换函数:
其中:
strptime(str, '%G %V %u')
将str转换为日期,%G
-ISO年,%V
-ISO周,%u
-星期几%Y
-年,%W
-周,%u
-星期几strftime('%Y-%m-%d')
-以指定格式打印日期然后它的显式简单使用它,然后:
P.S.当然输出格式可以很容易地通过改变
strftime("%Y-%m-%d")
部分调整