You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Moment v2.30.1设置startDateTime为America/Chicago时区失败

Moment v2.30.1 无法设置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时间。


解决方法

  1. 确保安装并引入moment-timezone插件
    首先确认项目已安装moment-timezone,未安装则执行:

    npm install moment-timezone --save
    

    代码中正确引入:

    import moment from 'moment-timezone';
    
  2. 正确创建芝加哥时区时间实例
    不要通过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,因为这是带时区信息的本地时间实例。

  3. 处理后端序列化问题
    如果发送到后端仍转成UTC,检查序列化逻辑。默认Moment对象会序列化为ISO格式(带UTC偏移),若要发送时区对应本地时间字符串,可手动格式化后传入(需同步修改接口类型为string或确保后端能解析):

    startDateTime: moment.tz("America/Chicago").format("YYYY-MM-DD HH:mm:ss")
    
  4. 验证时区设置
    创建实例后可通过以下代码验证:

    const chicagoTime = moment.tz("America/Chicago");
    console.log(chicagoTime.format()); // 输出带时区偏移的字符串
    console.log(chicagoTime.isUTC()); // 应返回false
    console.log(chicagoTime.tz()); // 应返回"America/Chicago"
    

内容的提问来源于stack exchange,提问作者MB34

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 02:37:17