原生JS操作日期时间的小技巧(基本操作)

lCalendar纯原生js日期时间选择纯原生js日期时间选择 lCalendar纯原生js日期时间选择纯原生js日期时间选择;lCalendar纯原生js日期时间选择纯原生js日期时间选择 立即下载

需求描述

日常开发中,经常会遇到以下对于时间(日期)的操作需求:

  • 格式化时间为 ‘年-月-日’ 或者 '年-月-日 时:分:秒’
  • 比较两段时间的大小
  • 获取两段时间(日期)中间的所有时间段(日期)

质疑

来自路人甲大佬的质疑

路人甲大佬: 为啥不用day.js或者moment.js这些现成的库

来自作者弱弱的回应

现在最流行的day.js轻量库以及moment.js都可以实现以上功能,但是moment.js有12kb大小,day.js仅仅2kb大小,为了时间数据的格式化引入day.js完全没有问题,但是后两个功能的实现需要引入moment.js,作者认为还不如自己写一套。

功能实现

时间格式化的实现

此功能无非调用原生js的Date对象的 getFullYear() 、 getMonth() 、 getDate() 等方法获取值之后的拼接,在这里不做赘述

比较两段时间的大小

  • 笨办法

之前作者开发中只碰到了比较两段日期的先后顺序作校验,所以采取了以下本办法

Demo 1 - 比较两天大小(笨办法)

const day1 = '2018-11-12'
const day2 = '2018-10-22'

function compareDate (day1, day2) {
  const day1Num = parseInt((day1.split('-').join('')), 10)
  const day2Num = parseInt((day2.split('-').join('')), 10)
  const differenceCount = day2Num - day1Num
  console.log(differenceCount)  // -90
  let result =  differenceCount === 0 ?
    'the same day' : differenceCount > 0 ?
      'the day1 is earlier than the day2' :
        'the day2 is earlier than the day1'
  return result
}

console.log(compareDate(day1, day2)) // the day2 is earlier than the day1

问题:这种方法虽然达到了比较两个日期的大小,但是其中的差值是需要进一步处理的,不是很严谨,而且涉及要计算小时的差值,则完全没有办法使用

  • 利用js原生Date对象的 getTime() 换算处理

Demo 1 - 比较两天大小(利用换算成距 1970 年 1 月 1 日之间的毫秒数)

function newCompareDate (day1, day2) {
 const day1Date = new Date(day1)
 const day1Time = day1Date.getTime()
 const day2Date = new Date(day2)
 const day2Time = day2Date.getTime()
 const differenceCount = day2Time - day1Time
 console.log(differenceCount)  // -1814400000
 let result =  differenceCount === 0 ?
   'the same day' : differenceCount > 0 ?
     'the day1 is earlier than the day2' :
       'the day2 is earlier than the day1'
 return result
}

console.log(newCompareDate(day1, day2)) // the day2 is earlier than the day1

利用js提供的getTime()方法换算成“距 1970 年 1 月 1 日之间的毫秒数”然后进行差值计算,如果要得到小时数或者天数,则进行进一步计算即可

获取两段时间(日期)中间的所有时间段(日期)

  • 利用getTime()方法进行递增计算

demo 2

function getAllDateArr (begin, end) {
 let arr = []
 let beginArr = begin.split('-')
 let endArr = end.split('-')
 let beginDate = new Date()
 beginDate.setUTCFullYear(parseInt(beginArr[0], 10), parseInt(beginArr[1], 10) - 1, parseInt(beginArr[2], 10))
 let endDate = new Date()
 endDate.setUTCFullYear(parseInt(endArr[0], 10), parseInt(endArr[1], 10) - 1, parseInt(endArr[2], 10))
 let beginSec = db.getTime() - 24 * 60 * 60 * 1000
 let endSec = de.getTime()
 for (let i = beginSec; i < endSec; i++) {
   i = i + 24 * 60 * 60 * 1000
   // 使用day.js格式化日期
   arr.push(dayjs(new Date(i)).format('YYYY-MM-DD'))
 }
 return arr
}

getAllDateArr('2018-11-12', '2018-12-12')

结语

以上功能除了day.js之外,其他功能如果引入moment.js则差不多需要14kb内存大小,但自己实现不到20行代码则可以实现功能,所以依赖第三方库有时候可以考虑自己手动实现。

小tips

作者在之前的一个国际项目中碰到一个问题:在国内前端处理好数据发送到后端,后端存储后如果在其他时区获取使用此时间,会出现时间显示的误差,原因是因为前后端时区不统一的问题,当时的解决方案是前端解决,前端只要在存储及显示的时候,获取本地的时区然后进行时间的换算即可。

BY–LucaLJX (LucaLJX的github)

Monocle2在R 4.3环境下的终极避坑指南:从安装到可视化全流程解析 本文提供了在R 4.3环境下安装和运行Monocle2的完整解决方案,重点解决了依赖包兼容性、源码修改及BEAM分析报错等关键问题。文章详细解析了从环境准备、依赖包处理、源码安装验证到从Seurat对象转换、拟时轨迹构建、高级可视化及性能优化的全流程,旨在帮助用户顺利完成单细胞拟时分析。 阅读详情

