js_Date对象的常用方法/时间段预约冲突检测问题
UTC/GMT
GMT
格林尼治平均时间(英语:Greenwich Mean Time,GMT)是指位于英国伦敦郊区的皇家格林尼治天文台当地的平太阳时,因为本初子午线被定义为通过那里的经线。
自1924年2月5日开始,格林尼治天文台负责每隔一小时向全世界发放调时信息。
格林尼治标准时间的正午是指当平太阳横穿格林尼治子午线时(也就是在格林尼治上空最高点时)的时间。由于地球每天的自转是有些不规则的,而且正在缓慢减速,因此格林尼治平时基于天文观测本身的缺陷,已经被原子钟报时的协调世界时(UTC)所取代。
UTC
协调世界时(英语:Coordinated Universal Time,法语:Temps Universel Coordonné,简称UTC)是最主要的世界时间标准,其以原子时秒长为基础,在时刻上尽量接近于**格林威治标准时间**。中华人民共和国采用ISO 8601:2000的国家标准GB/T 7408-2005《数据元和交换格式 信息交换 日期和时间表示法》中亦称之为协调世界时。
协调世界时是世界上调节时钟和时间的主要时间标准,它与0度经线的平太阳时相差不超过1秒[5],并不遵守夏令时。协调世界时是最接近格林威治标准时间(GMT)的几个替代时间系统之一。对于大多数用途来说,UTC时间被认为能与GMT时间互换,但GMT时间已不再被科学界所确定。
协调世界时(UTC)正式形成于1963年国际无线电咨询委员会的374号建议中[6],该建议由多国时间实验室共同提出。人们对该时间系统进行过数次调整,直到1972年引入了闰秒机制,调整工作得以简化。也有很多人提议用一个没有闰秒的时间系统来替换掉协调世界时,但目前尚未就此达成一致。
现行的协调世界时根据国际电信联盟的建议《Standard-frequency and time-signal emissions》(ITU-R TF.460-6)所确定[7]。
UTC基于国际原子时,并通过不规则的加入闰秒来抵消地球自转变慢的影响[8]。
闰秒在必要的时候会被插入到UTC中,以保证协调世界时(UTC)与世界时(UT1)相差不超过0.9秒[9]。
日期字符串标准
date对象
时间戳/毫秒换算
/* 一下提到了两种方式获取运行时时间戳,因为获取的时运行时的时间,要调用方法 */ /* 使用 Date 对象(而不是通过手动New Data()创建出来的) */ const d1 = Date; // now方法获取时间戳 const timestamp0 = d1.now(); const secondsv0 = Math.floor(timestamp0 / 1e3) console.log(`${timestamp0}ms 😎timestamp is expected`); console.log(`${secondsv0}s`) /* 使用内建的创建方法: */ const t1 = new Date() // getTime方法获取时间戳 timestamp1=t1.getTime() secondsv1=Math.floor(timestamp1/1000) console.log(`${timestamp1}ms 😎timestamp is expected`); console.log(`${secondsv1}s`);
时间戳->毫秒
/* 获取自 Unix 起始时间以来经过的秒数; 注意此处需要返回一个整数 (仅做除法得到的不是整数),并且需要返回实际已经经过的秒数(所以这里使用了Math.floor()而不是Math.round()). */ var seconds = Math.floor(Date.now() / 1000);
构造Date对象和各种时间参数
/* 语法 new Date(); new Date(value); new Date(dateString); new Date(year, monthIndex [, day [, hours [, minutes [, seconds [, milliseconds]]]]]); 创建一个新Date对象的唯一方法是通过new 操作符,例如:let now = new Date(); 若将它作为常规函数调用(即不加 new 操作符),将返回一个字符串,而非 Date 对象。 */
解析时间戳字符串(规范日期字符串)
/* 解析时间字符串(符合两种规范的情况下,参考文档) */ const date1 = new Date('December 17, 1995 03:24:00'); // Sun Dec 17 1995 03:24:00 GMT... const date2 = new Date('1995-12-17T03:24:00'); // Sun Dec 17 1995 03:24:00 GMT... console.log(date1 === date2); // expected output: false; console.log(date1 - date2); // expected output: 0 /*创建一个日期对象的几种方法 */ var today = new Date(); var birthday1 = new Date(1995, 11, 17); var birthday2 = new Date(1995, 11, 17, 3, 24, 0); var birthday3 = new Date('December 17, 1995 03:24:00'); var birthday4 = new Date('1995-12-17T03:24:00'); console.log(birthday1); /* 例子:将两位数年份映射为 1900 - 1999 年 为了创建和获取 0 到 99 之间的年份,应使用 Date.prototype.setFullYear() 和 Date.prototype.getFullYear() 方法。 */ var date = new Date(98, 1); // Sun Feb 01 1998 00:00:00 GMT+0000 (GMT) // 已弃用的方法, 同样将 98 映射为 1998 date.setYear(98); // Sun Feb 01 1998 00:00:00 GMT+0000 (GMT) date.setFullYear(98); // Sat Feb 01 0098 00:00:00 GMT+0000 (BST)
时间段预约冲突检测问题
/* 类似于插入排序的思想,我们可以假定已有的时间序列时有序的(如果没有,我们可以在常熟插入新的时间段前做一次排序(只需要按照各时间段的起点时间来排序即可)) ,而且这些时间段都不冲突; 我们知道,处理有序的问题通常会比无须的问题来的容易(混乱程度更小,如果原问题时混乱程度较大的,我们大可以考虑排序原问题中的数据集,使得后续的处理可以考虑较少的情况.) 在有序且不冲突的时间段序列中,我们想要插入一段新的时间序列,要求至少不和任何一个已有的时间段产生冲突,由于原序列是有序的,插入新序列只需要采用二分法来查找到新插入的时间点的可能位置(直接从头比较也行),这样一来,我们只需要考虑这个有可能被插入的位置的两侧:endLeft<beginNew &&endNew<beginRight 非常完美! 实际项目中,可以从数据库中查询时间段,并指定排序后返回结果(数据库中已有的时间段必定不会冲突); 营业时间可以后期处理的时候加上 */ timePairsList = [[8, 8], [11, 13], [13.5, 15], [15, 15.5], [16, 18], [19, 20], [21, 21]]; /* 8点之前不可以预约,21点之后不可以预约 */ testPairNewList = [[6, 9], [12, 13.3], [14, 15], [18.5, 19]]; testNew = testPairNewList[2]; startList = timePairsList.map( (it) => { return it[0]; } ); console.log(`${startList} 😎`); /* findIndex() count index begin at 1 */ prob = startList.findIndex( it => { if (it > testNew[0]) { return it; } } ); console.log(`${prob} 😎by findIndex`); // t = timePairsList; // console.log(t); // for (const it of timePairsList) { // } if (prob == 0) { if (testNew[1] < startList[0]) { } /* 虽然如此,但是实际处理的时候需要有起点时间的自然约束(比如预约时间不可以早于8点,那么可以内置一个[8,8]来统一处理) */ } console.log(timePairsList[prob - 1][1]); console.log(testNew[0]); console.log(testNew[1]); console.log(timePairsList[prob][0]); const earliest = 8; const latest = 21; if (testNew[0] < earliest || testNew[1] > latest) { console.log("Deny!"); } else if (testNew[1] <= timePairsList[prob][0] && testNew[0] >= timePairsList[prob - 1][1]) { console.log(`access!😎`); timePairsList.splice(prob, 0, testNew); // console.log(resultList); const resultList = timePairsList; resultList.forEach(it => { console.log(it); }); } else { console.log("deny!"); }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
2023-09-05 CN_@传输层协议@端口
2023-09-05 CN_UDP协议
2023-09-05 输入int a,b;求最简分数,