|
26 | 26 | printf '%.0f' "$(secondsToMillisecondsDecimal "${1}")" |
27 | 27 | } |
28 | 28 |
|
29 | | -# Random generation |
30 | | -# -------------------------------------------- |
31 | | - # Generate a random date between two dates specified by year and optionally |
32 | | - # month, day of month and hour and output as one of the following: |
33 | | - # -A date in ISO-8601 format (e.g. 2004-04-25T16:18:13.489392193; default) |
34 | | - # -A Unix timestamp in seconds |
35 | | - # -A timestamp in the fomat [[CC]YY]MMDDhhmm[.ss] |
36 | | - # Usage: |
37 | | - # generateRandomDate <minimum/maximum date entities> |
38 | | - # <minimum/maximum date entities> format: |
39 | | - # yyyy(min),yyyy(max)[,MM(min),MM(max)[,dd(min),dd(max)[,hh(min), |
40 | | - # hh(max)]]] |
41 | | - # Examples: |
42 | | - # generateRandomDate '1942,1956,09,10,03,08,19,22' |
43 | | - # # output: "1945-10-06T21:33:42.730192851" |
44 | | - # generateRandomDate -u '2005,2009,04,11,15,31' |
45 | | - # # output: "1227236576" |
46 | | - # Options: |
47 | | - # -u return a Unix timestamp in seconds |
48 | | - # -t return a timestamp in the fomat [[CC]YY]MMDDhhmm[.ss] |
49 | | - # Note: |
50 | | - # The time of each date entity is inclusive of the previous entity (e.g. if |
51 | | - # the maximum hour is 15, the maximum time in hours and minutes is 15:59). |
52 | | - generateRandomDate() { |
53 | | - local OPT OPTIND OPTS |
54 | | - while getopts :ut OPT; do OPTS+="${OPT}"; done |
55 | | - shift $((OPTIND - 1)) |
56 | | - # redirect all output to >/dev/tty to print errors to the terminal when this |
57 | | - # function is used in a subprocess |
58 | | - exec 3>&1 4>&2; exec >/dev/tty 2>&1 |
59 | | - local regx='^[0-9]{1,4},[0-9]{1,4}(,[0-9]{1,2},[0-9]{1,2}(,[0-9]{1,2},[0-9]' |
60 | | - regx+='{1,2}(,[0-9]{1,2},[0-9]{1,2})?)?)?$' |
61 | | - if [[ ! "${1}" =~ ${regx} ]]; then |
62 | | - local errMsg='generateRandomDate: first argument must be in the format' |
63 | | - errMsg+=' yyyy(min),yyyy(max)[,\n MM(min),MM(max)[,dd(min),dd(max)[,' |
64 | | - errMsg+='hh(min),hh(max)]]]' |
65 | | - echo -e "${errMsg}" 1>&2 |
66 | | - return 1 |
67 | | - fi |
68 | | - local vals=(${1//,/ }) |
69 | | - local ENT=() |
70 | | - ENT+=($((10#"${vals[0]}"))) |
71 | | - ENT+=($((10#"${vals[1]}"))) |
72 | | - [ "${#vals[@]}" -gt 2 ] && ENT+=("${vals[2]}") || ENT+=('1') |
73 | | - [ "${#vals[@]}" -gt 2 ] && ENT+=("${vals[3]}") || ENT+=('12') |
74 | | - [ "${#vals[@]}" -gt 4 ] && ENT+=("${vals[4]}") || ENT+=('1') |
75 | | - [ "${#vals[@]}" -gt 4 ] && ENT+=("${vals[5]}") || ENT+=('31') |
76 | | - [ "${#vals[@]}" -gt 6 ] && ENT+=("${vals[6]}") || ENT+=('0') |
77 | | - [ "${#vals[@]}" -gt 6 ] && ENT+=("${vals[7]}") || ENT+=('23') |
78 | | - if [ "${ENT[2]}" -gt 12 ] || [ "${ENT[3]}" -gt 12 ] || [ "${ENT[2]}" \ |
79 | | - -eq 0 ] || [ "${ENT[3]}" -eq 0 ]; then |
80 | | - echo 'generateRandomDate: MM(min) and MM(max) must be in the range 1 <='\ |
81 | | - 'x <= 12' 1>&2 |
82 | | - return 1 |
83 | | - elif [ "${ENT[4]}" -gt 31 ] || [ "${ENT[5]}" -gt 31 ] || [ "${ENT[4]}" \ |
84 | | - -eq 0 ] || [ "${ENT[5]}" -eq 0 ]; then |
85 | | - echo 'generateRandomDate: dd(min) and dd(max) must be in the range 1 <='\ |
86 | | - 'x <= 31' 1>&2 |
87 | | - return 1 |
88 | | - elif [ "${ENT[6]}" -ge 24 ] || [ "${ENT[7]}" -ge 24 ]; then |
89 | | - echo 'generateRandomDate: hh(min) and hh(max) must be less than 24' 1>&2 |
90 | | - return 1 |
91 | | - elif [ "${ENT[0]}" -gt "${ENT[1]}" ] || [ "${ENT[2]}" -gt "${ENT[3]}" ] || \ |
92 | | - [ "${ENT[4]}" -gt "${ENT[5]}" ] || [ "${ENT[6]}" -gt "${ENT[7]}" ]; then |
93 | | - echo 'generateRandomDate: ranges must be yyyy(min)<=yyyy(max),'\ |
94 | | - 'MM(min)<=MM(max), dd(min)<=dd(max), hh(min)<=hh(max)' 1>&2 |
95 | | - return 1 |
96 | | - fi |
97 | | - local year="$(printf "%02d" "$(shuf -i "${ENT[0]}"-"${ENT[1]}" -n 1)")" |
98 | | - local month="$(printf "%02d" "$(shuf -i "${ENT[2]}"-"${ENT[3]}" -n 1)")" |
99 | | - local day="$(printf "%02d" "$(shuf -i "${ENT[4]}"-"${ENT[5]}" -n 1)")" |
100 | | - case "${month}" in |
101 | | - '02') [ "${day}" -gt 28 ] && day=28;; |
102 | | - '04'|'06'|'09'|'11') [ "${day}" -gt 30 ] && day=30;; |
103 | | - esac |
104 | | - local hour="$(printf "%02d" "$(shuf -i "${ENT[6]}"-"${ENT[7]}" -n 1)")" |
105 | | - local minute="$(printf "%02d" "$(shuf -i 0-59 -n 1)")" |
106 | | - local second="$(printf "%02d" "$(shuf -i 0-59 -n 1)")" |
107 | | - local nanosecond="$(printf "%09d" "$(shuf -i 0-999999999 -n 1)")" |
108 | | - exec >&3 2>&4 |
109 | | - local iso8601Date="${year}-${month}-${day}T${hour}:${minute}:${second}" |
110 | | - iso8601Date+=".${nanosecond}" |
111 | | - if [ -n "${OPTS}" ] && [ -z "${OPTS##*u*}" ]; then |
112 | | - date --utc --date="${iso8601Date}" +"%s" |
113 | | - elif [ -n "${OPTS}" ] && [ -z "${OPTS##*t*}" ]; then |
114 | | - echo "${year}${month}${day}${hour}${minute}.${second}" |
115 | | - else |
116 | | - echo "${iso8601Date}" |
117 | | - fi |
118 | | - } |
119 | | - |
0 commit comments