如何将JavaScript的new Date()转为带纽约时区偏移的指定格式?
问题描述
现有一段创建Date对象的JavaScript代码:
const start = new Date(); console.log(start);
执行后输出为2023-12-14T20:11:12.388Z,当前时区为America/New_York(比UTC晚5小时),需要将Date对象转换为2023-12-14T15:11:12-05:00格式。尝试了以下代码但未得到预期结果:
const start = new Date(); const dateFormat = new Intl.DateTimeFormat("en-US", { timeZone: "America/New_York", dateStyle: "short", timeStyle: "long" }); console.log(dateFormat.format(start));
需求:使用原生JavaScript或date-fns库实现目标格式转换。
方案一:原生JavaScript实现
方法1:通过Intl.DateTimeFormat解析组件后拼接
利用formatToParts方法提取时间各组件,再手动构造目标格式:
const formatToNYTime = (date) => { const options = { timeZone: "America/New_York", year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit', second: '2-digit', hour12: false }; // 获取格式化后的各个时间组件 const parts = new Intl.DateTimeFormat('en-US', options).formatToParts(date); // 提取所需字段 const year = parts.find(p => p.type === 'year').value; const month = parts.find(p => p.type === 'month').value; const day = parts.find(p => p.type === 'day').value; const hour = parts.find(p => p.type === 'hour').value; const minute = parts.find(p => p.type === 'minute').value; const second = parts.find(p => p.type === 'second').value; // 计算时区偏移格式 const tzOffset = new Date(date.toLocaleString('en-US', {timeZone: "America/New_York"})).getTimezoneOffset(); const offsetHours = Math.floor(Math.abs(tzOffset)/60); const offsetMinutes = Math.abs(tzOffset)%60; const offsetSign = tzOffset > 0 ? '-' : '+'; // 拼接成目标格式 return `${year}-${month}-${day}T${hour}:${minute}:${second}${offsetSign}${offsetHours.toString().padStart(2, '0')}:${offsetMinutes.toString().padStart(2, '0')}`; }; const start = new Date('2023-12-14T20:11:12.388Z'); console.log(formatToNYTime(start)); // 输出:2023-12-14T15:11:12-05:00
方法2:手动转换时区后构造格式
先将UTC时间转换为纽约时区时间,再提取各时间字段拼接:
const formatToNYTime = (date) => { // 转换为纽约时区时间 const nyDate = new Date(date.toLocaleString('en-US', { timeZone: 'America/New_York' })); // 提取补零后的时间字段 const year = nyDate.getFullYear(); const month = String(nyDate.getMonth() + 1).padStart(2, '0'); const day = String(nyDate.getDate()).padStart(2, '0'); const hour = String(nyDate.getHours()).padStart(2, '0'); const minute = String(nyDate.getMinutes()).padStart(2, '0'); const second = String(nyDate.getSeconds()).padStart(2, '0'); // 生成时区偏移字符串 const tzOffset = nyDate.getTimezoneOffset(); const offsetHours = Math.floor(Math.abs(tzOffset)/60); const offsetMinutes = Math.abs(tzOffset)%60; const offsetSign = tzOffset > 0 ? '-' : '+'; return `${year}-${month}-${day}T${hour}:${minute}:${second}${offsetSign}${offsetHours.toString().padStart(2, '0')}:${offsetMinutes.toString().padStart(2, '0')}`; }; const start = new Date('2023-12-14T20:11:12.388Z'); console.log(formatToNYTime(start)); // 输出:2023-12-14T15:11:12-05:00
方案二:使用date-fns库实现
需先安装依赖包:
npm install date-fns date-fns-tz
通过utcToZonedTime转换时区,再用format方法直接生成目标格式:
import { format } from 'date-fns'; import { utcToZonedTime } from 'date-fns-tz'; const start = new Date('2023-12-14T20:11:12.388Z'); const timeZone = 'America/New_York'; // 将UTC时间转换为纽约时区时间 const nyTime = utcToZonedTime(start, timeZone); // 格式化目标格式 const formattedDate = format(nyTime, "yyyy-MM-dd'T'HH:mm:ssXXX", { timeZone }); console.log(formattedDate); // 输出:2023-12-14T15:11:12-05:00
内容的提问来源于stack exchange,提问作者user3552178
相关产品推荐
相关产品推荐

