Get date of last saturday - BusyBox 1.1.0

独自空忆成欢 提交于 2019-12-31 05:15:12

问题


Since the date in BusyBox is not as powerful as gnu date, I have problems to calculate the date of last saturday.

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

only works fine with gnu date.

I've found something like this to calculate from Epoch

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

but my BusyBox (v1.1.0) doesn't recognize the -D argument.

Any suggestions?


回答1:


For the last Saturday before today, under busybox 1.16:

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

How it works: take the current date in seconds, subtract one day, subtract one day times the number of the current weekday, then convert those seconds back to a date.

EDIT: after hacking together a build of 1.1, this works:

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

This working version is based on code-reading:

} 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 */



回答2:


BusyBox's date command has been the topic of some discussion over the years. Apparently it doesn't always work as documented, and it doesn't always work the same as previous versions.

On a BB system I administer running BusyBox v1.01, I'm able to use the -d option with dates in the format MMDDhhmmYYYY.ss, and in no other format that I've tried. Luckily, output formats work as expected, presumably because date is using a proper strftime() according to comments in the source.

Here's my forward-and-reverse example:

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

So .. what can we do with this? It seems that we can't do an arbitrary adjustment of seconds, as it only reads the first two digits:

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

Well, it turns out you can load the date fields with "invalid" numbers.

[~] # 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

So let's adjust the "day" field using something based on %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')

This simply subtracts numbers in the second field (the 3rd and 4th characters of the date string). It obviously requires that your shell either be bash or understand bash-style math notation ($((...))). Math-wise, it should work as long as "last saturday" is within the same month, and it MAY work (I haven't tested it) with rollvers to the previous month (per the last test above).

Rather than jumping through these burning hoops, I recommend you just install a GNU date binary, and don't use busybox for this one binary. :-P

Good luck!



来源:https://stackoverflow.com/questions/39245992/get-date-of-last-saturday-busybox-1-1-0

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!