Date杂谈

工作中,经常会需要处理时间!刚开始的时候是使用moment插件,非常强大的一款插件,能够满足工作需求。但是,随着项目的不断扩展,就需要对项目进行一些“瘦身”,基于“杀鸡焉用牛刀”的想法,就自己动手写了一些帮助函数,目前基本能够满足平时工作的需要。
先来看看写的代码的运行效果

  1. DateUTC,用于生成一个Date对象


    image.png

    可能大家会比较奇怪,已经有new Date()方法,为什么还要写一个用法一直的DateUTC方法,来看下面的


    image.png

new Date('2018-04-01')得到的时间是早上8点而不是0点,这是因为本地时间和格林威治时间有一个时间差。getTimezoneOffset返回时间差。所以用一个函数DateUTC来对Date做了一层封装

function DateUTC (date) {
  let isDate = (typeof date === 'object') && (date instanceof Date)
  if (isDate) return date
  let localDate
  try {
    localDate = date === undefined ? new Date() : new Date(date)
  } catch (e) {
    console.error(e)
  }
  if (date && /^\d{4}(-\d{2}){0,2}$/.test(date)) {
    let timeZoneOffset = localDate.getTimezoneOffset()
    let utcTimeStamp = localDate.getTime() + timeZoneOffset * 60 * 1000
    return new Date(utcTimeStamp)
  }
  return localDate
}

工作中,我们可能经常会有这样子的场景,比如在选择时间段的时候,需要取今后的某个时间段。比如,判断两个日期的时间差,以及以固定的格式展示时间等等。个人手写了以下一些代码,运行结果如图


image.png
image.png

最后一个dateSpec(好吧,我承认方法名不太好)方法,是集合以上代码的功能。包括格式化,计算时间差值,获取某个日期之后(前)的一个时间。运行结果如图


image.png

以下是全部完整的代码

/**
 * @param {*} date
 * test
 * let aa = ['2018', '2018-', '2018-01', '2018-01-', '2018-1', '2018-01-02', '2018-01-2', '2018-1-2', '2018-01-2 6:', '2018-01-2 6:2', '2018-01-2 6:2:2']
 * aa.forEach(a => console.log(a, reg.test(a), dateSpec(a, 'yyyy-MM-dd HH:mm:ss')))
 */


function leftPad(item) {
  return item.toString().length < 2 ? ('0' + item) : item
}


function getTimeStampUnit (unit) {
  switch (unit) {
    case 'day':
      return 1000 * 3600 * 24
    case 'hour':
      return  1000 * 3600
    case 'minute':
      return 1000 * 60
    case 'second':
      return 1000
      break
    default:
      return 1
  }
}

// 用法如Date
 function DateUTC (date) {
  let isDate = (typeof date === 'object') && (date instanceof Date)
  if (isDate) return date
  let localDate
  try {
    localDate = date === undefined ? new Date() : new Date(date)
  } catch (e) {
    console.error(e)
  }
  if (date && /^\d{4}(-\d{2}){0,2}$/.test(date)) {
    let timeZoneOffset = localDate.getTimezoneOffset()
    let utcTimeStamp = localDate.getTime() + timeZoneOffset * 60 * 1000
    return new Date(utcTimeStamp)
  }
  return localDate
}
/**
 * 
 * @param {*} time1 a Date object or Date params
 * @param {*} time2 a Date object or Date params
 * @param {*} unit can be one of ['year', 'month', 'day', 'hour', 'minute', 'second']
 */
 function diff (time1, time2, unit='day') {
  let date1 = DateUTC(time1)
  let date2 = DateUTC(time2)
  if (unit === 'year') {
    return date2.getFullYear() - date1.getFullYear()
  }
  if (unit === 'month') {
    return date2.getMonth() - date1.getMonth()
  }
  let timeStampUnit = getTimeStampUnit(unit)
  return parseInt((date2.getTime() - date1.getTime()) / timeStampUnit)
}

