Shell使用Epoch进行日期时间转换和计算的几个小函数 2017-03-31 来源:网络 字号:大 中 小 我要评论 收藏本文
核心代码 当你遇到一个date命令不给力的系统时,可以试试这几个小函数。 #日期转天数 function date2days { echo "$*" | awk '{ z=int((14-$2)/12); y=$1+4800-z; m=$2+12*z-3; j=int((153*m+2)/5)+$3+y*365+int(y/4)-int(y/100)+int(y/400)-2472633; print j }' } date2days `echo "2010-08-18 18:59:19" | sed 's/-/ /g;s/:/ /g'` #天数转日期 function days2date { echo "$1" | awk '{ a=$1+2472632; b=int((4*a+3)/146097); c=int((-b*146097)/4)+a; d=int((4*c+3)/1461); e=int((-1461*d)/4)+c; m=int((5*e+2)/153); dd=-int((153*m+2)/5)+e+1; mm=int(-m/10)*12+m+3; yy=b*100+d-4800+int(m/10); printf ("%4d-%02d-%02d\n",yy,mm,dd) }' } days2date 14839 #日期转分钟 function date2minutes { echo "$*" | awk '{ z=int((14-$2)/12); y=$1+4800-z; m=$2+12*z-3; j=int((153*m+2)/5)+$3+y*365+int(y/4)-int(y/100)+int(y/400)-2472633; j=j*1440+$4*60+$5 print j }' } date2minutes `echo "2010-08-18 18:59:19" | sed 's/-/ /g;s/:/ /g'` #分钟转日期 function minutes2date { echo "$1" | awk '{ i=$1; nn=i%60; i=int(i/60); hh=i%24; dd=int(i/24); i=int(i/24); a=i+2472632; b=int((4*a+3)/146097); c=int((-b*146097)/4)+a; d=int((4*c+3)/1461); e=int((-1461*d)/4)+c; m=int((5*e+2)/153); dd=-int((153*m+2)/5)+e+1; mm=int(-m/10)*12+m+3; yy=b*100+d-4800+int(m/10); printf ("%4d-%02d-%02d %02d:%02d\n",yy,mm,dd,hh,nn) }' } minutes2date 21369299 #日期转秒数 function date2seconds { echo "$*" | awk '{ z=int((14-$2)/12); y=$1+4800-z; m=$2+12*z-3; j=int((153*m+2)/5)+$3+y*365+int(y/4)-int(y/100)+int(y/400)-2472633; j=j*86400+$4*3600+$5*60+$6 print j }' } date2seconds `echo "2010-08-18 18:59:19" | sed 's/-/ /g;s/:/ /g'` #秒数转日期 function seconds2date { echo "$1" | awk '{ i=$1; ss=i%60; i=int(i/60); nn=i%60; i=int(i/60); hh=i%24; dd=int(i/24); i=int(i/24); a=i+2472632; b=int((4*a+3)/146097); c=int((-b*146097)/4)+a; d=int((4*c+3)/1461); e=int((-1461*d)/4)+c; m=int((5*e+2)/153); dd=-int((153*m+2)/5)+e+1; mm=int(-m/10)*12+m+3; yy=b*100+d-4800+int(m/10); printf ("%4d-%02d-%02d %02d:%02d:%02d\n",yy,mm,dd,hh,nn,ss) }' } seconds2date 1282157959 #日期转毫秒 function date2milliseconds { echo "$*" | awk '{ z=int((14-$2)/12); y=$1+4800-z; m=$2+12*z-3; j=int((153*m+2)/5)+$3+y*365+int(y/4)-int(y/100)+int(y/400)-2472633; j=j*86400+$4*3600+$5*60+$6 printf ("%d%s\n",j,$7) }' } date2milliseconds `echo "2010-08-18 18:59:19.073" | sed 's/-/ /g;s/:/ /g;s/\./ /g'` #毫秒转日期 function milliseconds2date { echo "$1" | awk '{ i=$1; ms=i%1000; i=int(i/1000); ss=i%60; i=int(i/60); nn=i%60; i=int(i/60); hh=i%24; dd=int(i/24); i=int(i/24); a=i+2472632; b=int((4*a+3)/146097); c=int((-b*146097)/4)+a; d=int((4*c+3)/1461); e=int((-1461*d)/4)+c; m=int((5*e+2)/153); dd=-int((153*m+2)/5)+e+1; mm=int(-m/10)*12+m+3; yy=b*100+d-4800+int(m/10); printf ("%4d-%02d-%02d %02d:%02d:%02d.%03d\n",yy,mm,dd,hh,nn,ss,ms) }' } milliseconds2date 1282157959073 应用实例: 计算今天的N天之后的日期 #!/bin/bash function date2days { echo "$1 $2 $3" | awk '{ z=int((14-$2)/12); y=$1+4800-z; m=$2+12*z-3; j=int((153*m+2)/5)+$3+y*365+int(y/4)-int(y/100)+int(y/400)-2472633; print j }' } function days2date { echo "$1" | awk '{ a=$1+2472632; b=int((4*a+3)/146097); c=int((-b*146097)/4)+a; d=int((4*c+3)/1461); e=int((-1461*d)/4)+c; m=int((5*e+2)/153); dd=-int((153*m+2)/5)+e+1; mm=int(-m/10)*12+m+3; yy=b*100+d-4800+int(m/10); printf ("%4d%02d%02d\n",yy,mm,dd) }' } year=`date +%Y`; month=`date +%m`; day=`date +%d` days=`date2days $year $month $day` N=5 let days-=$N days2date $days 计算某天的N天之后的日期 #!/bin/bash function date2days { echo "$1 $2 $3" | awk '{ z=int((14-$2)/12); y=$1+4800-z; m=$2+12*z-3; j=int((153*m+2)/5)+$3+y*365+int(y/4)-int(y/100)+int(y/400)-2472633; print j }' } function days2date { echo "$1" | awk '{ a=$1+2472632; b=int((4*a+3)/146097); c=int((-b*146097)/4)+a; d=int((4*c+3)/1461); e=int((-1461*d)/4)+c; m=int((5*e+2)/153); dd=-int((153*m+2)/5)+e+1; mm=int(-m/10)*12+m+3; yy=b*100+d-4800+int(m/10); printf ("%4d%02d%02d\n",yy,mm,dd) }' } year=2010; month=01; day=20 days=`date2days $year $month $day` let days+=5 days2date $days 计算上一个星期的全部日期 #!/bin/bash function date2days { echo "$1 $2 $3" | awk '{ z=int((14-$2)/12); y=$1+4800-z; m=$2+12*z-3; j=int((153*m+2)/5)+$3+y*365+int(y/4)-int(y/100)+int(y/400)-2472633; print j }' } function days2date { echo "$1" | awk '{ a=$1+2472632; b=int((4*a+3)/146097); c=int((-b*146097)/4)+a; d=int((4*c+3)/1461); e=int((-1461*d)/4)+c; m=int((5*e+2)/153); dd=-int((153*m+2)/5)+e+1; mm=int(-m/10)*12+m+3; yy=b*100+d-4800+int(m/10); printf ("%4d%02d%02d\n",yy,mm,dd) }' } function date2week { echo "$1 $2 $3" | awk '{ z=int((14-$2)/12); y=$1+4800-z; m=$2+12*z-3; dow=(int((153*m+2)/5)+$3+y*365+int(y/4)-int(y/100)+int(y/400)-2472629)%7; print dow }' } year=`date +%Y`; month=`date +%m`; day=`date +%d` days=`date2days $year $month $day` week=`date2week $year $month $day` let dateEnd=$days-$week-1 let dateBegin=$dateEnd-6 for ((i=$dateBegin;i<=$dateEnd;i++)); do days2date $i done 日期时间转换成毫秒 function date2milliseconds { echo "$*" | awk '{ z=int((14-$2)/12); y=$1+4800-z; m=$2+12*z-3; j=int((153*m+2)/5)+$3+y*365+int(y/4)-int(y/100)+int(y/400)-2472633; j=j*86400+$4*3600+$5*60+$6 print j$7 }' } date2milliseconds `echo "2010-08-18 18:59:19.073" | /usr/xpg4/bin/awk -F'[:.-]+' '$1=$1'` 日期时间转换成秒 function date2seconds { echo "$*" | awk '{ z=int((14-$2)/12); y=$1+4800-z; m=$2+12*z-3; j=int((153*m+2)/5)+$3+y*365+int(y/4)-int(y/100)+int(y/400)-2472633; j=j*86400+$4*3600+$5*60+$6 print j }' } date2seconds `echo "2010-07-21 00:00:00" | sed 's/-/ /g;s/:/ /g'` 判断一个数字是否为合法日期 function date2days { echo "$*" | awk '{ z=int((14-$2)/12); y=$1+4800-z; m=$2+12*z-3; j=int((153*m+2)/5)+$3+y*365+int(y/4)-int(y/100)+int(y/400)-2472633; print j }' } function days2date { echo "$1" | awk '{ a=$1+2472632; b=int((4*a+3)/146097); c=int((-b*146097)/4)+a; d=int((4*c+3)/1461); e=int((-1461*d)/4)+c; m=int((5*e+2)/153); dd=-int((153*m+2)/5)+e+1; mm=int(-m/10)*12+m+3; yy=b*100+d-4800+int(m/10); printf ("%4d%02d%02d\n",yy,mm,dd) }' } num1=20105050 num2=20101001 arg1=`echo "$num1" | sed -r 's/(....)(..)(..)/\1 \2 \3/g'` arg2=`echo "$num2" | sed -r 's/(....)(..)(..)/\1 \2 \3/g'` days1=`date2days $arg1` date1=`days2date $days1` days2=`date2days $arg2` date2=`days2date $days2` [ "$num1" -eq "$date1" ] && echo "$num1 is valid date" || echo "$num1 is invalid date" [ "$num2" -eq "$date2" ] && echo "$num2 is valid date" || echo "$num2 is invalid date" 计算10分钟之前的时间 function date2minutes { echo "$*" | awk '{ z=int((14-$2)/12); y=$1+4800-z; m=$2+12*z-3; j=int((153*m+2)/5)+$3+y*365+int(y/4)-int(y/100)+int(y/400)-2472633; j=j*1440+$4*60+$5 print j }' } function minutes2date { echo "$1" | awk '{ i=$1; nn=i%60; i=int(i/60); hh=i%24; dd=int(i/24); i=int(i/24); a=i+2472632; b=int((4*a+3)/146097); c=int((-b*146097)/4)+a; d=int((4*c+3)/1461); e=int((-1461*d)/4)+c; m=int((5*e+2)/153); dd=-int((153*m+2)/5)+e+1; mm=int(-m/10)*12+m+3; yy=b*100+d-4800+int(m/10); printf ("%4d-%02d-%02d %02d:%02d\n",yy,mm,dd,hh,nn) }' } now=`date "+%Y-%m-%d %H:%M" | sed 's/-/ /g;s/:/ /g'` minutes=`date2minutes $now` let minutes-=10 minutes2date $minutes 计算指定日期和当前系统日期之家相差多少天 #!/bin/bash function date2days { echo "$*" | awk '{ z=int((14-$2)/12); y=$1+4800-z; m=$2+12*z-3; j=int((153*m+2)/5)+$3+y*365+int(y/4)-int(y/100)+int(y/400)-2472633; print j }' } echo "Enter your date:" read input InpuDays=$(date2days ${input:0:4} ${input:4:2} ${input:6:2}) SysDays=$(date2days `date +"%Y %m %d"`) let result=$InpuDays-$SysDays echo $result #./test.sh Enter your date: 20110605 25 上个星期周一的日期 #!/bin/bash function date2days { echo "$1 $2 $3" | awk '{ z=int((14-$2)/12); y=$1+4800-z; m=$2+12*z-3; j=int((153*m+2)/5)+$3+y*365+int(y/4)-int(y/100)+int(y/400)-2472633; print j }' } function days2date { echo "$1" | awk '{ a=$1+2472632; b=int((4*a+3)/146097); c=int((-b*146097)/4)+a; d=int((4*c+3)/1461); e=int((-1461*d)/4)+c; m=int((5*e+2)/153); dd=-int((153*m+2)/5)+e+1; mm=int(-m/10)*12+m+3; yy=b*100+d-4800+int(m/10); printf ("%4d%02d%02d\n",yy,mm,dd) }' } function date2week { echo "$1 $2 $3" | awk '{ z=int((14-$2)/12); y=$1+4800-z; m=$2+12*z-3; dow=(int((153*m+2)/5)+$3+y*365+int(y/4)-int(y/100)+int(y/400)-2472629)%7; print dow }' } year=`date +%Y`; month=`date +%m`; day=`date +%d` days=`date2days $year $month $day` week=`date2week $year $month $day` let date=$days-$week-7 days2date $date |
相关热词搜索:Epoch日期时间转换
上一篇:Shell脚本切割tomcat的日志文件
下一篇:Linux Shell脚本的编程之正则表达式
看完本文,您的心情是?
分享到:
收藏
评论排行
- ·如何清除DNS缓存 使用命令清理dns缓存方法(2)
- ·Win8.1升级Win10遇到错误代码0xc190010...(1)
- ·Windows RT 8.1 Update 3九月发布 ...(0)
- ·如何将ubuntu安装到U盘实现即插即用(0)
- ·微软否认Xbox One有远程关闭开关(0)
- ·Surface Book详细拆解:千万不要自己动手修(0)
- ·WIN10免费升级正版手册(5分钟读懂WIN10...(0)
- ·你的今日头条账号为什么会被封?(0)
- ·win7电脑怎么翻墙看国外的网站?(0)
- ·shell脚本运行5秒后自动退出的代码(0)
- ·jsp 不支持EL表达式,解决办法(0)
- ·table合并单元格与img图片铺满整个td的html(0)
- ·Mac OS X 系统备份指南(0)
- ·Shell脚本注释写法(0)
- ·windows8激活码、序列号、激活密钥、激...(0)
- ·从一个不错的留言本弄的mysql数据库操作类(0)
- ·PHP漏洞全解(详细介绍)(0)
猜你喜欢
- ·shell命令行参数用法简介
- ·一天一个shell命令 linux文件操作系列-l...
- ·Shell脚本实现的memcached进程监控
- ·win下调用putty执行命令脚本分享
- ·bash shell命令行选项与修传入参数处理
- ·用shell脚本和c语言将大写字母转成小写的代码
- ·shell中函数的应用
- ·a10 config backup for aXAPI
- ·linux中mysql备份shell脚本代码
- ·scp命令详解(全)
- ·Shell 管道及执行顺序分析
- ·linux shell脚本基础知识学习
- ·linux下自动备份MySQL数据并上传到FTP上的...
- ·Shell脚本查看网卡实时流量
- ·Linux进程通信(IPC)方式简介
- ·Shell脚本中实现切换用户并执行命令操作
热门推荐
- ·Shell中的for循环总结
- ·用shell脚本在mysql表中批量插入数据的方法
- ·你可能不知道的Shell(有趣的知识)
- ·bash批量重命名、批量更改后辍的方法
- ·Python创建、删除桌面、启动组快捷方式的例子分享
- ·用shell+sendmail实现服务器监控报警小脚本
- ·Ubuntu下定时提交代码到SVN服务器的Shell脚本分享
- ·用于检测进程的shell脚本代码小结
- ·Shell实现的Oracle启动脚本分享
- ·shell实现字符编码转换工具分享
- ·shell脚本中echo显示内容带颜色的实现方法
- ·常用Linux Shell进阶部分小结
- ·Linux Shell脚本的编程之正则表达式
- ·分享一个实用的iptables脚本(各种过滤写法参考)
- ·实现android自动化测试部署与运行Shell脚本分享
本月排行
最近更新
- ·bash: /usr/bin/autocrorder: /usr/bin/python^M: bad interpreter: No such file or directory
- ·浅谈ubuntu 中sudo update与upgrade的作用及区别
- ·LINUX 查找tomcat日志关键词命令
- ·shell脚本实现同时多台远程主机执行命令的代码分享
- ·Linux在shell中自动生成1到100的数组方法(两种方法)
- ·Linux 中的nc命令小结
- ·linux patch 命令小结(收藏)
- ·nginx 下安装配置 phpadmin报错的解决方法
- ·centos 设置定时任务执行指定脚本的方法
- ·linux 使用NSF 映射远程磁盘目录的实现
- ·linux文件目录默认权限(详解)
- ·复制 Windows cmd 窗口命令行的信息方法
- ·虚拟机中使用linux系启用文件共享之后的文件存在的位置方法
- ·Cygwin下安装vim后,vim中退格键无法正常使用的解决方法
- ·Shell命令行中特殊字符与其转义详解(去除特殊含义)
- ·linux下passwd命令设置修改用户密码的方法
- ·详解shell中>/dev/null 2>&1到底是什么
- ·Linux下Tomcat启动正常,但浏览器无法访问的解决方法
- ·每天一个linux命令 whereis命令
- ·每天一个linux命令 head命令