免费注册 查看新帖 |

Chinaunix

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

给出任意的日期,求得给出的日期是周几 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-10-08 14:35 |只看该作者 |倒序浏览
老长时间没发贴了,抛块半头砖

首先,日期格式的判断,日期的长度和数字字符等。
      数字字符的判断可以用awk的match字符函数,但实验时有副作用。
      只好用程序中的笨方法。
其次,就是求日期是周几,利用cal的结果过滤后求得。
最后,屏幕显示所得的结果。

#!/bin/sh
if [ $# -ne 1 ]
then
    echo "usage: $0 date(date of source data)";
    exit -1;
fi

DATA_DATE="$1"
FMT_CODE=`echo $DATA_DATE|awk '{
                                    date_len = length($1)
                                    if (date_len != {
                                        fmt_flag = 1
                                    } else {
                                        fmt_flag=0
                                        for (cnt=1; cnt<date_len+1; cnt++) {
                                            date_number=substr($1,cnt,1)
                                            if ( date_number<"0" ||
                                                 date_number>"9" {
                                                 fmt_flag=2
                                                 break
                                             }
                                        }
                                    }
                                    print fmt_flag
                              }'`;
if [ $FMT_CODE -ne 0 ]
then
    echo "---- Date format error [$FMT_CODE] ";
    exit -2;
else
    echo "---- Date [$DATA_DATE] format ok [$FMT_CODE] ";
fi

Year=`echo $DATA_DATE|awk '{print substr($1,0,4)}'`
Month=`echo $DATA_DATE|awk '{print substr($1,5,2)}' | sed 's/^0//'`
Day=`echo $DATA_DATE|awk '{print substr($1,7,2)}' | sed  's/^0//'`

Week=`cal -m $Month $Year | grep " $Day" |
      sed "s/${Day}.*$/${Day}\ /" |awk -F'|' '{
                                                   print length($1)/3
                                              }'`;
###
echo "--debug-- [$DATA_DATE] --- [$Week] !!!"
###

case $Week in
  1)
    echo "---- 1 Mon.   Monday"
    ;;
  2)
    echo "---- 2 Tues.  Tuesday"
    ;;
  3)
    echo "---- 3 Wed.   Wednesday"
    ;;
  4)
    echo "---- 4 Thurs. Thursday"
    ;;
  5)
    echo "---- 5 Fri.   Friday"
    ;;
  6)
    echo "---- 6 Sat.   Saturday"
    ;;
  7)
    echo "---- 7 Sun.   Sunday"
    ;;
  *)
    echo "---- ERROR!!!"
    ;;
esac

exit 0;

论坛徽章:
0
2 [报告]
发表于 2004-10-08 14:37 |只看该作者

给出任意的日期,求得给出的日期是周几

咦,格式怎么乱了-再发一次
#!/bin/sh
if [ $# -ne 1 ]
then
    echo "usage: $0 date(date of source data)";
    exit -1;
fi

DATA_DATE="$1"
FMT_CODE=`echo $DATA_DATE|awk '{
                                    date_len = length($1)
                                    if (date_len != {
                                        fmt_flag = 1
                                    } else {
                                        fmt_flag=0
                                        for (cnt=1; cnt<date_len+1; cnt++) {
                                            date_number=substr($1,cnt,1)
                                            if ( date_number<"0" ||
                                                 date_number>"9" {
                                                 fmt_flag=2
                                                 break
                                             }
                                        }
                                    }
                                    print fmt_flag
                              }'`;
if [ $FMT_CODE -ne 0 ]
then
    echo "---- Date format error [$FMT_CODE] ";
    exit -2;
else
    echo "---- Date [$DATA_DATE] format ok [$FMT_CODE] ";
fi

Year=`echo $DATA_DATE|awk '{print substr($1,0,4)}'`
Month=`echo $DATA_DATE|awk '{print substr($1,5,2)}' | sed 's/^0//'`
Day=`echo $DATA_DATE|awk '{print substr($1,7,2)}' | sed  's/^0//'`

Week=`cal -m $Month $Year | grep " $Day" |
      sed "s/${Day}.*$/${Day}\ /" |awk -F'|' '{
                                                   print length($1)/3
                                              }'`;
###
echo "--debug-- [$DATA_DATE] --- [$Week] !!!"
###

case $Week in
  1)
    echo "---- 1 Mon.   Monday"
    ;;
  2)
    echo "---- 2 Tues.  Tuesday"
    ;;
  3)
    echo "---- 3 Wed.   Wednesday"
    ;;
  4)
    echo "---- 4 Thurs. Thursday"
    ;;
  5)
    echo "---- 5 Fri.   Friday"
    ;;
  6)
    echo "---- 6 Sat.   Saturday"
    ;;
  7)
    echo "---- 7 Sun.   Sunday"
    ;;
  *)
    echo "---- ERROR!!!"
    ;;
