You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:25:30