shell时间处理

获取当前时间距纪元时间(1970年1月1日)所经过的天数:

      在获取两个时间之间的差值时,需要考虑很多问题,如闰年、月份中不同的天数等。然而如果我们能够确定两个时间点之间天数的差值,那么再计算时分秒的差值时就非常简单了。在系统提供的C语言函数中,获取的时间值是从1970年1月1日0点到当前时间所流经的秒数,如果我们基于此计算两个时间之间天数的差值,将会大大简化我们的计算公式。
      /> cat > test6.sh
      #!/bin/sh
      #1. 将date命令的执行结果(秒 分 小时 日 月 年)赋值给数组变量DATE。
      declare -a DATE=(`date +"%S %M %k %d %m %Y"`)
      #2. 为了提高效率,这个直接给出1970年1月1日到新纪元所流经的天数常量。
      epoch_days=719591
      #3. 从数组中提取各个时间部分值。
      year=${DATE[5]}
      month=${DATE[4]}
      day=${DATE[3]}
      hour=${DATE[2]}
      minute=${DATE[1]}
      second=${DATE[0]}
      #4. 当月份值为1或2的时候,将月份变量的值加一,否则将月份值加13,年变量的值减一,这样做主要是因为后面的公式中取月平均天数时的需要。
      if [ $month -gt 2 ]; then
          month=$((month+1))
      else
          month=$((month+13))
          year=$((year-1))
      fi
      #5. year变量参与的运算是需要考虑闰年问题的,该问题可以自行去google。
      #6. month变量参与的运算主要是考虑月平均天数。
      #7. 计算结果为当前日期距新世纪所流经的天数。
      today_days=$(((year*365)+(year/4)-(year/100)+(year/400)+(month*306001/10000)+day))
      #8. 总天数减去纪元距离新世纪的天数即可得出我们需要的天数了。
      days_since_epoch=$((today_days-epoch_days))
      echo $days_since_epoch
      seconds_since_epoch=$(((days_since_epoch*86400)+(hour*3600)+(minute*60)+second))
      echo $seconds_since_epoch
      CTRL+D
      /> . ./test6.sh
      15310
      1322829080
      需要说明的是,推荐将该脚本的内容放到一个函数中,以便于我们今后计算类似的时间数据时使用。 
posted @ 2012-04-17 10:47  agile_work  阅读(1291)  评论(0编辑  收藏  举报