Linux Shell脚本日期转时间戳报错:invalid date
嘿,这个问题我碰到过,date命令对这种非标准的日期格式确实不太友好,我来给你几个可行的解决方案~
问题原因分析
你遇到的报错是因为GNU date 默认不识别这种格式的几个关键点:
- 时分秒用**点(.)**分隔(标准格式是冒号
:) - 末尾的微秒部分(
.812030)会干扰日期解析 - 部分旧版本的
date对PST这类时区缩写的支持也有限
解决方案一:Bash脚本预处理格式
我们可以先把日期字符串转换成date能识别的格式,再进行转换:
#!/bin/bash start_string="30-MAR-18 01.40.04.812030 AM PST" # 1. 把时分秒的点替换成冒号,同时截断微秒部分 formatted_date=$(echo "$start_string" | sed -E 's/([0-9]{2})\.([0-9]{2})\.([0-9]{2})\.[0-9]+/\1:\2:\3/') # 2. 指定PST时区转换为时间戳(秒级) TZ=PST date --date="$formatted_date" "+%s"
如果需要保留微秒精度,可以额外提取微秒并加到秒数后:
#!/bin/bash start_string="30-MAR-18 01.40.04.812030 AM PST" # 提取格式化后的日期部分(去掉微秒) date_part=$(echo "$start_string" | cut -d' ' -f1-2 | sed -E 's/([0-9]{2})\.([0-9]{2})\.([0-9]{2})/\1:\2:\3/') # 提取微秒数值 microsec=$(echo "$start_string" | cut -d'.' -f4 | cut -d' ' -f1) # 转换为秒级时间戳,再加上微秒的小数部分 timestamp=$(TZ=PST date --date="$date_part" "+%s") full_timestamp="$timestamp.$microsec" echo $full_timestamp
解决方案二:用Python直接解析(更省心)
如果你的环境有Python,用datetime模块可以直接解析这种格式,不用手动修改字符串:
from datetime import datetime import pytz # Python3.9+可以用标准库的zoneinfo替代 start_string = "30-MAR-18 01.40.04.812030 AM PST" # 定义匹配格式:%d日-%b月缩写-%y两位年份 %I12小时制小时.%M分钟.%S秒.%f微秒 %pAM/PM %Z时区 dt = datetime.strptime(start_string, "%d-%b-%y %I.%M.%S.%f %p %Z") # 转换为UTC时间戳(带微秒精度) timestamp = dt.timestamp() print(f"带微秒的时间戳:{timestamp}") print(f"整数秒时间戳:{int(timestamp)}")
内容的提问来源于stack exchange,提问作者Guru
相关产品推荐
相关产品推荐

