You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在JavaScript中输入日期作为Solidity函数参数——迁移文件调用setDeadline函数场景

解决方法:在JS中构造「今日+7天」的秒级时间戳作为uint256参数

嘿,这个问题其实很 straightforward,核心是要搞清楚Solidity和JavaScript在时间戳单位上的差异,然后做对应的转换就行:

关键前提

Solidity里的时间戳(比如block.timestamp)是秒级的uint256类型,所以你传入setDeadline的参数必须是从Unix纪元开始的秒数,而不是JavaScript默认的毫秒数。

具体实现步骤

  1. 获取当前时间的秒级时间戳:JavaScript的Date.now()返回的是毫秒数,我们需要除以1000并取整,得到秒级时间戳。
  2. 计算7天对应的秒数:7天 = 7 × 24小时 × 60分钟 × 60秒 = 604800秒。
  3. 相加得到最终的deadline值:把当前秒级时间戳和7天的秒数相加,就是「今日+7天」的时间戳,直接作为uint256参数传入即可。

迁移文件中的完整代码示例

如果你用的是Truffle:

const ContractName = artifacts.require("ContractName");

module.exports = async function (deployer) {
  // 获取已部署的合约实例
  const contractInstance = await ContractName.deployed();

  // 计算今日+7天的秒级时间戳
  const nowInSeconds = Math.floor(Date.now() / 1000);
  const sevenDaysInSeconds = 7 * 24 * 60 * 60;
  const deadline = nowInSeconds + sevenDaysInSeconds;

  // 调用合约的setDeadline函数
  const response = await contractInstance.setDeadline(deadline);
  console.log(`Deadline已设置为:${deadline}(秒级时间戳)`);
};

如果你用的是Hardhat:

const { ethers } = require("hardhat");

async function main() {
  // 加载合约工厂并获取实例(如果是已部署的合约,用attach方法)
  const ContractFactory = await ethers.getContractFactory("ContractName");
  const contract = await ContractFactory.deploy(); // 替换成你的部署逻辑
  await contract.deployed();

  // 计算目标时间戳
  const nowInSeconds = Math.floor(Date.now() / 1000);
  const sevenDaysInSeconds = 7 * 24 * 60 * 60;
  const deadline = nowInSeconds + sevenDaysInSeconds;

  // 调用函数并等待交易确认
  const tx = await contract.setDeadline(deadline);
  await tx.wait();

  console.log(`Deadline设置完成,值为:${deadline}`);
}

main().catch((err) => {
  console.error(err);
  process.exitCode = 1;
});

可选:精确到「今日0点+7天」

如果你需要的不是当前时间加7天,而是今日零点之后的第7天零点,可以这样调整时间戳的计算:

const today = new Date();
// 将时间设置为今日0点0分0秒
today.setHours(0, 0, 0, 0);
// 转成秒级时间戳
const todayStartInSeconds = Math.floor(today.getTime() / 1000);
// 加上7天的秒数
const deadline = todayStartInSeconds + 7 * 24 * 60 * 60;

注意事项

  • 一定要用Math.floor()取整,避免出现小数(虽然实际中Date.now()是整数,但除以1000可能产生浮点数,确保参数是整数符合uint256的要求)。
  • 不用担心数值溢出:uint256的最大值是2^256-1,远大于当前时间戳加7天的数值,完全在安全范围内。

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

火山引擎 最新活动