文章目录
为什么使用 toISOString()
后时间变成了英国时间?
在 JavaScript 中,toISOString()
方法返回的是一个基于 UTC 时间的 ISO 8601 格式的字符串。无论在 moment
对象上设置了什么时区偏移量,toISOString()
返回的时间始终是 UTC 时间。这意味着,如果在本地时区修改了 moment
对象,但仍然调用 toISOString()
,最终得到的时间将是 UTC 时间(即格林威治标准时间或英国时间)。
解决方案:使用 format()
方法输出特定时区的时间
如果希望得到一个特定时区的时间字符串,而不是默认的 UTC 时间,可以使用 moment
的 format()
方法来自定义输出格式,并确保时区偏移量正确应用。
如何确保时区偏移量生效
为了确保在输出时使用你想要的时区偏移量,可以在调用 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 = '准备充电中';
代码解析
-
utcOffset('+08:00')
: 设置时区偏移量。这里假设时区为中国标准时间(CST),即 UTC+8。可以根据需要调整为其他时区,例如utcOffset('-05:00')
代表美国东部时间(ET)。 -
add()
: 在当前时间基础上增加指定的分钟数,表示充电计划的时间。例如,将小时和分钟转换为总分钟数,然后加到当前时间。 -
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()
方法提供了灵活性,允许根据需要自定义输出格式,并正确应用时区偏移量,确保输出的时间符合你所在的时区。
您好,我是肥晨。
欢迎关注我获取前端学习资源,日常分享技术变革,生存法则;行业内幕,洞察先机。