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
相关产品推荐
相关产品推荐

