如何将react-datepicker返回的丹佛时区日期转换为纽约时区?
实现方案
要生成纽约时区指定格式的时间字符串,并确保其转换为UTC后为2022-10-27T06:00:00Z,可以通过以下几种方式实现:
方法一:使用Luxon库(推荐)
Luxon是轻量且可靠的时区与日期格式化库,语法简洁易维护:
- 安装依赖:
npm install luxon
- 代码实现:
import { DateTime } from 'luxon'; // 构造纽约时区的目标时间 const nyTargetTime = DateTime.fromObject( { year: 2022, month: 10, day: 27, hour: 2 }, { zone: 'America/New_York' } ); // 格式化为需求的字符串 const formattedNyTime = nyTargetTime.toFormat('EEE MMM dd yyyy HH:mm:ss \'GMT\'ZZ (zzzz)'); console.log(formattedNyTime); // 输出:Thu Oct 27 2022 02:00:00 GMT-0400 (Eastern Daylight Time) // 验证UTC转换结果 const utcIsoString = nyTargetTime.toUTC().toISO(); console.log(utcIsoString); // 输出:2022-10-27T06:00:00.000Z
方法二:使用date-fns-tz库
若已在项目中使用date-fns,可搭配date-fns-tz处理时区:
- 安装依赖:
npm install date-fns date-fns-tz
- 代码实现:
import { format, utcToZonedTime } from 'date-fns-tz'; // 定义目标UTC时间(纽约02:00对应UTC06:00) const targetUtcDate = new Date('2022-10-27T06:00:00Z'); const nyTimeZone = 'America/New_York'; // 转换为纽约时区的日期对象 const nyZonedDate = utcToZonedTime(targetUtcDate, nyTimeZone); // 格式化为需求字符串 const formattedNyTime = format( nyZonedDate, 'EEE MMM dd yyyy HH:mm:ss \'GMT\'XX (zzzz)', { timeZone: nyTimeZone } ); console.log(formattedNyTime); // 输出:Thu Oct 27 2022 02:00:00 GMT-0400 (Eastern Daylight Time) // 验证UTC转换 console.log(targetUtcDate.toISOString()); // 输出:2022-10-27T06:00:00.000Z
方法三:原生JavaScript实现(无需第三方库)
通过Intl.DateTimeFormat手动构造目标格式:
// 定义目标UTC时间 const targetUtcDate = new Date('2022-10-27T06:00:00Z'); // 创建纽约时区的格式化器 const nyFormatter = new Intl.DateTimeFormat('en-US', { timeZone: 'America/New_York', weekday: 'short', month: 'short', day: '2-digit', year: 'numeric', hour: '2-digit', minute: '2-digit', second: '2-digit', timeZoneName: 'long' }); // 提取格式化后的各个部分 const formatParts = nyFormatter.formatToParts(targetUtcDate); const partsMap = {}; formatParts.forEach(part => partsMap[part.type] = part.value); // 拼接成需求的字符串格式 const formattedNyTime = `${partsMap.weekday} ${partsMap.month} ${partsMap.day} ${partsMap.year} ${partsMap.hour}:${partsMap.minute}:${partsMap.second} GMT-0400 (${partsMap.timeZoneName})`; console.log(formattedNyTime); // 输出:Thu Oct 27 2022 02:00:00 GMT-0400 (Eastern Daylight Time) // 验证UTC转换 console.log(targetUtcDate.toISOString()); // 输出:2022-10-27T06:00:00.000Z
注意:你提到的react-datepicker返回的丹佛本地时间(对应UTC08:00Z)与需求的纽约时间是两个不同的时间点,以上代码是直接构造需求的纽约时区时间,而非转换原丹佛时间。
内容的提问来源于stack exchange,提问作者KingJoeffrey
相关产品推荐
相关产品推荐