/**
 * 
 * @param {*} date a Date object or Date params
 * @param {*} diff 
 * @param {*} unit can be one of ['year', 'month', 'day', 'hour', 'minute', 'second']
 * for example: dateFrom('2012-02-29', 12, 'month') // Fri Mar 01 2013 00:00:00 GMT+0800 (CST)
 */
 function dateFrom(time, diff, unit='day') {
  let date = DateUTC(time)
  if (unit === 'year') {
    let year =  date.getFullYear() + diff
    return DateUTC(date.setFullYear(year))
  }
  if (unit === 'month') {
    let month = date.getMonth() + diff
    return DateUTC(date.setMonth(month))
  }
  let timeStampUnit = getTimeStampUnit(date.getTime())
  return DateUTC(timeStampUnit + diff * timeStampUnit)
}

 function format (date, form = 'yyyy-MM-dd') {
  date = DateUTC(date)
  if (!form) return date
  let year = date.getFullYear()
  let month = leftPad(date.getMonth() + 1)
  let day = leftPad(date.getDate())
  let hours = leftPad(date.getHours())
  let minutes = leftPad(date.getMinutes())
  let seconds = leftPad(date.getSeconds())
  return form.replace('yyyy', year).replace('MM', month).replace('dd', day).replace('HH', hours).replace('mm', minutes).replace('ss', seconds)
}
/**
 * use it just like how you new a Date and the second value is the format
 *  if you don't want to format it, set the form to false
 * @param {*} value any params can new a Date
 * @param {*} form 
 * @param {*} UTC 
 */
 function dateSpec (payload) {
  if (payload === undefined) return DateUTC()
  if (!payload) {
    console.error(`error params, the params is an object lise this { form: 'yyyy-MM-dd', diff: 0, unit: 'day', date: '2018-11-19' }`)
  }
  let { form = 'yyyy-MM-dd', diff = 0, unit = 'day', date = undefined } = payload
  let time = date === undefined ? DateUTC() : DateUTC(date)
  diff && (time = dateFrom(time, diff, unit))
  return form ? format(time, form) : time
  // let rs = year + "-" + month + "-" + day + " " + hours + ":" + minutes + ":" + seconds
}




