linux的date命令中周序号问题
linux中的date命令在周序号的计算时,并不符合我对周数的理解。
举例来说,20230101是是周日,而其所在的周序号在linux计算中为第0周,而20230102是周一,它所在的周被计算为第1周。
这与我的理解,20230101是2023的第一个星期,20230102是2023年的第二个星期不符合。
所以我打算写一个脚本来让显示符合我的理解。
直接上代码吧
time=$( date +'%Y-%m-%d %H:%M:%S %N %j' ) ;
weekday=$( date +'%u' ) ;
zone=$( date +'%z' ) ;
# 一年的开始(1月1日)是周一 # 上一年的最后一周是一个满周
if [ "$( date +'%u' -d $( date +'%Y-01-01' ) )" = "1" ] ;
then
weeks=$(( 10#$( date +'%W' ) + 00 )) ;
# 一年的开始(1月1日)不是周一 # 上一年的最后一周不是一个满周,即那一周里有几天是在今年的
else
weeks=$(( 10#$( date +'%W' ) + 01 )) ;
fi
if (( $weeks <= "9" )) ;
then
echo -n ${zone} ${time} "0"${weeks} ${weekday} ;
else
echo -n ${zone} ${time} ${weeks} ${weekday} ;
fi
这样就可以了,
如果直接复制进终端里回车就能看到结果了。
如果你还想在其它程序中调用,就可以把这些内容放进一个纯文本文件里,并在开头的第一行顶格写上#! /bin/sh
,并赋给这个文件以可执行权限就可以了。
例如将脚本放在了 ~/mydate.sh
里
最后的文件内容为:
#! /bin/sh
time=$( date +'%Y-%m-%d %H:%M:%S %N %j' ) ;
weekday=$( date +'%u' ) ;
zone=$( date +'%z' ) ;
# 一年的开始(1月1日)是周一 # 上一年的最后一周是一个满周
if [ "$( date +'%u' -d $( date +'%Y-01-01' ) )" = "1" ] ;
then
weeks=$(( 10#$( date +'%W' ) + 00 )) ;
# 一年的开始(1月1日)不是周一 # 上一年的最后一周不是一个满周,即那一周里有几天是在今年的
else
weeks=$(( 10#$( date +'%W' ) + 01 )) ;
fi
if (( $weeks <= "9" )) ;
then
echo -n ${zone} ${time} "0"${weeks} ${weekday} ;
else
echo -n ${zone} ${time} ${weeks} ${weekday} ;
fi
再给这个文件以可执行权根
chmod +x ~/mydate.sh
这样再使用时直接执行 ~/mydate.sh
就可以了。
本文由 http://www.timeline.menu/article/co/linux的date命令中周序号问题.html 原创,转载时请标明出处。