由于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
参数。
有什么建议吗?
答案 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
祝你好运!