如何让JavaScript日期时间的秒数保留两位小数格式
问题
我尝试用下面的JavaScript代码生成格式为YYYY-MM-ddThh:mm:ssZ的日期时间,即使设置了new Date().getSeconds().toFixed(2),输出的seconds部分还是三位小数(比如输出示例2012-06-01T09:54:18.000Z),我想让seconds部分显示为两位小数(比如2012-06-01T09:54:18.00Z),该怎么实现?
代码:
static getTimeRangeFor(day, month, year) { let msg = undefined; const nowHours = new Date().getHours(); const nowMinutes = new Date().getMinutes(); const nowSeconds = new Date().getSeconds().toFixed(0); const asDate = new Date(year + '-' + month + '-' + day + ' ' + nowHours + ':' + nowMinutes + ':' + nowSeconds); const asTimeRange = new Date(year + '-' + month + '-' + day + ' ' + nowHours + ':' + nowMinutes + ':' + nowSeconds).getTime(); msg = JSON.stringify({ msg: infoTag + 'getTimeRangeFor():',asDate:asDate}); console.info(msg); msg = JSON.stringify({ msg: infoTag + 'getTimeRangeFor():',asTimeRange:asTimeRange}); console.info(msg); const obj = { asTimeRange, asDate, nowHours, nowMinutes, nowSeconds, }; return obj; }
当前输出:
2012-06-01T09:54:18.000Z
解决方案
问题核心是JSON.stringify序列化Date对象时,会自动调用toJSON()方法,输出带三位毫秒的标准ISO格式字符串,和你手动处理的秒数无关。要实现两位小数的秒部分,需要手动控制输出格式,以下是两种可行方法:
方法1:手动构建目标格式字符串
直接按需求拼接年、月、日、时、分、秒,确保各部分格式符合要求,秒数固定为两位小数:
static getTimeRangeFor(day, month, year) { let msg = undefined; const now = new Date(); // 补前导零保证两位格式 const nowHours = String(now.getHours()).padStart(2, '0'); const nowMinutes = String(now.getMinutes()).padStart(2, '0'); // 格式化秒为两位小数 const nowSeconds = now.getSeconds().toFixed(2); // 手动拼接目标格式字符串 const formattedDate = `${year}-${String(month).padStart(2, '0')}-${String(day).padStart(2, '0')}T${nowHours}:${nowMinutes}:${nowSeconds}Z`; const asTimeRange = new Date(`${year}-${month}-${day} ${nowHours}:${nowMinutes}:${nowSeconds}`).getTime(); msg = JSON.stringify({ msg: infoTag + 'getTimeRangeFor():', formattedDate }); console.info(msg); msg = JSON.stringify({ msg: infoTag + 'getTimeRangeFor():', asTimeRange }); console.info(msg); const obj = { asTimeRange, formattedDate, nowHours, nowMinutes, nowSeconds, }; return obj; }
方法2:修改序列化后的字符串
如果需要保留Date对象,可在序列化后替换掉三位毫秒为两位:
static getTimeRangeFor(day, month, year) { let msg = undefined; const nowHours = new Date().getHours(); const nowMinutes = new Date().getMinutes(); const nowSeconds = new Date().getSeconds().toFixed(2); const asDate = new Date(`${year}-${month}-${day} ${nowHours}:${nowMinutes}:${nowSeconds}`); const asTimeRange = asDate.getTime(); // 序列化后替换三位毫秒为两位小数格式 const serializedData = JSON.stringify({ msg: infoTag + 'getTimeRangeFor():', asDate }); const modifiedData = serializedData.replace(/\.000Z/g, '.00Z'); console.info(modifiedData); msg = JSON.stringify({ msg: infoTag + 'getTimeRangeFor():', asTimeRange }); console.info(msg); const obj = { asTimeRange, asDate, nowHours, nowMinutes, nowSeconds, }; return obj; }
关键说明
- 方法1更可靠,完全自主控制输出格式,避免依赖
Date对象的默认序列化行为; - 注意用
padStart(2, '0')给月、日、时、分补前导零,保证格式统一(例如1月转为01,9点转为09); toFixed(2)会将秒数格式化为两位小数,例如18秒变为18.00,18.3秒变为18.30。
内容的提问来源于stack exchange,提问作者Amrmsmb
相关产品推荐
相关产品推荐

