如何在带时区的date命令脚本中正确调用变量转换Unix时间戳
问题描述
需将用户输入的日期从Europe/Berlin时区转换为UTC时区的Unix时间戳,固定日期测试时命令正常运行,但读取用户输入的脚本无法正确调用变量执行转换,提示日期无效。
脚本代码:
#!/bin/bash read -p "Datum eingeben: " date datum=$(date -d 'TZ="UTC" $date' +%s) echo $datum
错误信息:
date: invalid date ‘TZ="UTC" $date’
解决方法
问题核心在于单引号的使用——bash中单引号会完全屏蔽变量解析,$date被当成字面字符串而非变量值,同时时区的写法也不符合date命令规范。以下是两种可行的修正方案:
方案1:通过环境变量指定输入时区
将输入日期视为Europe/Berlin时区的时间,临时设置时区后解析并输出UTC时间戳:
#!/bin/bash read -p "Datum eingeben: " input_date # 临时设置时区为Europe/Berlin,解析输入日期后输出UTC时间戳 datum=$(TZ='Europe/Berlin' date -d "$input_date" +%s) echo $datum
方案2:在日期字符串中明确指定输入时区
如果脚本运行环境的默认时区不是Europe/Berlin,推荐用这种方式明确指定输入日期的时区:
#!/bin/bash read -p "Datum eingeben: " input_date # 明确输入日期属于Europe/Berlin时区,转换为UTC时间戳 datum=$(date -d "$input_date Europe/Berlin" +%s) echo $datum
关键注意点
- 必须用双引号包裹变量,确保bash能正确解析变量的实际值
- 时区设置要符合GNU date的语法:要么通过
TZ环境变量指定,要么在日期字符串后附加时区名称 - 避免使用
date -d 'TZ="UTC" ...'这类不符合规范的写法
内容的提问来源于stack exchange,提问作者Zimon
相关产品推荐
相关产品推荐

