如何在JavaScript / Node.JS中解析基于时间的令牌?

问题描述

我正在尝试创建一个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替换dwmyx<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`)
}