Asterisk拨号计划技术求助:实现通话接通后播报指定日期
解决Asterisk拨号计划播报指定日期的问题
嘿,我懂你现在的困扰——默认用SayUnixTime只能读当前时间,没法播报指定日期对吧?其实这个函数本身就藏着你要的功能,只是你可能没注意到它支持传入自定义的Unix时间戳!
下面给你一步步拆解解决方法:
第一步:把指定日期转成Unix时间戳
Unix时间戳是从1970年1月1日到目标日期的秒数,你可以用两种方式获取:
- 用Linux命令行直接计算:比如要转2024年10月1日,执行
date -d "2024-10-01" +%s,会得到类似1727798400的数字 - 用本地工具或离线时间戳转换工具计算(不用依赖外部网站)
第二步:在拨号计划里调用带自定义时间戳的SayUnixTime
默认情况下SayUnixTime会用当前时间,但你可以把第一步得到的时间戳作为第一个参数传进去,再通过格式字符串控制只播报日期部分(不报时分秒)。
举个实际的拨号计划例子:
[custom-call-announce] exten => _X.,1,Answer() ; 替换这里的1727798400为你需要的指定日期的Unix时间戳 exten => _X.,n,SayUnixTime(1727798400,,ABdY) ; 格式符说明:A=星期全称,B=月份全称,d=两位日期,Y=四位年份 exten => _X.,n,Dial(SIP/${EXTEN},20) exten => _X.,n,Hangup()
如果需要中文播报,记得在第二个参数指定语言(前提是你已经安装了中文语音包):
exten => _X.,n,SayUnixTime(1727798400,zh,ABdY)
进阶技巧:用变量灵活控制日期
如果不想硬编码时间戳,可以把时间戳存在变量里,甚至从数据库或配置文件读取,比如:
[custom-call-announce] exten => _X.,1,Answer() exten => _X.,n,Set(TARGET_DATE_TS=1727798400) exten => _X.,n,SayUnixTime(${TARGET_DATE_TS},zh,ABdY) exten => _X.,n,Dial(SIP/${EXTEN},20) exten => _X.,n,Hangup()
注意事项
- 确保你的Asterisk安装了对应语言的语音包,比如中文的
asterisk-sounds-zh_CN-wav或asterisk-sounds-zh_CN-g729,不然会默认用英文播报 - 格式符可以根据需求调整,比如只播报年月的话用
BY,或者只播报日期用d
内容的提问来源于stack exchange,提问作者Ricardo Alberto Mercedes Garca
相关产品推荐
相关产品推荐

