【问题标题】:Round down to nearest 5 minutes向下舍入到最接近的 5 分钟
【发布时间】:2012-03-15 10:40:09
【问题描述】:

date 命令返回当前日期。我想要最近的 5 分钟间隔。例如

# date
Thu Mar 15 16:06:42 IST 2012

在这种情况下我想返回......

Mar 15 16:05:00 

可以在 shell 脚本中使用吗?或者是否有任何一种衬里?

更新:

日期是这种格式...

2012-03-10 12:59:59

最新更新:

以下命令按预期工作。感谢您的回复。

head r_SERVER_2012-03-10-12-55-00 | awk -F'^' '{print $7}' |  awk '{split($2, a, ":"); printf "%s %s:%02d:00\n", $1, a[1],int(a[2]/5)*5}'

正确结果:

2012-03-10 12:55:00

但我想显示除日期以外的其他字段。以下方法不起作用:

head r_SERVER_2012-03-10-12-55-00 | awk -F'^' '{print $1, $2, $7, $8}' |  awk '{split($2, a, ":"); printf "%s %s:%02d:00\n", $1, a[1],int(a[2]/5)*5}'

错误的结果:

565 14718:00:00

应该是……

565 123 2012-03-10 12:55:00 country

【问题讨论】:

  • 只是为了好玩,在 PowerShell 中:Get-Date ((([long]((Get-Date '2012-03-10 12:59:59').ticks/3e9))*[long]3e9))
  • 停止向您的问题添加更多内容。我想你是想在聊天室里问这个问题,看看你似乎想要讨论这个问题。

标签: shell date sed awk grep


【解决方案1】:
date | awk '{split($4, a, ":"); printf "%s %s %s:%02d:00", $2, $3, a[1],int(a[2]/5)*5}'

【讨论】:

  • 其实日期是这样的格式..."2012-03-10 12:59:59"。问题中给出的格式只是一个例子。
  • echo "2012-03-10 12:59:59" | awk '{split($2, a, ":"); printf "%s %s:%02d:00", $1, a[1],int(a[2]/5)*5}'
  • 尽管如此,它不会将事情四舍五入到第二天。 2012-03-10 23:59:59 应四舍五入为 2012-03-11 00:00;00
  • @ghoti,它的意思是四舍五入。
  • @ghoti,很抱歉显得粗鲁,但“向下舍入”(在标题中)也意味着“截断”,给出的第二个示例似乎表明截断是所需的功能。
【解决方案2】:
$ date="2012-03-10 12:59:59"
$ read d h m s < <(IFS=:; echo $date)
$ printf -v var "%s %s:%d:00" $d $h $(( m-(m%5) ))
$ echo "$var"
2012-03-10 12:55:00

我在读取命令中使用进程替换来隔离子外壳中对 IFS 的更改。 `

【讨论】:

    【解决方案3】:

    如果你有可用的 GNU AWK,你可以使用这个:

    | gawk '{t=mktime(gensub(/[-:]/," ","g")); print strftime("%Y-%m-%d %H:%M:%S",int(t/5)*5);}'
    

    这使用了int() 函数,它会截断,这意味着“向下舍入”。如果您决定更喜欢“舍入”(即转到“最近的”5 秒增量),请将 int(t/5) 替换为 int((t+2.5)/5)

    当然,如果您感到受虐,您可以在纯 shell 中执行此操作。这只是截断而不是四舍五入。

    [ghoti@pc ~]$ fmt="%Y-%m-%d %H:%M:%S"  
    [ghoti@pc ~]$ date "+$fmt"
    2012-03-15 07:53:37
    [ghoti@pc ~]$ date "+$fmt" | while read date; do stamp="`date -jf \"$fmt\" \"$date\" '+%s'`"; date -r `dc -e "$stamp 5/ 5* p"` "+$fmt"; done
    2012-03-15 07:53:35
    

    请注意,我使用的是 FreeBSD。如果您使用的是 Linux,那么您可能需要为 date 命令使用不同的选项(特别是我认为的 -r 和 -f 选项)。我在 bash 中运行它,但如果你需要的话,它应该在纯 Bourne shell 中工作。

    【讨论】:

      猜你喜欢
      • 2011-01-29
      • 2016-02-26
      • 2013-07-15
      • 2023-03-16
      • 2013-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多