esac

exit 0;

论坛徽章:
0
3 [报告]
发表于 2004-10-08 14:40 |只看该作者

给出任意的日期,求得给出的日期是周几

if (date_len != {

怎么成圆脸了,判断的是长度8

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
4 [报告]
发表于 2004-10-08 15:57 |只看该作者

给出任意的日期,求得给出的日期是周几

若用 gnu date 的話, try:
date -d "2004-01-01" +%w

论坛徽章:
0
5 [报告]
发表于 2004-10-08 16:04 |只看该作者

给出任意的日期,求得给出的日期是周几

是呀,不是有现成的命令吗?

写什么脚本。

论坛徽章:
0
6 [报告]
发表于 2004-10-08 19:19 |只看该作者

给出任意的日期,求得给出的日期是周几


  1. #!/bin/sh
  2. month=`echo $1|awk -F- '{print $2}'`
  3. year=`echo $1|awk -F- '{print $1}'`
  4. date=`echo $1|awk -F- '{print $3}'|sed 's/^0/ /g'`
  5. rm -rf  1.tmp
  6. cal $month $year|tail +2|grep "$date"|tr ' ' '\n'>1.tmp
  7. week=`cat -n 1.tmp |grep $date|awk '{print $1}'`
  8. case $week in
  9.   1) echo "Sunday"
  10.      ;;
  11.   2) echo "Monday"
  12.      ;;
  13.   3) echo "Tuesday"
  14.      ;;
  15.   4) echo "Wednesday"
  16.      ;;
  17.   5) echo "Thursday"
  18.      ;;
  19.   6) echo "Friday"
  20.      ;;
  21.   7) echo "Satday"
  22.      ;;
  23.   esac
  24. rm -rf 1.tmp
复制代码

论坛徽章:
0
7 [报告]
发表于 2004-10-09 10:55 |只看该作者

给出任意的日期,求得给出的日期是周几

小鹭:
您好
您的代码中的两个核心语句好像都有问题,让我们来验证一下。
毕竟技术的东西是比较严谨的。我们探讨一下吧。
我的代码是经过验证的。
第一句的执行如下:
cal $month $year|tail +2|grep "$date"|tr ' ' '\n'>1.tmp
[
$ cal 8 2004|tail +2|grep 8|tr ' ' '\n'

8

9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

]
第二句:
week=`cat -n 1.tmp |grep $date|awk '{print $1}'`

在上一句错的情况下,这里根本得不到结果。

斑竹--網中人的方法中提到的是用 gnu date 的方法
使用简单有效,只要在脚本中加上日期格式的验证就可以了。
date -d "2004-01-01" +%w

       %w     day of week (0..6);  0 represents Sunday

       %W     week number of year with Monday as first day of week (00..53)

论坛徽章:
0
8 [报告]
发表于 2004-10-09 13:02 |只看该作者

给出任意的日期,求得给出的日期是周几

对不起,一时倏忽. 我写的代码有问题.
用 gnu date 效率最高
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP