我的变量中有一个时间戳值,我需要从中截断时间并设置不同的时间。 GNU date 可以一次性做到这一点吗?它肯定会针对“今天”、“明天”或“昨天”等特殊日期执行此操作,但我不能让它使用具有任意时间戳的算术:
$ date -d"tomorrow 10:05"
Thu Jul 23 10:05:00 2020
il@mar2 ~
$ date -d"yesterday 10:05"
Tue Jul 21 10:05:00 2020
$ date -d"@1595413447"
Wed Jul 22 13:24:07 2020
il@mar2 ~
$ date -d"@1595413447 10:05"
date: invalid date '@1595413447 10:05'
# desired: Wed Jul 22 10:05:00 2020
答案1
GNUdate
不允许对时间戳进行任何附加规范。
从date
信息文档:
如果在数字前面加上“@”,则它表示以秒数表示的内部时间戳。该数字可以包含内部小数点(“.”或“,”);内部表示不支持的任何多余精度都会被截断为负无穷大。 这样的数字不能与任何其他日期项组合,因为它指定完整的时间戳。
(强调我的)
恐怕你需要两次调用,例如
date -d "$(date -d @1595413447 +'%F 10:05')"
答案2
您始终可以将时间指定为输出格式的一部分:
$ date -d @1595413447 '%a %b %e 10:05:00 %Y'
Wed Jul 22 10:05:00 2020
或者在 shell 中更可移植(避免 GNUdate
依赖)ksh93
:
$ printf '%(%a %b %e 10:05:00 %Y)T\n' '#1595413447'
Wed Jul 22 10:05:00 2020
虽然ksh93
也支持:
$ printf '%(%a %b %e %T %Y)T\n' '#1595413447 10:05'
Wed Jul 22 10:05:00 2020
或者在zsh
外壳中:
$ zmodload zsh/datetime
$ strftime '%a %b %e 10:05:00 %Y' 1595413447
Wed Jul 22 10:05:00 2020
或者在bash
shell 中(bash
复制的ksh93
用于printf %T
格式化,但不用于日期解析):
$ printf '%(%a %b %e 10:05:00 %Y)T\n' 1595413447
Wed Jul 22 10:05:00 2020