【问题标题】:Get date of last saturday - BusyBox 1.1.0获取上周六的日期 - BusyBox 1.1.0
【发布时间】:2016-08-31 09:38:46
【问题描述】:

由于 BusyBox 中的日期不如 gnu date 强大,所以我无法计算上周六的日期。

last_sat=`date +"%Y-%m-%d" -d "last saturday"`

仅适用于 gnu 日期。

我发现这样的东西可以从 Epoch 计算出来

busybox date -D '%s' -d "$(( `busybox date +%s`+3*60 ))"

但我的 BusyBox (v1.1.0) 无法识别 -D 参数。

有什么建议吗?

【问题讨论】:

    标签: date sh busybox


    【解决方案1】:

    今天之前的最后一个星期六,busybox 1.16 下:

    date -d "UTC 1970-01-01 $(date +"%s - 86400 - %w * 86400"|xargs expr) secs"
    

    工作原理:以秒为单位获取当前日期,减去一天,减去一天乘以当前工作日的数字,然后将这些秒转换回日期。

    编辑:在将 1.1 构建在一起之后,这可以工作:

    date -d "1970.01.01-00:00:$(date +"%s - 86400 - %w * 86400"|xargs expr)"
    

    此工作版本基于代码阅读:

    } else if (t = *tm_time, sscanf(t_string, "%d.%d.%d-%d:%d:%d", &t.tm_year,
                        &t.tm_mon, &t.tm_mday, 
                        &t.tm_hour, &t.tm_min,
                            &t.tm_sec) == 6) {
        t.tm_year -= 1900;  /* Adjust years */
        t.tm_mon -= 1;  /* Adjust dates from 1-12 to 0-11 */
    

    【讨论】:

    • 这适用于我使用 GNU 日期,但不适用于我旧的 busybox 主机中的那个。你运行的是什么版本的busybox?
    • 1.16 是我拥有的最古老的版本,我没有一个无需大量修改即可构建 1.1 的系统。是datexargsexpr 的问题还是外壳的问题?
    • @ghoti 你能再试一次吗?我设法在 OS X 上构建了 1.1(很糟糕),并认为我为你找到了答案。
    • 唉,%F-%T 不是我的busybox date 理解的格式。它似乎接受的唯一格式是MMDDhhmmYYYY.ss。它只理解ss 的前两位数字。我不明白如何使用它来调整日期,只能重新格式化现有日期。
    • 另外,您确定您的date 命令是busybox 中的简化命令,并且您不是偶然运行GNU date 吗?尝试在date 命令的开头添加busybox,并检查date --version 的结果。
    【解决方案2】:

    BusyBox 的日期命令多年来一直是some discussion 的主题。显然,它并不总是像记录的那样工作,而且并不总是与以前的版本一样工作。

    在我管理的运行 BusyBox v1.01 的 BB 系统上,我可以使用 -d 选项和 MMDDhhmmYYYY.ss 格式的日期,而我没有尝试过其他格式。幸运的是,输出格式按预期工作,大概是因为date 根据comments in the source 使用了正确的strftime()

    这是我的正反示例:

    [~] # busybox date '+%m%d%H%M%Y.%S'
    090500152016.41
    [~] # busybox date -d 090500152016.41
    Mon Sep  5 00:15:41 EDT 2016
    

    那么..我们可以用这个做什么?看来我们不能随意调整秒数,因为它只读取前两位数:

    [~] # busybox date -d 123119001969.65 '+%s'
    65
    [~] # busybox date -d 123119001969.100 '+%s'
    10
    

    好吧,事实证明您可以使用“无效”数字加载日期字段。

    [~] # busybox date  090100002016
    Thu Sep  1 00:00:00 EDT 2016
    [~] # busybox date  093400002016
    Wed Oct  4 00:00:00 EDT 2016
    [~] # busybox date  09-200002016
    Mon Aug 29 00:00:00 EDT 2016
    

    所以让我们使用基于%w 的东西来调整“天”字段。

    today=$(busybox date '+%m%d%H%M%Y')
    last_sat=$(busybox date -d "${today:0:2}$( printf '%02d' $(( 10#${today:2:2} - 1 - $(busybox date '+%w') )) )${today:4}" '+%F')
    

    这只是减去第二个字段中的数字(日期字符串的第 3 和第 4 个字符)。它显然要求你的 shell 要么是 bash 要么理解 bash 风格的数学符号 ($((...)))。数学方面,只要“上一个星期六”在同一个月内,它就应该工作,并且它可以工作(我没有测试过)与上个月的翻转(根据上面的最后一个测试)。

    我建议您只安装一个 GNU date 二进制文件,而不是跳过这些棘手的问题,并且不要为这个二进制文件使用 busybox。 :-P

    祝你好运!

    【讨论】:

    • 我看到您使用的是 1.01,而不是 1.1.0。也许这就是您所看到的差异的原因?
    • @Eric - 是的,我希望如此。正如我在答案顶部提到的那样,busybox 的date 支持的功能列表似乎随着时间的推移发生了一些变化。我没有详细查看源代码的历史,但影响很可能是对于在不同 BB 版本之间可移植的解决方案,人们应该以最低的共同点为目标。也就是说,我不知道我的版本有多普遍——它在我办公室的一台古老的 QNAP 文件服务器上使用,早就应该更换了。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多