DATE 在 bash 中的操作

Operations with DATE in bash

所以我需要创建一个脚本,在文件中写入有关 phone 调用的详细信息。该文件需要包含: -CALLING_NUMBER -> 以 0742、0743 和 0744 开头,其余数字随机生成(共 10 个)

-CALLED_NUMBER -> 以 07 开头,其余数字也是随机的

-START_DATE -> phone 通话的开始日期,格式为 yyyy-mm-dd hh24:mm:ss。对于所有 phone 个通话,开始日期必须是同一天并且涵盖当天的所有时间

-END_DATE -> phone调用的结束日期,格式相同,大于开始日期,随机生成0-7200之间的额外秒数

-CALL_TYPE -> 如果通话时长为 1 秒,则为 return 短信,如果更长,则为 returns VOICE

我做了 CALLING_NUMBER 和 CALLED_NUMBER 并且 CALL_TYPE 非常简单,一旦你有结束和开始日期。我在开始和结束日期方面遇到了问题。

GNU bash,版本 3.2.25(1)-发布 (x86_64-redhat-linux-gnu)

谢谢!

这将生成一个锚定在特定日期的随机 start_date,然后是一个比该日期晚 0-7200 秒的随机 end_date

#!/bin/bash

# all start_date's will be on this day
start_date_anchor="2017-09-01"
# start_date in seconds since Unix epoch
start_date_zero=$(date -d "$start_date_anchor" +%s)
# random offset in seconds from midnight (note: RANDOM is a 15-bit int)
start_date_offset=$(( ((RANDOM<<15)|RANDOM) % 86400 ))
# random start_date in "YYYY-MM-DD HH:MM:SS" format
start_date=$(date -d @"$((start_date_zero + start_date_offset))" +"%F %T")

# 0-7200 seconds offset
end_date_offset=$((RANDOM % 7200))
# end_date in "YYYY-MM-DD HH:MM:SS" format
end_date=$(date -d @"$((start_date_zero + start_date_offset + end_date_offset))" +"%F %T")

echo "Start date: $start_date"
echo "End date: $end_date"

注意我们在这里使用:

  • date -d 'some_date' +%ssome_date 转换为 Unix 时间戳(自纪元以来的秒数)
  • bashRANDOM变量,其中returns一个15位范围内(0到32767)的随机整数每次都是called/referenced。我们可以通过组合两个 15 位整数的位得到一个 30 位随机整数:RANDOM<<15 | RANDOM.
  • 以秒为单位的日期算法
  • date -d @unix_timestamp 将 Unix 时间戳转换回人类可读的 date/time
  • +"%F %T" 格式说明符作为 YYYY-mm-dd HH:MM:SS 格式
  • 的快捷方式