问问几乎所有的开发者他们最害怕的是什么,有一个根深蒂固的话题会高于其他话题......日期。公平地说,这主要源于这些日期的来源。它们是直接从数据库中原封不动地来的吗?它们是在网络服务层面上被格式化的吗?它们是UTC时间还是当地时间?这么多的问题,这么少的答案。多年来,已经有许多库帮助开发者管理日期和日期运算。Temporal API给web开发者带来了强类型的、不可改变的对象,不仅是各种类型的date 对象,还有时间,甚至是持续时间。
日期计算
日期算术的一个非常流行的用例是加减日期。以一个高级搜索功能为例。你想搜索过去一周内注册你网站的所有用户。让我们做一个快速的比较,看看你如何用常规的日期函数来做这个,然后使用时间API:
// Vanilla Date Functions
const today = new Date();
const lastWeek = new Date(today.setDate(today.getDate() - 7));
// Temporal API
const today = Temporal.Now.plainDateISO();
const lastWeek = today.subtract({ weeks: 1 });
是的,用常规的Date ,但使用Temporal API是非常直观的。我想减去一个星期,我可以减去一个星期。增加一个小时,我就可以增加一个小时。这就是人们可能求助于第三方库的那种开发者工效学。
看看一个实际的例子,我们可能有一个员工的列表,其开始日期是这样的:
[
{
id: 1,
first_name: "Dorene",
last_name: "Lyokhin",
start_date: "2021-09-01"
},
{
id: 2,
first_name: "Veriee",
last_name: "Stichel",
start_date: "2021-08-23"
},
…
]
我们可能想问一个问题,"谁是过去六个月里雇佣的员工?"。我们可以使用Temporal API的比较方法来比较两个Temporal日期。各种类型的时态日期都有compare 方法,由于我们在这个例子中使用的是PlainDate ,我们可以使用PlainDate.compare:
const today = Temporal.Now.plainDateISO();
const target = today.subtract({ months: 6 });
const sixMonths = employees.filter((employee) => {
const current = Temporal.PlainDate.from(employee.start_date);
let result = Temporal.PlainDate.compare(current, target);
return result > 0;
});
现在我们可以很容易地使用Temporal API找到6个月前的一个日期,并找到该日期之后雇用的任何员工。这是一个很好的简化例子,使用Temporal API找到过去的一个日期,并与当前日期进行比较。
Temporal API的算术方法使用Duration对象。Duration对象提供任何数量的持续时间属性,从年、月、日到小时、分钟、秒、毫秒、微秒和纳秒。你甚至可以用Temporal API派生出Duration对象:
// date is a Date object
// We want the duration since that time
let instant = Temporal.Instant.fromEpochMilliseconds(
date.getTime()
);
let duration = instant.since(Temporal.Now.instant());
since方法,就像比较方法一样,可以通过Temporal API用于各种Date对象。
也许你需要弄清楚离某个事件还有多少天:
const now = Temporal.Now.plainDateISO();
// date six months from now, for demonstration
const upcoming = now.add({ months: 6 });
const days = now.until(upcoming).days;
// approximately 183, depending on the months ahead
这是一个非常有用的方法,你可以找出一个客户是否在几天后有一个账单,并迅速为用户显示一个说明或警报。这可以定义应用程序的一些状态,使用户在一定的时间范围内也不能做出改变。
时区
有许多日期格式你可以使用Temporal API来处理。从PlainDate对象到具有纳秒级精度的Instant对象,还有更多甚至还有一个你可以创建的日历对象,但这也需要一些关于国际API的工作知识。也许下一次吧!
让我们快速浏览一下关于时区的工作。我知道你退缩了,时区是处理日期的一个方面,可能是一个痛点。这是因为你可能正在处理来自来源的日期字符串,你不知道它们是如何生成的。大多数时候,浏览器的本地化会帮助你处理日期和时间。但也许我们需要手动做一些工作。这也是可以的。Temporal API可以帮助我们解决这个问题!
let timezone1 = Temporal.TimeZone.from('America/Los_Angeles');
let timezone2 = Temporal.TimeZone.from('Asia/Qatar');
let zoned1 = instant.toZonedDateTimeISO(timezone1);
let zoned2 = instant.toZonedDateTimeISO(timezone2);
zoned1.toString(); // '1995-12-31T16:00:01-08:00[America/Los_Angeles]'
zoned2.toString(); // '1996-01-01T04:00:01+04:00[Asia/Qatar]'
正如你所看到的,Temporal API将允许你直接管理你的应用程序中的时区,这样我们就可以为我们的应用程序的用户提供一个更清洁的体验。你可以有一个提供日期的信息仪表板,并允许用户通过下拉式改变这些日期的时区显示,或者用户配置,这样他们就可以定制自己的体验。
总结
你可以用Temporal API做很多事情,特别是在处理地区、时区和日历的时候。我们只是碰巧认为,对大多数开发者来说,处理日期数学是最容易做到的事情之一。我们强烈建议你审查该提案,它目前处于第三阶段。这意味着它已接近尾声,但在完全定稿之前,API的某些方面可能会发生变化,所以如果你考虑将其与Polyfills的使用部署到生产中,我们会谨慎行事。