Moment v2.30.1设置startDateTime为America/Chicago时区失败
我们使用Moment v2.30.1,尝试为对象的startDateTime字段设置America/Chicago时区的时间,但该值始终被设为UTC时间,isUTC属性一直为true——哪怕显示的是芝加哥时区的时间,发送到后端时仍会变成UTC格式。
相关代码定义
对象接口:
export interface ExPCReq extends BaseModel { description: string | null | undefined; action: PA; startDateTime?: moment.Moment; userId: number; }
当前默认的UTC设置方式:
const pCReq: ExPCReq = { description: this.paFrmGrp.get('descriptionCtrl')?.value as string, action: PA.Move, startDateTime: moment.utc(), userId: this.userService.userDetails.value.userId };
尝试过的无效写法
下面的写法会导致startDateTime为null,提示无效日期,推测是错误地将字符串作为日期传入:
const pCReq: ExPCReq = { description: this.paFrmGrp.get('descriptionCtrl')?.value as string, action: PA.Move, startDateTime: moment.tz(moment.toString(), "MM/DD/YYYY h:mm a", "America/Chicago"), userId: this.userService.userDetails.value.userId };
补充尝试
尝试以下写法后,startDateTime显示为Thu Oct 24 2024 05:34:53 GMT-0500 (Central Daylight Time),但isUTC仍为true,发送到后端还是UTC时间:
const pCReq: ExPCReq = { description: this.paFrmGrp.get('descriptionCtrl')?.value as string, action: PA.Move, startDateTime: moment.utc().tz("America/Chicago"), userId: this.userService.userDetails.value.userId };
直接使用moment.tz("America/Chicago")设置,结果同样是isUTC为true,发送后端为UTC时间。
解决方法
确保安装并引入moment-timezone插件
首先确认项目已安装moment-timezone,未安装则执行:npm install moment-timezone --save代码中正确引入:
import moment from 'moment-timezone';正确创建芝加哥时区时间实例
不要通过moment.utc()转换,直接用moment.tz()创建指定时区的时间:const pCReq: ExPCReq = { description: this.paFrmGrp.get('descriptionCtrl')?.value as string, action: PA.Move, startDateTime: moment.tz("America/Chicago"), userId: this.userService.userDetails.value.userId };此时
startDateTime.isUTC()会返回false,因为这是带时区信息的本地时间实例。处理后端序列化问题
如果发送到后端仍转成UTC,检查序列化逻辑。默认Moment对象会序列化为ISO格式(带UTC偏移),若要发送时区对应本地时间字符串,可手动格式化后传入(需同步修改接口类型为string或确保后端能解析):startDateTime: moment.tz("America/Chicago").format("YYYY-MM-DD HH:mm:ss")验证时区设置
创建实例后可通过以下代码验证:const chicagoTime = moment.tz("America/Chicago"); console.log(chicagoTime.format()); // 输出带时区偏移的字符串 console.log(chicagoTime.isUTC()); // 应返回false console.log(chicagoTime.tz()); // 应返回"America/Chicago"
内容的提问来源于stack exchange,提问作者MB34

