免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 7212 | 回复: 26
打印 上一主题 下一主题

日期date [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-04-11 11:44 |只看该作者 |倒序浏览
10可用积分
任意给定一个日期,求其上一个周一的日期。
如,指定2009-04-08 ,则其上一个周一的日期是2009-04-06
或如,指定2009-04-06,则其上一个周一的日期是2009-03-30.

不知道有没有简洁方便的参数。
date -d '2009-04-09 last monday' +%Y%m%d  

这样貌似行不通。有熟悉的朋友来指点一下。

论坛徽章:
0
2 [报告]
发表于 2009-04-11 12:26 |只看该作者
用了一种比较笨的方法
---------------------------
#!/bin/sh
if [ $# -ne 1  ]
then
        echo "Usage: $0 YYYYMMDD"
        exit
fi

nowday=`date +%Y%m%d`
nowtime=`date +%H:%M:%S`

i=$1
date -s $1 > /dev/null
echo "last monday is $(date -d last-monday +%Y%m%d)"

date -s $nowday > /dev/null
date -s $nowtime >/dev/null
---------------------------------------------
output:
root@/myshell# ./dat.sh 20090406
last monday is 20090330

论坛徽章:
0
3 [报告]
发表于 2009-04-11 12:55 |只看该作者

回复 #2 deepalley 的帖子

这是不可取的,很可能是没有权限执行date -s 操作的哦。

论坛徽章:
0
4 [报告]
发表于 2009-04-11 13:01 |只看该作者
原帖由 nogroup 于 2009-4-11 12:55 发表
这是不可取的,很可能是没有权限执行date -s 操作的哦。


对,这个要root权限

论坛徽章:
0
5 [报告]
发表于 2009-04-11 13:04 |只看该作者

回复 #2 deepalley 的帖子

不错,这个好用,我还想用case写呢
算了。

论坛徽章:
0
6 [报告]
发表于 2009-04-11 13:17 |只看该作者

回复 #1 nogroup 的帖子

[linuxboy823@fc8 temp]$ cat 1.sh
#/bin/bash
a=`date +%u -d "$1"`
b=`expr $a - 1`
if [ $b -eq 0 ]
then
date -d  "-7  day $1"
else
date -d  "-${b}  day $1"
fi

[linuxboy823@fc8 temp]$ sh 1.sh 20080101
2007年 12月 31日 星期一 00:00:00 CST

[ 本帖最后由 linuxboy823 于 2009-4-11 13:23 编辑 ]

论坛徽章:
0
7 [报告]
发表于 2009-04-11 13:29 |只看该作者
原帖由 linuxboy823 于 2009-4-11 13:17 发表
[linuxboy823@fc8 temp]$ cat 1.sh
#/bin/bash
a=`date +%u -d "$1"`
b=`expr $a - 1`
if [ $b -eq 0 ]
then
date -d  "-7  day $1"
else
date -d  "-${b}  day $1"
fi

[linuxboy823@fc8 temp]$ sh ...

不错不错,想法值得学习^_^

论坛徽章:
0
8 [报告]
发表于 2009-04-11 13:32 |只看该作者
比如4月22日
$ echo $((22-$(date -d '04/22' '+%u')+1))
20

论坛徽章:
0
9 [报告]
发表于 2009-04-11 19:23 |只看该作者

回复 #1 nogroup 的帖子

#!/bin/bash

month=`echo $*|awk -F'-' '{print $2}'|sed '/^0/s/0\([1-9]*\)/\1/g'`

year=`echo $*|awk -F'-' '{print $1}'`

day=`echo $*|awk -F'-' '{print $3}'|sed '/^0/s/0\([1-9]*\)/\1/g'`

if [ $day -gt 7 ];then
  cal=`cal -m $month $year|sed -n "/\<$day\>/p"|awk '{print $1}'`
echo "last monday ls $year-$month-$cal"
  else
#  month=`echo $*|awk -F'-' '{print $2}'|sed '/^0/s/0\([1-9]*\)/\1/g'`
#  year=`echo $*|awk -F'-' '{print $1}'`
#  day=`echo $*|awk -F'-' '{print $3}'|sed '/^0/s/0\([1-9]*\)/\1/g'`
  x=`expr $month - 1`
   cal=`cal -m $x $year|tr -s "\n"|awk  'END{print $1}'`
    echo "last monday ls $year-$x-$cal"
  fi





[W]sh  1 2009-04-06
last monday ls 2009-3-30


[W]sh  1 2009-04-08
last monday ls 2009-4-6

[ 本帖最后由 wtuter 于 2009-4-11 19:45 编辑 ]

论坛徽章:
0
10 [报告]
发表于 2009-04-11 21:00 |只看该作者

回复 #1 nogroup 的帖子

date -d '2009-04-09 last monday' +%Y%m%d  


last monday 是什么意思?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP