【问题标题】:Date calculation using GNU date使用 GNU 日期计算日期
【发布时间】:2017-06-06 12:55:39
【问题描述】:

使用 GNU 日期命令行实用程序,我知道:

  • 如何从任何给定日期减去 3 天:
    date -d "20110405 -3 days" "+%Y%m%d"
    20110402

  • 如何获取从今天开始的最后一个星期五:
    date -d "last friday" "+%Y%m%d"
    20110408

但我不知道如何获取任何给定日期的最后一个星期五:
date -d "20110405 last friday" "+%Y%m%d"
只需返回给定的日期:
20110405

关于如何做到这一点的任何想法?如果单行不可行,几行脚本也会有所帮助。

【问题讨论】:

    标签: bash date gnu


    【解决方案1】:

    丑,不过一行:

    date -d "20110405 -2 days -$(date -d '20110405' '+%w') days" "+%Y%m%d"

    编辑:见 cmets。

    date -d "20110405 -$(date -d "20110405 +2 days" +%u) days" "+%Y%m%d"
    

    解释:

    • %w 返回星期几。星期五 = 5,因此请多休息 2 天以获得正确的偏移量。
    • 计算结果为“20110405 -x 天”,其中 x 是返回上周五的天数。

    我不喜欢它重复日期字符串,但希望它会有所帮助。

    【讨论】:

    • 您可以省略部分引用:date -d "20100405 -2 days -$(date -d 20100405 +%w) days" +%Y%m%d
    • 嗯,这是一个想法,但它在星期六不起作用:它将在 8 天前的星期五返回。无论如何,我将使用这个技巧并进行一些测试来检查星期几。谢谢。
    • 糟糕,试试这个:date -d "20110405 -$(date -d "20110405 +2 days" +%u) days" "+%Y%m%d"
    【解决方案2】:

    脚本示例(基于接受的答案)

    DT="20170601"
    # get the Friday before $DT
    # expected value is 20170526
    date -d "$DT -`date -d "$DT +2 days" +%u` days" "+%Y%m%d"
    

    更多示例,使用 GNU 日期的未记录功能(来自 unix.com

    # assign a value to the variable DT for the examples below
    DT="2006-10-01 06:55:55"
    echo $DT
    
    # add 2 days, one hour and 5 sec to any date
    date --date "$DT  2 days 1 hour 5 sec"
    
    # subtract from any date
    date --date "$DT 3 days 5 hours 10 sec ago"
    date --date "$DT -3 days -5 hours -10 sec"
    
    # or any mix of +/-. What will be the date in 3 months less 5 days?
    date --date "now +3 months -5 days"
    

    【讨论】:

    • 你救了我的命。谢谢!
    猜你喜欢
    • 2013-09-24
    • 1970-01-01
    • 1970-01-01
    • 2011-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多