获取上周六的日期 - BusyBox 1.1.0

时间:2016-08-31 09:38:47

标签: date sh busybox

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

有什么建议吗?

2 个答案:

答案 0 :(得分:2)

今天之前的最后一个星期六,在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 */

答案 1 :(得分:1)

多年来,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风格的数学符号($((...)))。数学方面,它应该和#34;上周六一样长,#34;是在同一个月内,它可以工作(我还没有测试过),使用上一个月的滚动(按照上面的最后一次测试)。

我建议您只安装一个GNU日期二进制文件,而不是跳过这些燃烧的箍,而不是使用busybox来实现这个二进制文件。 :-P

祝你好运!