相关推荐

Java对接快递鸟,查询快递物流信息

根据用户输入的订单号,我们的后台识别订单号并根据快递鸟查询快递API接口,实现自动查询的功能。下面是java版本的根据单号查询物流跟踪信息的详细示例代码。只需要下载就可以运行,(自己需要简单的修改)注:登录快递鸟用户管理后台后获得。登录快递鸟用户管理后台。

Roc的博客 958

原生JS获取日期段及时间比较的骚操作(基本操作)

需求描述 日常开发中,经常会遇到以下对于时间(日期)的操作需求: 格式化时间为 ‘年-月-日’ 或者 '年-月-日 时:分:秒' 比较两段时间的大小 获取两段时间(日期)中间的所有时间段(日期) 质疑 来自路人甲大佬的质疑 路人甲大佬: 为啥不用day.js或者moment.js这些现成的库 来自作者弱弱的回应 现在最流行的day.js轻量库以及moment.js都可以实现以上功能,但...

weixin_34403693的博客 508

在AVP28335(兼容德州仪器TMS320-28335) 上实现ModbusSlaveRTU-485源码及注释。

今天先把题目先给出来, 在近两天会把源码 (含详细注释 )及部署、测试结果给出来, 希望能给大家帮助。(全免费 我有点缺德,断了别人的一个财路)。

FOOLCODE的专栏 642

Dayjs 时间比较

日期类插件 dayjs,momentjs 问题随记

m0_38105640的博客 1万+

Matlab生成dsp程序——环境搭建(c2000系列[F28335、F2837x]都适用)

一、环境配置 (28377D的操作是一模一样就是硬件设置的时候需要选择28377d进行相应的设置) 1)matlab与ccs联合编译需要安装对应的matlab版本和ccs版本,且只有2016a以上的matlab支持c2000系列。具体对应关系参照: http://software-dl.ti.com/ccs/esd/documents/ccs_matlab.html 2)matlab版本确定之后,还需要安装有关于ccs的相关软件: I、TI Code Composer Studio xxxx(对应

qq_42151264的博客 2万+

工控安全政策系列导读:国际标准IEC 62443标准系列

IEC 62443由ANSI/ISA提出,被ISO/IEC采纳,所以该标准会以不同的名字出现,包括:ANSI/ISA-99,ISA-99,ISA 62443,ISO/IEC 62443,ISO 62443,IEC 62443。其中IEC 62443-2-1已等同采纳为国标,于2016年10月发布,标准编号为GB/T 33007。 IEC 62443是在国...

weixin_34132768的博客 2622

moment.js常用方法

(引入js或者)安装npm 包 import moment from 'moment'; 1、比较两个日期的大小 const currTimeUnix = moment(moment().format('YYYY-MM-DD HH:mm')).unix();  //获取当前日期 const startTimeUnix = moment(moment("2018-09-27 12:12:12...

王小况的学习之路 2736

【2025软考高级架构师】论文篇——4、论可靠性系统中软件容错技术的应用

软件容错技术对软件的稳定性起着至关重要的作用,尤其是针对互联网性质的软件并发高存在流量峰值等问题,软件容错技术的应用的重要性就不言而喻了。经过这次我所采用的软件容错技术的方法和措施的实施效果后,使我也看到了自己身上的不足之处,我会在今后的架构设计过程中,不断更新自己的知识,不断完善自己的架构设计领域,设计出更好的软件架构,更好的支撑业务平台的运行,提高公司的竞争力,为公司为社会尽一份绵薄之力。

qq837993702的博客 618

原生js实现简单的日期特效(年月日、时分秒、星期几)

代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title&

在热爱技术的路上一直前行。 1488

SAP Clean Core 对传统 ABAP 开发人员来说意味着什么:机遇和挑战

SAP Clean Core是一种战略方法,旨在优化和现代化 SAP S/4HANA 系统,通过尽量减少定制,确保核心系统的稳定性、高效性和对云环境的兼容性。Clean Core 作为一种设计思路,致力于让 ERP 系统的核心功能保持简洁、规范,避免不必要的复杂化,最终维持一个标准化的核心,使系统更容易升级、性能更优越,同时支持快速的创新能力。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 610

AI:270-基于ASFF改进YOLOv8检测头的多尺度特征融合方法详解与实战

ASFF是一种基于自适应特征融合的策略,能够动态调整不同尺度特征的融合权重,适应场景中不同大小的目标。传统的YOLOv8检测头使用固定的特征融合策略,而ASFF则通过引入学习参数,使得网络能够根据输入图像的特征自适应地选择不同尺度特征的重要性。这一策略对于检测小目标或尺度变化大的目标具有显著优势。本文提出了一种改进YOLOv8检测头的新方法,通过引入自适应空间特征融合模块(ASFF),有效提升了多尺度目标检测的性能,特别是在小目标检测任务中的表现。

