问题描述
我正在尝试创建一个discord机器人,该机器人可以进行临时禁止,并且在大多数情况下,我知道该如何处理。唯一的问题是我不知道如何使用3w/2w/1y/etc
之类的参数来转换为新时间来创建计时器。我在Google各处爬行,以找到答案,甚至找不到关于如何完成此操作的小提示或技巧,也许你们也许能够为我指明正确的方向。
解决方法
我将使用正则表达式解析该参数,然后将其映射到以毫秒为单位的日期:
const mapping = {
w: 7 * 24 * 60 * 60 * 1000,d: 24 * 60 * 60 * 1000,// whatever other units you want
};
const toDate = (string) => {
const match = string.match(/(?<number>[0-9]*)(?<unit>[a-z]*)/);
if (match) {
const {number,unit} = match.groups;
const offset = number * mapping[unit];
return new Date(Date.now() + offset);
}
}
示例:
> toDate('3w')
2020-09-08T19:04:15.743Z
> toDate('2d')
2020-08-20T19:04:20.622Z
,
您可以将参数转换为毫秒,记录当前的var str ="-3.755512109246D2";
for(var i = 0; i < str.length; i++)
{
if(str[i] == 'd' || str[i] == 'D')
{
str[i] = 'E';
break;
}
}
var result = parseFloat(str);
并以一定的更新率将其检查为新的Date.now()
。
如果时间差较小,则仍然禁止该用户,否则将禁止该用户。
,您可以使用date-fns libaray npm install date-fns
然后使用formatDistance函数
formatDistance( new Date(1986,3,4,11,32,0),new Date(1986,10,{ addSuffix: true } ) //=> 'in about 1 hour'
要转换该格式,请用h
替换d
,w
,m
,y
和x<number of seconds>
,然后将其拆分并然后将第一个乘以第二个,以秒为单位给您总和。
假设您不想使用库。 (可能会更强大)。
下面是一些测试,您显然需要添加验证,否则很有可能NaN
。
const shortSinceToSeconds = input => {
var p = input
.replace('h','x3600')
.replace('d','x86400')
.replace('w','x604800')
.replace('m','x2.628e+6')
.replace('y','x3.154e+7').split('x')
return (p[0] || 0) * (p[1] || 0)
}
const test = [
'1h','13h','1d','100d','1w','100w','2m','1y'
]
//
for (let i of test) {
console.log(`${i} = ${shortSinceToSeconds(i)} seconds`)
}