网站首页 > 知识剖析 正文
大家好,很高兴又见面了,我是"高级前端?进阶?",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发,您的支持是我不断创作的动力。
处理日期和时间一直是 JavaScript 的弱点之一, 原生 Date 对象在底层只是一个带有一些实用方法的 unix 时间戳。幸运的是,不乏像 moment.js、luxon、date-fns 和 day.js 这样的库来填补这一空白。
1.什么是 Moment.js
Moment.js 是 JavaScript 生态上个时代的产物。 多年来,Moment.js 虽然也在不断更新,但它的设计与 2011 年创建时基本相同,没有明显的变化。考虑到众多项目依赖,目前 Moment.js 已处于维护阶段,不再集成新的功能。
moment().format('MMMM Do YYYY, h:mm:ss a'); // February 18th 2024, 9:03:09 am
moment().format('dddd'); // Sunday
moment().format("MMM Do YY"); // Feb 18th 24
moment().format('YYYY [escaped] YYYY'); // 2024 escaped 2024
moment().format();
也就是说,Moment.js 已经完成了自己的使命。下面是来自 Moment.js 团队的官方声明:
- 不会添加新功能、特性
- 不会重新为 Moment.js 的 API 添加 immutable 特性
- 不会为 Moment.js 项目添加 tree shaking 或 bundle size 优化等能力
- 不会发布 V3 版本,即下一个重大版本更新
- 可能会选择不修复错误、怪癖行为,尤其是长期存在的已知问题
2.什么是 Tempo
Tempo 是一个新的 JavaScript 库,继承了 JavaScript 日期和时间库的光荣传统。 受到 Moment.js、day.js 和 date-fns 等工具的启发,Tempo 从头开始构建,尽可能小且易于使用,同时包括对时区操作的一流支持。
Parse, format, manipulate, and internationalize dates and times in JavaScript and TypeScript.
Tempo 可以被认为是用于处理本机 Date 对象的实用程序集合,这是与其他提供自定义日期基元的库(Custom date Primitives)的重要区别。 在底层,Tempo 挖掘 JavaScript 的 Intl.DateTimeFormat 来提取复杂的数据,例如:时区偏移和区域设置感知日期格式,为开发者提供一个简单的 API 来格式化、解析和操作日期。
目前 Tempo 在 Github 通过 MIT 协议开源,有超过 1k 的 star、是一个值得长期关注的前端开源项目。
3.如何使用 Tempo
3.1 安装 Tempo
为了使其更容易使用,只需要使用软件包管理器安装即可:
pnpm add @formkit/tempo
// pnpm
npm install @formkit/tempo
// npm
yarn add @formkit/tempo
// yarn
bun install @formkit/tempo
// bun
由于 tempo 只是函数的集合,因此开发者可以通过从 @formkit/tempo 项目导入来使用,非常适合 Tree Shaking。
import {format, parse} from "@formkit/tempo"
const readable = format(new Date(), "full")
parse(readable, "full")
输出内容如下:
2024 年 2 月 18 日星期日
Date: 2024-02-17T16:00:00.000Z
3.2 Tempo 的 format 函数
format 的函数签名如下:
function format(
date: Date | string,
// strings must be ISO 8601
format: string | object,
locale?: string): string
// or
function format(
options: FormatOptions): string
Tempo 的 format() 函数以两种方式输出日期:
- 格式样式:了解如何向国际受众显示日期是很困难的。 幸运的是,Intl.DateTimeFormat 非常清楚用户根据其区域设置(或指定的区域设置)所期望的内容。
- 格式标记 : 如果已经知道需要显示的格式, Tempo 的格式标记以已经熟悉的方式提供这种能力。
值得注意的是,格式函数始终在本地时区运行。例如,2013-01-01T00:00:00Z 在美国东部时区的格式将为 12/31/2012 7:00 PM。
3.3 格式样式(format style)
最好使用用户熟悉的格式显示日期,Tempo 使用 Intl.DateTimeFormat 的语言敏感的日期和时间格式来简化此操作。 通过使用日期或时间 “样式”,开发者可以指示想要向最终用户显示日期的具体级别,但没有更多详细信息。 然后由 Intl.DateTimeFormat 决定如何最合适地显示日期。
使用 format() 函数时,第二个参数可以是以下任何日期样式,或具有日期属性的对象(例如:format(new Date(), { date: 'long' }))
- full:例如:2024 年 2 月 18 日星期日
- long:例如:2024 年 2 月 18 日
- medium:例如:2024 年 2 月 18 日
- short:例如:2024/2/18
import {format} from "@formkit/tempo"
const date = new Date()
// These are the same:
format(date, "full")
format(date, { date: "full"})
format(date, "long")
format(date, "medium")
format(date, "short")
// With an explicit locale:
format(date, "full", "it")
3.4 Tempo 的日期修改
日常开发中经常使用到的功能就是日期更改,这要是Moment.js等日期库大放异彩的地方。
Tempo 包含许多(tree-shakable)实用函数来帮助开发者满足日期修改需求。这些函数都接受 ISO 8601 字符串或 Date 对象并返回新的 Date 对象,而且不会更改日期参数。
比如常见的 addDay:
import {addDay} from "@formkit/tempo"
// Add 1 day
addDay("2013-03-15")
// Add 5 days
addDay("2013-03-15", 5)
// Subtract 3 days
addDay("2013-03-15", -3)
甚至 addHour、addMinute、addMonth、addSecond、addYear 等等:
function addMonth(
date: string | Date,
amount: number,
dateOverflow: boolean): Date
更多关于 Tempo 的用法可以参考文末参考资料,本文不再过多展开。
4.本文总结
本文主要和大家介绍 Tempo ,其是一个新的 JavaScript 库,继承了 JavaScript 日期和时间库的光荣传统。 受到 Moment.js、day.js 和 date-fns 等工具的启发,Tempo 从头开始构建,尽可能小且易于使用,同时包括对时区操作的一流支持。因为篇幅问题,关于 Tempo 只是做了一个简短的介绍,但是文末的参考资料提供了大量优秀文档以供学习,如果有兴趣可以自行阅读。如果大家有什么疑问欢迎在评论区留言。
参考资料
https://github.com/formkit/tempo
https://tempo.formkit.com/#introduction
https://github.com/moment/moment
https://dev.to/apijay/moment-js-is-done-43jn
https://www.youtube.com/watch?app=desktop&v=Vt0fNp96NMw
猜你喜欢
- 2024-12-07 (建议收藏) | 企业中Vue.js最常用的第三方插件
- 2024-12-07 前端基础:JavaScript
- 2024-12-07 SpringBoot @JsonFormat无法接收前端传递的日期字符串
- 2024-12-07 七爪源码:如何在 JavaScript 中从日期中减去 6 个月
- 2024-12-07 如何在 JavaScript 中按日期对对象数组进行排序
- 2024-12-07 JS Date对象的妙用:如何更优雅的计算时间差?
- 2024-12-07 在js中常见的时间格式及其转换
- 2024-12-07 Web前端最强JavaScript Excel处理插件——exceljs
- 2024-12-07 js获取时间戳的几种方式
- 2024-12-07 Axure高保真教程:日期时间下拉列表
- 最近发表
- 标签列表
-
- xml (46)
- css animation (57)
- array_slice (60)
- htmlspecialchars (54)
- position: absolute (54)
- datediff函数 (47)
- array_pop (49)
- jsmap (52)
- toggleclass (43)
- console.time (63)
- .sql (41)
- ahref (40)
- js json.parse (59)
- html复选框 (60)
- css 透明 (44)
- css 颜色 (47)
- php replace (41)
- css nth-child (48)
- min-height (40)
- xml schema (44)
- css 最后一个元素 (46)
- location.origin (44)
- table border (49)
- html tr (40)
- video controls (49)