解决JavaScript获取指定月份最后一天10位Unix时间戳错误问题
解决获取月份最后一天10位Unix时间戳的时区问题
嗨,我来帮你搞定这个问题!你的代码逻辑其实没毛病——new Date(date.getFullYear(), date.getMonth() + 1, 0)确实能准确拿到当月的最后一天,但问题出在时区差异上,导致你用UTC时间戳查询工具看到的日期不对。
问题根源
getTime()返回的是UTC时间戳(从1970年1月1日UTC开始的毫秒数),而你用new Date()生成的日期是基于本地时区的。举个例子:如果你的本地时区是UTC+5:30,那么本地时间5月31日00:00对应的UTC时间就是5月30日18:30,所以你拿到的时间戳查询UTC日期时,就会显示5月30日,但实际上本地时间是正确的5月31日。
两种可行解决方案
根据你需求的时区方向,选下面其中一种方法就行:
方案1:获取UTC时区的当月最后一天时间戳
如果你需要的是UTC标准下的当月最后一天(比如服务器统一用UTC时间),直接用Date.UTC()构造日期,完全绕开本地时区:
var date = new Date(); // 获取UTC时区的年、月 var utcYear = date.getUTCFullYear(); var utcMonth = date.getUTCMonth(); // 构造UTC时区的当月最后一天(00:00:00) var utcLastDay = new Date(Date.UTC(utcYear, utcMonth + 1, 0)); // 转换成10位时间戳 var monthLastDayUtc = Math.floor(utcLastDay.getTime() / 1000); console.log(monthLastDayUtc);
这个时间戳对应的UTC日期就是当月最后一天,完全符合你的预期。
方案2:获取本地时区当月最后一天的完整时间戳
如果你需要确保时间戳对应的UTC日期也显示为当月最后一天,可以把本地时间设置为当月最后一天的23:59:59,这样即使转换为UTC,也不会跳到前一天:
var date = new Date(); // 构造本地时区当月最后一天的23:59:59 var lastDay = new Date(date.getFullYear(), date.getMonth() + 1, 0, 23, 59, 59); // 转换成10位时间戳 var monthLastDay = Math.floor(lastDay.getTime() / 1000); console.log(monthLastDay);
比如你测试6月的情况,本地时间6月30日23:59:59对应的UTC时间是6月30日18:29:59(UTC+5:30时区),此时查询UTC时间戳就会显示6月30日,完全正确。
验证你的测试案例
用方案2测试你提供的6月案例:
var date = new Date('6/8/2018'); var lastDay = new Date(date.getFullYear(), date.getMonth() + 1, 0, 23, 59, 59); var monthLastDay = Math.floor(lastDay.getTime() / 1000); console.log(monthLastDay); // 输出的时间戳对应UTC时间6/30/2018,符合预期
内容的提问来源于stack exchange,提问作者Tavish Aggarwal
相关产品推荐
相关产品推荐

