为什么使用 toISOString() 后时间变成了英国时间?怎么改成国内时间

在这里插入图片描述


为什么使用 toISOString() 后时间变成了英国时间?

在 JavaScript 中,toISOString() 方法返回的是一个基于 UTC 时间的 ISO 8601 格式的字符串。无论在 moment 对象上设置了什么时区偏移量,toISOString() 返回的时间始终是 UTC 时间。这意味着,如果在本地时区修改了 moment 对象,但仍然调用 toISOString(),最终得到的时间将是 UTC 时间(即格林威治标准时间或英国时间)。

解决方案:使用 format() 方法输出特定时区的时间

如果希望得到一个特定时区的时间字符串,而不是默认的 UTC 时间,可以使用 momentformat() 方法来自定义输出格式,并确保时区偏移量正确应用。

如何确保时区偏移量生效

为了确保在输出时使用你想要的时区偏移量,可以在调用 format() 方法时保持 moment 对象的时区偏移量。可以通过 utcOffset() 方法来设置时区偏移量,从而保证输出的时间符合你所在的时区。

代码示例:确保时区偏移量正确应用

假设需要根据用户设定的充电时间来生成计划开始和结束的时间。为了确保时间字符串包含正确的时区偏移量,以下是如何使用 format() 方法和 utcOffset() 来实现:

import moment from 'moment';

// 假设这些值已经定义
const currentGun = { value: { chargingPileId: 123 } };
const chargingPlanType = { value: 'someType' };
const chargeHour = { value: 2 };
const chargeMinute = { value: 30 };

let params = {
    "chargingPileId": currentGun.value.chargingPileId,
    'chargingPlanType': chargingPlanType.value,
    "planLeaveDt": moment()
        .utcOffset('+08:00') // 设置时区偏移量为 +08:00(例如中国标准时间)
        .add(Number(chargeHour.value * 60) + Number(chargeMinute.value), 'minutes') // 增加充电时长
        .format('YYYY-MM-DDTHH:mm:ss.SSSZ'), // 使用 format 方法确保输出的时间包括时区偏移量
    "planStartDt": moment()
        .utcOffset('+08:00') // 设置时区偏移量
        .add(Number(chargeHour.value * 60) + Number(chargeMinute.value), 'minutes') // 增加充电时长
        .format('YYYY-MM-DDTHH:mm:ss.SSSZ') // 输出符合时区偏移量的时间字符串
};

console.log('params123', params, chargeHour.value, chargeMinute.value);
console.log('params123', chargeHour.value, chargeMinute.value, Number(chargeHour.value * 60) + Number(chargeMinute.value), moment()
    .utcOffset('+08:00')
    .add(Number(chargeHour.value * 60) + Number(chargeMinute.value), 'minutes')
    .format('YYYY-MM-DDTHH:mm:ss.SSSZ'));

let titleMsg = '准备充电中';

代码解析

  1. utcOffset('+08:00'): 设置时区偏移量。这里假设时区为中国标准时间(CST),即 UTC+8。可以根据需要调整为其他时区,例如 utcOffset('-05:00') 代表美国东部时间(ET)。

  2. add(): 在当前时间基础上增加指定的分钟数,表示充电计划的时间。例如,将小时和分钟转换为总分钟数,然后加到当前时间。

  3. format('YYYY-MM-DDTHH:mm:ss.SSSZ'): 使用 format() 方法生成符合 ISO 8601 标准的时间字符串。这里 SSSZ 表示毫秒和时区偏移量,确保输出的时间字符串包括时区信息,例如 +08:00

format() 方法的时间格式说明

  • YYYY: 四位数的年份。
  • MM: 两位数的月份(01 到 12)。
  • DD: 两位数的日期(01 到 31)。
  • HH: 两位数的小时(24 小时制,00 到 23)。
  • mm: 两位数的分钟(00 到 59)。
  • ss: 两位数的秒(00 到 59)。
  • SSS: 毫秒(000 到 999)。
  • Z: 时区偏移量,例如 +08:00

为什么选择 format() 而不是 toISOString()

  • toISOString() 方法默认返回 UTC 时间,而如果需要一个包含本地时区偏移量的时间字符串,它并不适用。
  • format() 方法提供了灵活性,允许根据需要自定义输出格式,并正确应用时区偏移量,确保输出的时间符合你所在的时区。

您好,我是肥晨。
欢迎关注我获取前端学习资源,日常分享技术变革,生存法则;行业内幕,洞察先机。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奶糖 肥晨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值