Вычислить случайный указанный день, чтобы добавить интервал дней

Я мог бы вычислить текущий день + 28 дней с помощью

$ date -d '28 days'
Fri 13 Sep 2019 11:32:38 PM CST

Как можно вычислить произвольно указанный день, чтобы добавить 28 дней, сказав

date -d "2019-8-8 + 28 дней "

1
задан 16 August 2019 в 18:34

1 ответ

shuf - генерируйте случайные перестановки

Можно использовать shuf для этого следующим образом:

date -d "$(shuf -n1 -i0-2019)-$(shuf -n1 -i1-12)-$(shuf -n1 -i1-31) + 28 days"

Например. shuf -n1 -i0-2019 выводы 1 число из списка чисел от 0 кому: 2019, таким образом, это дает Вам случайный год в этом диапазоне. То же сделано в течение месяца (1-12) и день (1-31). Этот подход имеет одну проблему: Как, например, “2019-2-31” не допустимая дата date перестанет работать с ошибкой:

date: invalid date ‘2019-2-31’

Цикл обходного решения

Можно работать вокруг этого с циклом, из которого только выходят, когда команда, за которой следуют и, подавляет сообщения об ошибках (путем перенаправления stderr к /dev/null):

while :; do
  if date -d "$(shuf -n1 -i0-2019)-$(shuf -n1 -i1-12)-$(shuf -n1 -i1-31) + 28 days"; then
    break
  fi
done 2>/dev/null

Пример выполняется

$ while :;do if date -d "$(shuf -n1 -i0-2019)-$(shuf -n1 -i1-12)-$(shuf -n1 -i1-31)+28days";then break;fi;done 2>/dev/null
Tue Nov 19 00:00:00 CET 1946

Цикл для нескольких дат

Если Вы хотите создать много этих случайных дат, изменить цикл следующим образом:

i=0
while ((i<3)); do
  if date -d "$(shuf -n1 -i0-2019)-$(shuf -n1 -i1-12)-$(shuf -n1 -i31-31) + 28 days"; then
    ((i++))
  fi
done 2>/dev/null

Число в строке 2, здесь я использовал 3, количество дат для вывода.

Пример выполняется

$ i=0;while ((i<3));do if date -d "$(shuf -n1 -i0-2019)-$(shuf -n1 -i1-12)-$(shuf -n1 -i31-31)+28days";then ((i++));fi;done 2>/dev/null
Sat Nov 28 00:00:00 LMT 0572
Wed Apr 28 00:00:00 LMT 0771
Sun Nov 28 00:00:00 LMT 0917
2
ответ дан 7 December 2019 в 13:15

Другие вопросы по тегам:

Похожие вопросы: