Linux touch命令相对时间设置结果异常求助
解决Bash touch命令相对时间调整的异常问题
你遇到的这个问题根源在于**touch -d的日期解析逻辑把带空格的相对时间表达式错误识别成了时区偏移**,导致时间计算完全偏离预期。
问题出在哪?
当你写touch -d '27 May 2022 05:31:12 - 1 hour'时,中间的空格让解析器误以为- 1是UTC-1的时区偏移,而不是“减去1小时”的相对调整。它会把你指定的05:31:12当成UTC-1时区的时间,再转换为你的本地时区(UTC-4),自然就出现了和预期差2小时的结果;同理,+ 1 hour会被识别为UTC+1时区,转换后差了4小时。
正确的写法
调整相对时间的语法,有两种可靠的方式:
- 去掉运算符和数字之间的空格:
# 减1小时 touch -d '27 May 2022 05:31:12 -1 hour' test.txt # 加1小时 touch -d '27 May 2022 05:31:12 +1 hour' test.txt - 把相对调整部分放在日期字符串的最前面:
# 减1小时 touch -d '-1 hour 27 May 2022 05:31:12' test.txt # 加1小时 touch -d '+1 hour 27 May 2022 05:31:12' test.txt
验证一下
用date命令先测试解析结果(touch -d和date -d共享同一解析逻辑):
# 错误写法的结果(识别为时区) $ date -d '27 May 2022 05:31:12 - 1 hour' -R Fri, 27 May 2022 03:31:12 -0400 # 正确写法的结果(相对时间调整) $ date -d '27 May 2022 05:31:12 -1 hour' -R Fri, 27 May 2022 04:31:12 -0400
这个问题是GNU date/touch的解析规则导致的——相对时间运算符和数字之间不能有空格,否则会被优先解析为时区偏移。调整语法后就能得到符合预期的结果了。
内容的提问来源于stack exchange,提问作者keithIHS




