📌  相关文章
📜  如何在 JavaScript 中将 CFAbsoluteTime 转换为日期对象,反之亦然?

📅  最后修改于: 2022-05-13 01:56:30.229000             🧑  作者: Mango

如何在 JavaScript 中将 CFAbsoluteTime 转换为日期对象,反之亦然?

CFAbsolute 时间是 Apple 设备和 Swift 等编程语言上的标准时间格式。它存储自 2001 年 1 月 1 日以来的纳秒量。在其核心,它类似于纪元时间,不同之处在于它存储的时间更接近现代,使用 2001 年而不是 1970 年作为参考点。这是 Apple 的 CFAbsolute 官方文档时间。

要将 CFAbsoluteTime 转换为 Date 对象,反之亦然,我们将主要使用 JavaScript Date.getTime() 方法,它提供自 1970 年 1 月 1 日以来的毫秒数。我们还将使用 Date.setTime() 方法,设置自 1970 年 1 月 1 日以来的毫秒数。

从 CFAbsoluteTime 转换为日期对象

要将 CFAbsolute 时间转换为普通日期,我们可以创建一个从 2001 年 1 月 1 日开始的 Date 对象,并将 CFAbsolute 时间值(以毫秒为单位)添加到 Date.getTime() 值中。

Javascript
const CFAbsoluteTimeToDate = (CFATime,
    unitConversionValue = 1000) => {
    const dt = new Date('January 1 2001 GMT');
    dt.setTime(dt.getTime() + CFATime * unitConversionValue);
    return dt;
};
  
console.log(CFAbsoluteTimeToDate(639494700));


Javascript
const DateToCFAbsoluteTime = (dt,
    unitConversionValue = 1000) => {
    const CFADate = new Date('January 1 2001 GMT');
  
    // unitConversionValue;
    return (dt.getTime() - CFADate.getTime());
};
  
console.log(DateToCFAbsoluteTime(
    new Date("April 5 2021")));


输出:

2021-04-07T13:25:00.000Z

从日期对象转换为 CFAbsoluteTime

为了转换回 CFAbsolute 时间,我们可以简单地减去日期和 2001 年 1 月 1 日的 Date.getTime() 值,然后将该值从毫秒转换为纳秒。

Javascript

const DateToCFAbsoluteTime = (dt,
    unitConversionValue = 1000) => {
    const CFADate = new Date('January 1 2001 GMT');
  
    // unitConversionValue;
    return (dt.getTime() - CFADate.getTime());
};
  
console.log(DateToCFAbsoluteTime(
    new Date("April 5 2021")));

以毫秒或纳秒为单位使用 CFAbsoluteTime

某些版本的 CFAbsoluteTime 以毫秒或纳秒而不是秒为单位存储。要使用这些类型,只需更改 unitConversionValue 参数的值,如下所示:

Storage TypeunitConversionValue
Seconds1000
Milliseconds1
Nanoseconds0.000001

默认情况下,程序将使用秒,这是最常见的 CFAbsoluteTime 存储类型。