TypeScript中转换yyyy-MM-dd hh格式字符串为日期及修改GMT方法
TypeScript 字符串转日期:处理 yyyy-MM-dd hh 格式与时区调整
一、解决 yyyy-MM-dd hh 格式解析失败的问题
new Date() 对非ISO 8601标准格式的字符串解析兼容性差,yyyy-MM-dd hh 这种带空格的小时格式不属于标准格式,因此会返回无效日期。可以通过以下两种方法处理:
方法1:手动拆分字符串构造日期
直接拆分字符串中的年、月、日、小时,用Date构造函数手动创建日期(注意月份是0起始,需要减1):
const dateStr = '2022-07-01 01'; const [datePart, hour] = dateStr.split(' '); const [year, month, day] = datePart.split('-').map(Number); // 构造日期:year, month(0-11), day, hour const date = new Date(year, month - 1, day, hour);
方法2:转换为ISO 8601标准格式
把空格替换为T,补全分钟和秒,转成标准ISO格式后再解析:
const dateStr = '2022-07-01 01'; // 转换为 '2022-07-01T01:00:00' const isoDateStr = dateStr.replace(' ', 'T') + ':00:00'; const date = new Date(isoDateStr);
二、调整GMT时区
Date对象本质是基于UTC的时间戳,但可以通过以下方式控制解析或显示时的时区:
1. 构造时指定时区
在ISO格式字符串末尾添加时区偏移,比如要解析为GMT+08:00的时间:
const dateStr = '2022-07-01 01'; const isoWithTimezone = dateStr.replace(' ', 'T') + ':00:00+08:00'; const date = new Date(isoWithTimezone);
2. 调整现有日期的时区偏移
如果已有一个Date对象,要转换到目标时区,可以通过计算时区偏移量调整时间戳:
const originalDate = new Date('2022-07-01'); // 目标时区:GMT+7(偏移分钟数为7*60) const targetTimezoneOffset = 7 * 60; // 当前本地时区的偏移(UTC与本地时间的分钟差,比如GMT+8的话是-480) const localOffset = originalDate.getTimezoneOffset(); // 计算调整后的时间戳 const adjustedTimestamp = originalDate.getTime() + (targetTimezoneOffset + localOffset) * 60 * 1000; const adjustedDate = new Date(adjustedTimestamp);
注意
Date对象的toString()方法会默认显示本地时区的时间,如果需要以指定时区格式化输出,可以用toLocaleString并指定时区参数:
const date = new Date('2022-07-01T01:00:00'); // 以GMT+7时区格式化输出(Asia/Bangkok对应GMT+7) console.log(date.toLocaleString('en-US', { timeZone: 'Asia/Bangkok' }));
内容的提问来源于stack exchange,提问作者Phạm Cường
相关产品推荐
相关产品推荐

