Coupang 面试题 - 时间戳格式化函数

1,938 阅读2分钟

本文已参与「 新人创作礼 」活动,一起开启掘金创作之路

关于如何进行图片优化 - 适合的才是最好的

前几天一直偷懒,都是前期的一些积累文章。

今天我也想说说,我个人的一些前端面试中问道的一些题目。

当然这个题未必也是最好的解法,如果你有更好的方式,可以在评论区留言。

年初面试了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/…

同时也欢迎大家的意见!

希望我可以日更坚持下!!!