TypeScript 中的日期和时间处理:从 A 到 Z

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

引言:为什么在 TypeScript 中处理日期需要特别注意



日期和时间处理是 Web 开发中最常见但也最棘手的任务之一。在作为 JavaScript 严格类型化超集的 TypeScript 中,Date 对象继承了其前身的所有“特点”:不直观的月份(从零开始计数)、方法的可变性以及时区问题。然而,通过使用严格的类型化和现代库,您可以编写安全、可预测且可读的时间处理代码。



在本文中,我们将介绍开发人员需要了解的所有内容:从基本的日期创建到时区和格式化的高级处理。您将学习如何避免常见错误,以及哪些工具(内置和第三方)最适合 TypeScript 项目。



1. 基础:Date 对象及其在 TypeScript 中的类型化



创建和基本方法



在 TypeScript 中,与 JavaScript 一样,使用内置的 Date 对象来处理日期。TypeScript 为其提供了现成的类型,因此无需额外定义。



// 创建当前日期const now: Date = new Date();console.log(now); // 2024-01-15T10:30:00.000Z

// 从字符串创建(ISO 8601)const specificDate: Date = new Date('2024-12-31T23:59:59');

// 从组件创建(年、月 [0-11]、日、时...)const birthday: Date = new Date(1990, 0, 15); // 1990 年 1 月 15 日// 注意:月份 0 = 一月!


可变性问题



Date 对象的方法会修改原始对象。这可能导致意外的错误。TypeScript 无法在类型层面防止这种情况,但您可以使用不可变的方法。



const date = new Date('2024-01-01');date.setDate(date.getDate() + 5); // 可变!date 现在是 1 月 6 日// 最好创建一个新对象:const newDate = new Date(date.getTime() + 5 * 24 * 60 * 60 * 1000);


Unix 时间戳的类型化



日期通常以数字形式传递(自 1970 年以来的毫秒数)。使用类型别名以提高清晰度:



type UnixTimestamp = number;

function formatTimestamp(ts: UnixTimestamp): string { return new Date(ts).toISOString();}

const myTimestamp: UnixTimestamp = 1705315200000;console.log(formatTimestamp(myTimestamp));


2. 日期格式化和解析



内置格式化方法



JavaScript 提供了基本的本地化输出方法。它们在 TypeScript 中“开箱即用”:



const date = new Date('2024-06-15T14:30:00');

// 本地化字符串console.log(date.toLocaleDateString('ru-RU')); // "15.06.2024"console.log(date.toLocaleTimeString('en-US')); // "2:30:00 PM"console.log(date.toLocaleString('de-DE')); // "15.6.2024, 14:30:00"

// ISO 字符串(方便用于 API)console.log(date.toISOString()); // "2024-06-15T11:30:00.000Z"(始终为 UTC)


解析字符串:风险



通过构造函数 new Date(str) 解析字符串可能会在不同浏览器中产生意外结果。最好使用带有显式检查的 Date.parse() 或第三方库。



// 不可靠的方法const parsed = new Date('2024/01/15'); // 可能运行不稳定

// 可靠的方法:ISO 8601const safeParse = (dateStr: string): Date | null => { const ts = Date.parse(dateStr); return isNaN(ts) ? null : new Date(ts);};

const result = safeParse('2024-01-15T10:00:00Z');if (result) { console.log(result.toISOString());}


3. 高级操作和比较



日期比较



日期可以直接通过比较运算符进行比较,但为了精确比较(相等性),需要转换为数字:



const date1 = new Date('2024-01-01');const date2 = new Date('2024-01-0                

博客

书籍推荐