一键难忘的博客 3913

python日期操作_Python基础—日期与时间操作

Python标准库中提供了datatime模块来操作日期和时间环境及版本Windows 10 x64Python 2.7Pycharm 4.5.1datetime.date表示日期的类,常用的属性有year, month, dayyear的范围是[1, 9999],month的范围是[1, 12],day的最大值根据给定的year, month参数来决定(区分闰年)常用的属性# 利用构造函数创建日...

weixin_33969103的博客 994

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Automa插件之js脚本小技巧:零依赖的日期时间格式化,亲测好用!

本文主要介绍了在使用Automa浏览器插件自动化开发的过程中,遇到日期时间格式化的需求,分享了亲测好用的脚本,当然也不仅仅是Automa环境,能运行Js的地方都可用,零依赖,很好用!

雪之梦技术驿站 1238

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

javascript小技巧-js小技巧收集

每一项都是js中的小技巧,但十分的实用! 1.document.write(""); 输出语句 2.JS中的注释为// 3.传统的HTML文档顺序是:document->html->(head,body) 4.一个浏览器窗口中的DOM顺序是:window->(navigator,screen,history,location,document) 5.得到表单中元素的名称和值:document.ge

huluhulu88的专栏 1512

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

javascript小技巧-js小技巧收集(转)

本文转载自:http://blog.csdn.net/ocean20/article/details/2498699 每一项都是js中的小技巧,但十分的实用! 1.document.write(""); 输出语句 2.JS中的注释为// 3.传统的HTML文档顺序是:document->html->(head,body) 4.一个浏览器窗口中的DOM顺序是:window->(n...

weixin_30339457的博客 91

好用的JavaScript小技巧

好用的JavaScript小技巧

JackChan 715

JS小技巧收集

JS小技巧收集 每一项都是js中的小技巧,但十分的实用! 1.document.write(""); 输出语句 2.JS中的注释为// 3.传统的HTML文档顺序是:document->html->(head,body) 4.一个浏览器窗口中的DOM顺序是:window->(navigator,screen,history,location,document) 5.得...

weixin_30894389的博客 64

最新的简单获取当前时间小技巧

自接触日期时间这个特殊数据类型开始,倍感头大,每次遇到就免不了做数据处理! 经常就是百度找资料,虽然每次看到的都是大同小异。但是就现有的业务场景总觉的不能快速完成自己的实用。 为此,绞尽脑汁,最后也百思不得其解。 今天在一个偶然的机会下,尝试一种在自己的项目中可行性方案。 当前业务场景为前端JS。Vue环境下。又使用到Element UI框架。 第一步: var dt= new Date(); 第二步: var jsondt= JSON.stringify(dt); console.log(jsondt

qq_39398270的博客 408

js中的小技巧

每一项都是js中的小技巧,但十分的实用!1.document.write(""); 输出语句2.JS中的注释为//3.传统的HTML文档顺序是:document-&gt;html-&gt;(head,body)4.一个浏览器窗口中的DOM顺序是:window-&gt;(navigator,screen,history,location,document)5.得到表单中元素的名称和值:docum...

十年,不只是一首歌而已 118

javascript小技巧&&JavaScript[对象.属性]集锦(转自飛雪飄寒 )

javascript小技巧&&JavaScript[对象.属性]集锦,建议你 ctrl+F 直接在这个页上找,因为这里80%有你要找的! javascript小技巧 事件源对象 event.srcElement.tagName event.srcElement.type ...

dmt26374的博客 267

有用的js 代码

js 代码 js宝典学习笔记ZT        每一项都是js中的小技巧,但十分的实用!     1.document.write(""); 输出语句    2.JS中的注释为//    3.传统的HTML文档顺序是:document-&gt;html-&gt;(head,body)    4.一个浏览器窗口中的DOM顺序是:windo...

benson 一切皆有可能 152

【小技巧】 各种日期操作方法汇总

虽然现在处理日期方面已经有了很成熟的也很好用的库,例如(momentjs和date-fns),但是在实际开发中,我们有时候可能并不需要整个库。所以我就在下面整理了在前端开发时对日期时间的...

程序员成长指北 276

JavaScript 小技巧

<!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--><script type="text/javascript"

zgqtxwd的专栏 294

javascript小技巧[转]

事件源对象event.srcElement.tagNameevent.srcElement.type 捕获释放event.srcElement.setCapture();event.srcElement.releaseCapture(); 事件按键event.keyCodeevent.shiftKeyevent.altKeyevent.ctrl...

a791442573的博客 128

java setrefreshdelay_常用javastript小技巧

1.document.write(""); 输出语句2.JS中的注释为//3.传统的HTML文档顺序是:document->html->(head,body)4.一个浏览器窗口中的DOM顺序是:window->(navigator,screen,history,location,document)5.得到表单中元素的名称和值:document.getElementById...

weixin_42122986的博客 333
上一篇: VUE缓存:动态keep-alive
2B_LIS
博客等级 码龄14年 6粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值