原因:原本我是想处理一下后台返回的时间问题,我需要展示:年月日,但是后台返回了:年月日时分秒,开始我是这么写的:(不严谨代码)
function formatDate(dateTime) {
const date = new Date(dateTime) // 创建一个新的Date对象,尝试将传入的dateTime字符串解析为日期和时间
// 如果dateTime是一个有效的日期时间字符串,那么date对象将包含该日期和时间的信息
// 如果dateTime不是一个有效的日期时间字符串,那么date对象将是一个"Invalid Date"
return date.toISOString().split('T')[0] // 调用date对象的toISOString()方法,这会返回一个代表该日期时间的ISO 8601扩展格式的字符串
// ISO 8601扩展格式通常是这样的:"YYYY-MM-DDTHH:mm:ss.sssZ"
// 例如:"2023-06-20T12:34:56.789Z"
// 然后,使用split('T')方法将字符串分割成两部分,以'T'字符为分隔符
// 这将返回一个数组,例如:["2023-06-20", "12:34:56.789Z"]
// 最后,通过访问数组的第一个元素(索引为0),我们得到日期部分:"2023-06-20"
// 所以,这个函数的作用是:将传入的dateTime字符串解析为日期,并返回该日期的ISO 8601格式中的日期部分(不带时间)
}
// 使用示例
const formattedDate = formatDate("2024-05-01 00:00:00")
console.log(formattedDate)// 输出 "2024-04-30"
但是:这样输入 "2024-05-01 00:00:00" 会导致出现 "2024-04-30" 的情况,原因是:date.toISOString().全球通用时间,会减8个小时, 我们在东8区
这时候我们就要修改一下代码:
方法一:这个方法最简单直接加八小时就行
function formatDate(dateTime) {
const date = new Date(+new Date(dateTime) + 8 * 3600 * 1000)
return date.toISOString().split('T')[0]
}
// 使用示例
const formattedDate = formatDate("2024-05-01 00:00:00")
console.log(formattedDate)// 输出 "2024-05-01"
方法二:这个方法哩更加可靠
function formatDate(dateTime) {
// 创建一个新的Date对象,使用传入的dateTime作为参数(dateTime应该是一个可以解析为日期的字符串或时间戳)
const date = new Date(dateTime)
// 获取年份(四位数)
const year = date.getFullYear()
// 获取月份(从0开始,所以需要+1),然后使用padStart方法确保月份总是两位数,不足两位时前面补0
const month = String(date.getMonth() + 1).padStart(2, '0')
// 获取日期(一个月中的第几天),同样使用padStart方法确保日期总是两位数
const day = String(date.getDate()).padStart(2, '0')
// 使用模板字符串将年份、月份和日期组合成一个形如"YYYY-MM-DD"的字符串,并返回
return `${year}-${month}-${day}`
}
// 使用示例
const formattedDate = formatDate("2024-05-01 00:00:00")
console.log(formattedDate)// 输出 "2024-05-01"