|
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