【问题标题】:Why does timestamp differ?为什么时间戳不同?
【发布时间】:2021-03-07 14:46:37
【问题描述】:

给了我一个带有时间戳的 JSON 文件。

其中一个是:1545880457898

我可以通过以下方式获得实际日期: new Date(ticket.creationTime).toLocaleString(),它给了我:27/12/2018, 04:14:17

现在,我尝试通过以下方式转换日期:27/12/2018new Date(Number(split[2]),Number(split[1]),Number(split[0])).getTime(),得到:1548543600000

这是非常不同的,尤其是非常大。这是一个大问题,因为我正在比较它们以按创建时间对它们进行排序。

任何人都知道他们为什么不同?我怎样才能得到case1的等价物?

【问题讨论】:

  • 但您的原始时间戳不正确:1542111235544 给您的是11/13/2018 而不是27/12/2018。另请记住,Date() constructor 明确指出该月使用monthIndex(即从零开始),因此这可能是您的月份出现错误的原因。
  • 抱歉疏忽。编辑了问题
  • (Number(split[2])等不用转成数字,new Date(split[2], split[1] - 1, split[0]).getTime()即可。

标签: javascript json date


【解决方案1】:

您的代码有几个问题:

  1. 您正在将包含小时、分钟和秒信息的时间戳转换为仅使用年、月和日的时间戳。因此,您无法重建原始时间戳,因为您正在丢弃小时/分钟/秒信息。
  2. 您的输出格式为MM/DD/YYYY(但这取决于您的语言环境),但是当将其拆分并提供给new Date() 构造函数时,您混淆了位置参数的顺序。李>
  3. new Date() 构造函数使用从零开始的monthIndex,因此您需要从字符串中获得的月份减去 1。

请参阅下面的概念验证:

const creationTime = 1545880457898;

const dateString = new Date(creationTime).toLocaleString();

const split = dateString.split(',')[0].split('/')

const newTime = new Date(Number(split[2]),Number(split[0]) - 1,Number(split[1])).getTime();
console.log(newTime);

但是,.toLocaleString() 会产生不一致的输出(因为它依赖于语言环境),我强烈建议将 unix 时间戳解析为字符串,然后再返回。您应该始终使用 unix 时间戳作为事实来源。 toLocaleString() 最好用于单向数据表示(即显示日期),您不应该使用它来“重建”原始时间戳。

【讨论】:

  • 代码第二个位置需要是月份,误把日期放在那里
  • 这取决于您所在的语言环境。对我来说:月份是数组中的第一项。
  • Re "你的输出格式是 MM/DD/YYYY",不,不是,"27/12/2018" 是 d/m/ y 格式。
  • 正如我在这一点上多次详尽地提到的那样:订单无法保证,因为它取决于区域设置。我最后得到的确实是 MM/DD/YYYY。
【解决方案2】:

这是因为 Date api 将月份作为从 0 开始的数字,在这种情况下它需要是 11 而不是 12

new Date(Number(split[2]),Number(split[1]) - 1,Number(split[0])).getTime()

但它也不会给出确切的 1545880457898,因为我们没有提供日期 api 的时间

【讨论】:

  • 谢谢,解决了我的问题。不介意它们是否相同,我只需要它们按时间顺序排列就可以了
猜你喜欢
  • 2013-07-16
  • 1970-01-01
  • 1970-01-01
  • 2020-09-12
  • 1970-01-01
  • 1970-01-01
  • 2016-04-11
  • 2021-12-24
  • 2017-11-09
相关资源
最近更新 更多