// test
if (true || __DEV__) {
  var arr = ['2018', '2018-', '2018-01', '2018-01-', '2018-1', '2018-01-02', '2018-01-2', '2018-1-2', '2018-01-2 6:', '2018-01-2 6:2', '2018-01-2 6:2:2']
  console.log(`\n---dateSpec(date, 'yyyy-MM-dd HH:mm:ss')---\n`)
  arr.forEach(a => console.log(`\ndateSpec({date: ${a}, form: 'yyyy-MM-dd HH:mm:ss'}))\n`, a, ':  ', dateSpec({date: a, form: 'yyyy-MM-dd HH:mm:ss'})))

  console.error('\n----DateUTC,用法和Date一致 ----\n')
    console.log(`DateUTC([2016, 7]): `, DateUTC([2016, 7]))
    console.log(`DateUTC(): `, DateUTC())
    console.log(`DateUTC('2019-5-10'): `, DateUTC())

  console.error(`format (date, form = 'yyyy-MM-dd') 格式化时间`)
    console.log(`format('2018-1', 'HH:mm:ss yyyy/MM/dd'):  `, format('2018-1', 'HH:mm:ss yyyy/MM/dd'))

  console.error('\n\n----diff:取两个时间的差值(可以选择按照年、月、日、时、分、秒为单位)----\n\n')
    console.log(`\ndiff('2014-10-13', '2018-11-15')\n`, 'diff day', diff('2014-10-13', '2018-11-15'))
    console.log(`\ndiff('2014-10-13', '2018-11-15', 'year')\n`, 'diff year', diff('2014-10-13', '2018-11-15', 'year'))
    console.log(`\ndiff('2014-10-13', '2018-11-15', 'month')\n`, 'diff month',diff('2014-10-13', '2018-11-15', 'month'))
    console.log(`\ndiff('2018-01-02 06:02:00', '2018-01-04 07:22:10', 'hour')\n`, 'diff hour', diff('2018-01-02 06:02:00', '2018-01-04 07:22:10', 'hour'))
    console.log(`\ndiff('2018-01-02 06:02:00', '2018-01-04 07:22:10', 'minute')\n`, 'diff minute', diff('2018-01-02 06:02:00', '2018-01-04 07:22:10', 'minute'))
    console.log(`\ndiff('2018-01-02 06:02:00', '2018-01-04 07:22:10', 'second')\n`, 'diff second', diff('2018-01-02 06:02:00', '2018-01-04 07:22:10', 'second'))

  console.error(`\n\n----dateFrom(time, diff, unit='day') :取与time间隔diff的时间(可以选择按照年、月、日、时、分、秒为单位)----\n\n`)
    console.log(`\ndiff('2014-10-13', '2018-11-15')\n`, 'diff day', diff('2014-10-13', '2018-11-15'))
    console.log(`\ndiff('2014-10-13', '2018-11-15', 'year')\n`, 'diff year', diff('2014-10-13', '2018-11-15', 'year'))
    console.log(`\ndiff('2014-10-13', '2018-11-15', 'month')\n`, 'diff month',diff('2014-10-13', '2018-11-15', 'month'))
    console.log(`\ndiff('2018-01-02 06:02:00', '2018-01-04 07:22:10', 'hour')\n`, 'diff hour', diff('2018-01-02 06:02:00', '2018-01-04 07:22:10', 'hour'))
    console.log(`\ndiff('2018-01-02 06:02:00', '2018-01-04 07:22:10', 'minute')\n`, 'diff minute', diff('2018-01-02 06:02:00', '2018-01-04 07:22:10', 'minute'))
    console.log(`\ndiff('2018-01-02 06:02:00', '2018-01-04 07:22:10', 'second')\n`, 'diff second', diff('2018-01-02 06:02:00', '2018-01-04 07:22:10', 'second'))

  console.error(`\n----dateSpec: ----\n
    1. 获取某个时间date, {date: '2019-8-11'},默认为当天\n
    1. 格式化时间, {form: 'yyyy-MM-dd HH:mm:ss'},默认为yyyy-MM-dd格式\n
    1. 获取距离date之前或之后的某个时间(diff: 时间差, unit:单位(可以是年月日时分秒)), {diff: -4, unit: 'hour'},unit默认为day\n`)
    console.log('\ndateSpec()\n', 'today: ', dateSpec())
    console.log('\ndateSpec({})\n', 'today: ', dateSpec({}))
    console.log(`\ndateSpec({form: 'HH:mm:ss yyyy/MM/dd'})\n`, 'today: ', dateSpec({form: 'HH:mm:ss yyyy/MM/dd'}))
    console.log(`\ndateSpec({diff: -3})\n`, 'three days ago: ', dateSpec({diff: -3}))
    console.log(`\ndateSpec({diff: 3, unit: 'month'})\n`, 'three month later: ', dateSpec({diff: 3, unit: 'month'}))
    console.log(`\ndateSpec({diff: 1, unit: 'year'})\n`, 'one year later: ', dateSpec({diff: 1, unit: 'year'}))
    console.log(`\ndateSpec({diff: -1, unit: 'hour', form: 'HH:mm:ss yyyy/MM/dd'})\n`, 'one hour ago: ', dateSpec({diff: -1, unit: 'hour', form: 'HH:mm:ss yyyy/MM/dd'}))
    console.log(`\ndateSpec({diff: -20, unit: 'minute', form: 'HH:mm:ss yyyy/MM/dd'})\n`, '20 minute ago: ', dateSpec({diff: -20, unit: 'minute', form: 'HH:mm:ss yyyy/MM/dd'}))
    console.log(`\ndateSpec({diff: 100, unit: 'second', form: 'HH:mm:ss yyyy/MM/dd'})\n`, '100 second later: ', dateSpec({diff: 100, unit: 'second', form: 'HH:mm:ss yyyy/MM/dd'}))

}

为了更好的展示输出结果,所以用了一个console.error来分割

以上

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,045评论 25 707
  • 一点飞鸿影下,青山绿水,白草红叶黄花。 颜色——人类不同生活的写照。 这世间的颜色啊,可谓是绚烂多姿。 而我作为人...
    哈哈兴鸿阅读 1,657评论 0 4
  • 今天对这句话极有感触,一是因为,甜筒只要一出门见到什么都想买,跟他说过要做预算的道理,但是总是觉得执行起来有困难,...
    楚泽清荷阅读 1,634评论 0 0
  • 每个女孩小时候,爸爸都是天吧。我也一样,小时候觉得爸爸无所不能。能说会道,毛笔字写得也好,受尽乡邻的尊重。 突然有...
    当妈姐阅读 295评论 0 1
  • 有些时候,走着走着,发现躯壳还在,心却不知不觉跟丢了!也许她累了倦了惑了飞了乱了抑或是死了?理不清的情绪...
    豆小美阅读 106评论 0 0