获取上周六的日期 - 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
祝你好运!
由于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
祝你好运!