js_Date对象的常用方法/时间段预约冲突检测问题

本文介绍了UTC和GMT的概念,它们的区别以及协调世界时(UTC)如何取代格林尼治平均时间(GMT)。同时,讲解了JavaScript中Date对象的使用,包括时间戳与毫秒的转换、日期字符串的标准、时间参数的构造以及时间戳字符串的解析。最后,文章探讨了时间段预约冲突检测问题,提出了有序时间段序列中避免冲突的插入策略。
摘要由CSDN通过智能技术生成

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!");
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值