获取上周六的日期 - BusyBox 1.1.0

Get date of last saturday - BusyBox 1.1.0

由于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 参数。

有什么建议吗?

今天前最后一个周六,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 */

多年来,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

好吧,事实证明您可以使用 "invalid" 数字加载日期字段。

[~] # 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 的东西来调整 "day" 字段。

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 式数学符号 ($((...)))。在数学方面,只要 "last saturday" 在同一个月内,它就应该可以工作,并且它可以工作(我还没有测试过)与上个月的滚动(根据上面的最后一个测试)。

我建议您只安装一个 GNU 日期二进制文件,而不是跳过这些急需解决的问题,而不要为这个二进制文件使用 busybox。 :-P

祝你好运!