HP-UX环境Shell脚本中date转Epoch时间遇格式错误的解决方法
HP-UX下获取Epoch时间的解决办法
HP-UX自带的date属于System V版本,不支持+%s格式符,且你只能使用它的-u和-a选项,以下是几种可行的替代方案:
方案1:使用Perl(最便捷)
绝大多数HP-UX环境默认自带Perl,直接执行以下命令即可输出当前Epoch时间:
perl -e 'print time, "\n"'
方案2:用Awk手动计算
如果系统没有Perl,可以结合date -u(获取UTC时间避免时区干扰)和Awk来计算秒数。示例命令如下:
date -u | awk 'BEGIN { m["Jan"]=1; m["Feb"]=2; m["Mar"]=3; m["Apr"]=4; m["May"]=5; m["Jun"]=6; m["Jul"]=7; m["Aug"]=8; m["Sep"]=9; m["Oct"]=10; m["Nov"]=11; m["Dec"]=12 } { year=$6; mon=m[$2]; day=$3; split($4, t, ":"); hour=t[1]; min=t[2]; sec=t[3] # 计算1970到当前年份的闰年总数 leap=int((year-1)/4) - int((year-1)/100) + int((year-1)/400) # 计算总天数 days=(year-1970)*365 + leap # 各月份天数(默认非闰年) md[1]=31; md[2]=28; md[3]=31; md[4]=30; md[5]=31; md[6]=30 md[7]=31; md[8]=31; md[9]=30; md[10]=31; md[11]=30; md[12]=31 # 调整闰年2月天数 if ((year%4==0 && year%100!=0) || year%400==0) md[2]=29 # 累加当前月份之前的所有月份天数 for (i=1; i<mon; i++) days+=md[i] # 加上当月已过的天数(day-1因为1号是第0天) days+=day-1 # 转换为总秒数输出 print days*86400 + hour*3600 + min*60 + sec }'
这段命令会解析date -u的输出,计算从1970-01-01 00:00:00 UTC到当前时间的总秒数,也就是Epoch时间。
方案3:安装GNU Date(若环境允许)
如果你的环境允许安装第三方工具,可以从GNU Coreutils编译安装GNU版本的date,安装后就能直接使用date +%s命令。但如果环境限制只能使用系统自带工具,此方案不适用。
内容的提问来源于stack exchange,提问作者Udit Maheshwari
相关产品推荐
相关产品推荐

