时间戳及当地时间的转换:
1、概述:
新纪元(epoch):UNIX及Linux的时间系统是由「新纪元时间」Epoch开始计算起,单位为秒,Epoch则是指定为1970年一月一日凌晨零点零分零秒,格林威治时间。
夏时制(Daylight Saving Time:DST):又称“日光节约时制”和“夏令时间”,是一种为节约能源而人为规定地方时间的制度,在这一制度实行期间所采用的统一时间称为“夏令时间”。
一般在天亮早的夏季人为将时间提前一小时,可以使人早起早睡,减少照明量,以充分利用光照资源,从而节约照明用电。
时区:世界按照经度被划分为24个时区;
2、时间两种表示方法:
时间戳:从新纪元开始到当前时间的秒数。
当地年月日时间:组成部分为 年、月、日、时、分、秒、是否是夏时制、当地时区。
简单实例:
由于grep/sed/awk用正则去筛选日志时,如果要精确到小时、分钟、秒,则非常难以实现。
因此,awk提供了mktime()函数,它可以将时间转换成epoch时间值。
mktime函数创建指定时间,转化为时间戳
mktime(“2018 09 09 12 12 20”)
#将 2019-11-10 03:42:40转换成epoch为1970-01-01 00:00:00
[root@localhost ~]# awk ‘BEGIN{print mktime(“2019 11 10 03 42 40”)}’
1573375360
上代码,提取日志中的时间字符串部分,再将他们的年、月、日、时、分、秒都取出来,然后放入mktime()构建成对应的epoch值。因为epoch值是数值,所以可以比较大小,从而决定时间的大小。
下面将strptime2()实现的是将
27/Jul/2023:18:36:30+0800 格式的字符串转换成 epoch 值,然后和 which_time 比较大小,既可以筛选出精确到秒的日志。
BEGIN{
which_time = mktime("2023 07 27 18 36 30")
}
{
match($0,"^.*\\[(.*)\\].*",arr)
tmp_time = strptime2(arr[1])
if(tmp_time > which_time){
print
}
}
function strptime2(str,dt_str,arr,Y,M,D,H,m,S) {
dt_str = gensub("[/:+]"," ","g",str)
# dt_sr = "27 Jul 2023 18 36 30 08 00"
split(dt_str,arr," ")
Y=arr[3]
M=mon_map(arr[2])
D=arr[1]
H=arr[4]
m=arr[5]
S=arr[6]
return mktime(sprintf("%s %s %s %s %s %s",Y,M,D,H,m,S))
}
function mon_map(str,mons){
mons["Jan"]=01
mons["Feb"]=02
mons["Mar"]=03
mons["Apr"]=04
mons["May"]=05
mons["Jun"]=06
mons["Jul"]=07
mons["Aug"]=08
mons["Sep"]=09
mons["Oct"]=10
mons["Nov"]=11
mons["Dec"]=12
return mons[str]
}