GNU 日期:截断提供的日期时间并设置提供的小时数

GNU 日期:截断提供的日期时间并设置提供的小时数

我的变量中有一个时间戳值,我需要从中截断时间并设置不同的时间。 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

或者在bashshell 中(bash复制的ksh93用于printf %T格式化,但不用于日期解析):

$ printf '%(%a %b %e 10:05:00    %Y)T\n' 1595413447
Wed Jul 22 10:05:00    2020

相关内容