You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TypeScript生成带随机间隔的Unix时间戳问题求助

需求与问题

刚接触TypeScript,想生成15条带递增随机间隔的设备数据,要求:

  • 时间戳从Date.now()(毫秒级Unix时间戳)开始
  • 每条数据的时间戳比前一条多60-120秒(需转成毫秒)
  • 之前的代码中,在useEffect循环15次调用generateFakeData(),但每次调用都是独立生成时间,没法实现累加间隔的效果,原代码逻辑存在问题。

原generateFakeData()代码:

import { faker } from '@faker-js/faker';
import { IDeviceData } from '@backend/data';

export function generateFakeData(): IDeviceData {
  for(let interval = 0; interval < 15; interval+20){ // 此处interval不会更新,且逻辑不符合需求
    console.log(interval);
    }

  return {
    id: faker.datatype.uuid(),
    imei: faker.datatype.uuid(),
    sensorPayload: 'test',
    temperature: faker.datatype.number({ min: -40, max: 70 }),
    humidity: faker.datatype.number({ max: 100 }),
    carbondioxide: faker.datatype.number({ max: 1000000 }),
    timestamp: Date.now()+interval.toString() // 此处interval未正确赋值,且字符串拼接会导致时间戳类型错误
  };
}

原调用逻辑:

const [devices, setDevices] = useState([] as IDeviceData[]);

useEffect(() => {
    if (environment.production === false) {
      const fakeData = [];
      for (let i = 0; i < 15; i++) {
        fakeData.push(generateFakeData());
      }
      setDevices(fakeData);
    } else {...}
}
解决方法

核心是在循环中维护一个累加的时间戳变量,确保每条数据的时间基于前一条递增。

方法一:直接在循环内生成(最简方案)

修改useEffect中的逻辑,把时间戳累加逻辑放在循环内部:

const [devices, setDevices] = useState([] as IDeviceData[]);

useEffect(() => {
    if (environment.production === false) {
      const fakeData = [];
      // 初始化起始时间为当前毫秒时间戳
      let currentTime = Date.now();
      for (let i = 0; i < 15; i++) {
        // 生成60-120秒的随机间隔,转成毫秒
        const randomGap = faker.datatype.number({ min: 60, max: 120 }) * 1000;
        // 累加时间
        currentTime += randomGap;
        // 生成单条数据并加入数组
        fakeData.push({
          id: faker.datatype.uuid(),
          imei: faker.datatype.uuid(),
          sensorPayload: 'test',
          temperature: faker.datatype.number({ min: -40, max: 70 }),
          humidity: faker.datatype.number({ max: 100 }),
          carbondioxide: faker.datatype.number({ max: 1000000 }),
          timestamp: currentTime
        });
      }
      setDevices(fakeData);
    } else {
      // 生产环境逻辑
    }
}, []);

方法二:保留独立的生成函数

如果不想把生成逻辑写在useEffect里,可以让generateFakeData()接收上一次的时间戳,返回新数据和更新后的时间:

import { faker } from '@faker-js/faker';
import { IDeviceData } from '@backend/data';

export function generateFakeData(lastTimestamp: number): [IDeviceData, number] {
  // 生成60-120秒的随机间隔(转毫秒)
  const randomGap = faker.datatype.number({ min: 60, max: 120 }) * 1000;
  const newTimestamp = lastTimestamp + randomGap;
  // 返回数据和新的时间戳
  return [
    {
      id: faker.datatype.uuid(),
      imei: faker.datatype.uuid(),
      sensorPayload: 'test',
      temperature: faker.datatype.number({ min: -40, max: 70 }),
      humidity: faker.datatype.number({ max: 100 }),
      carbondioxide: faker.datatype.number({ max: 1000000 }),
      timestamp: newTimestamp
    },
    newTimestamp
  ];
}

然后在useEffect中调用:

const [devices, setDevices] = useState([] as IDeviceData[]);

useEffect(() => {
    if (environment.production === false) {
      const fakeData = [];
      let currentTime = Date.now();
      for (let i = 0; i < 15; i++) {
        const [deviceData, updatedTime] = generateFakeData(currentTime);
        fakeData.push(deviceData);
        currentTime = updatedTime;
      }
      setDevices(fakeData);
    } else {
      // 生产环境逻辑
    }
}, []);
注意点
  • Date.now()返回的是毫秒级时间戳,必须把60-120秒转成毫秒(乘1000),否则会变成加几十毫秒,间隔完全不符合需求
  • 原代码里的interval+20是无效写法,不会改变interval的值,正确的累加写法是interval += 20,但这也不符合随机间隔的要求
  • 原代码里Date.now()+interval.toString()会把数字和字符串拼接,得到字符串类型的时间戳,后续使用时会出错,要直接用数字相加

内容的提问来源于stack exchange,提问作者Ismail Yaman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 09:50:26