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!");
}
posted @   xuchaoxin1375  阅读(15)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享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;求最简分数,
点击右上角即可分享
微信分享提示