使用awk转换时间戳字符串为Unix时间戳失败,求助解决方法
用awk转换带微秒的时间戳为Unix时间戳的正确方法
你的命令存在两个核心错误:
- 仅用
$1(日期部分)构造mktime的参数,而mktime要求完整的YYYY MM DD HH MM SS格式,参数不全导致返回错误值; - 试图从
$1中提取毫秒,但$1是日期字符串,根本没有小数点,这部分逻辑完全无效。
下面是正确的处理命令:
方法一:拆分时间各部分处理
echo "2024-04-16 16:32:38.108580" | awk '{ split($2, time_parts, /[.:]/) time_str = gensub(/-/, " ", "g", $1) " " time_parts[1] " " time_parts[2] " " time_parts[3] epoch = mktime(time_str) + time_parts[4]/1000000 print epoch }'
方法二:统一转换分隔符后处理
echo "2024-04-16 16:32:38.108580" | awk '{ full_str = gensub(/[-:]/, " ", "g", $0) split(gensub(/\./, " ", "g", full_str), parts) epoch = mktime(parts[1]" "parts[2]" "parts[3]" "parts[4]" "parts[5]" "parts[6]) + parts[7]/1000000 print epoch }'
说明
mktime函数必须接收年 月 日 时 分 秒格式的字符串,否则会返回错误值;- 原时间字符串的小数部分是微秒,需要除以1000000转换成秒后,加到
mktime返回的整数时间戳上,才能得到精确的Unix时间戳。
内容的提问来源于stack exchange,提问作者user180574
相关产品推荐
相关产品推荐

