本文已参与「 新人创作礼 」活动,一起开启掘金创作之路
前几天一直偷懒,都是前期的一些积累文章。
今天我也想说说,我个人的一些前端面试中问道的一些题目。
当然这个题未必也是最好的解法,如果你有更好的方式,可以在评论区留言。
年初面试了Coupang公司,其中一轮面试有一个这样的面试题。
大致凭借记忆还原下,面试官当时说:我问一个简单的笔试题,当时前面问的时间大致20分钟,写一个函数传入一个时间戳,不能用内置函数( Date等等... )方法,返回一个格式化的日期YYYY:MM:DD HH:mm:ss
当时情况是,我有点紧张,这个题做到最后好像超时了,没有继续下去,输出结果没有对,然后就结束了。
后面我思考了下,这道题其实也未必如面试官说的简单,其实有很多知识点。
我的思路是:从格林威治时间开始往后进行+,这里面有下面几个卡点需要知道。
1. 时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数。
2.平年、闰年计算方法。
3.通过取模,天时分秒需要进行取整处理
let timestamp = Date.now() + ( 8*60*60*1000 )
//得到当前的年月日时分秒
function formatTimestamp(timestamp) {
let second = parseInt(timestamp/1000); //秒
let moduloSecond = second%60; //取模秒
let minute = parseInt(second/60); //分
let moduloMinute = minute%60;//取模分
let hour = parseInt(minute/60);//时
let moduloHour = hour%24;//取模时
// 年月日 需要计算 平年 闰年 1970年开始减
//let surplus = timestamp - 1970*12*24*60*60*1000;
let baseYear = 1970; //基础年 , 考虑东八区还要+8个小时
let surplusTimestamp = timestamp;
let flag = true;
let dayOfMonths = [ 31 , 28 , 31 , 30 , 31 , 30 , 31, 31 , 30 , 31 , 30 , 31 ]
while (true) {
let sumDay = 365;
if (baseYear%400===0 || ( baseYear%4===0 && baseYear%100!==0 )) {
sumDay = 366;
}
surplusTimestamp -= sumDay*24*60*60*1000;
if (surplusTimestamp <= 0) {
surplusTimestamp += sumDay*24*60*60*1000;
if ( sumDay === 366 ) {
dayOfMonths[1] = 29;
}
break;
}
baseYear++;
}
let year = baseYear;
//计算月
let baseMouth = 1 , day = undefined;
for (let i = 0 , j = 12 ; i < j ; i++) {
surplusTimestamp-=dayOfMonths[i]*24*60*60*1000;
if (surplusTimestamp<=0) {
surplusTimestamp+=dayOfMonths[i]*24*60*60*1000;
day = parseInt(surplusTimestamp/(24*60*60*1000)) + 1
break;
}
baseMouth++;
}
return year+"-"+baseMouth + "-" + day + " "+ moduloHour+":"+moduloMinute+":" + moduloSecond
}
let dateString = formatTimestamp(timestamp)
console.log (dateString)
大家可以打开这个连接验证结果:tool.lu/coderunner/…
同时也欢迎大家的意见!
希望我可以日更坚持下!!!