27 °C 90 % 西7 km/h 27 °C 1 mm 90 % 西7 km/h 27 °C 0.7 mm 90 % 西南8 km/h 27 °C 0.4 mm 90 % 西南8 km/h 27 °C 0.3 mm 90 % 西南9 km/h 27 °C 0.3 mm 80 % 西南9 km/h 27 °C 0.3 mm 70 % 西南10 km/h 27 °C 0.3 mm 70 % 西南11 km/h 27 °C 0.1 mm 80 % 西南10 km/h 27 °C 0.2 mm 80 % 西南10 km/h 27 °C 0.6 mm 90 % 西南9 km/h 27 °C 0.8 mm 90 % 西南8 km/h 27 °C 0.8 mm 90 % 西南8 km/h 27 °C 0.7 mm 100 % 西9 km/h 27 °C 0.8 mm 90 % 西9 km/h 27 °C 1 mm 90 % 西11 km/h 27 °C 1 mm 90 % 西11 km/h 27 °C 1 mm 100 % 西11 km/h 27 °C 1 mm 100 % 西11 km/h 27 °C 0.8 mm 100 % 西9 km/h 27 °C 0.7 mm 100 % 西9 km/h 27 °C 0.9 mm 100 % 西9 km/h 28 °C 0.7 mm 100 % 西9 km/h 27 °C 1 mm 100 % 西9 km/h 27 °C 1 mm 100 % 西7 km/h
日期和时间让我们来学习一个新的内建对象:日期(Date)。该对象存储日期和时间,并提供了日期/时间的管理方法。 我们可以使用它来存储创建/修改时间,测量时间,或者仅用来打印当前时间。 调用 不带参数 —— 创建一个表示当前日期和时间的 new Date(milliseconds) 创建一个
传入的整数参数代表的是自 1970-01-01 00:00:00 以来经过的毫秒数,该整数被称为 时间戳。 这是一种日期的轻量级数字表示形式。我们通常使用 在 01.01.1970 之前的日期带有负的时间戳,例如:
new Date(datestring) 如果只有一个参数,并且是字符串,那么它会被自动解析。该算法与
new Date(year, month, date, hours, minutes, seconds, ms) 使用当前时区中的给定组件创建日期。只有前两个参数是必须的。
例如:
时间度量最大精确到 1 毫秒(1/1000 秒):
访问日期组件从 不是 很多
JavaScript 引擎都实现了一个非标准化的方法 另外,我们还可以获取一周中的第几天: getDay()获取一周中的第几天,从0 (星期日)到 6 (星期六)。第一天始终是星期日,在某些国家可能不是这样的习惯,但是这不能被改变。以上的所有方法返回的组件都是基于当地时区的。 当然,也有与当地时区的 UTC 对应项,它们会返回基于 UTC+0
时区的日、月、年等:getUTCFullYear(),getUTCMonth(),getUTCDay()。只需要在 如果你当地时区相对于 UTC 有偏移,那么下面代码会显示不同的小时数:
除了上述给定的方法,还有两个没有 UTC 变体的特殊方法: getTime()返回日期的时间戳 —— 从 1970-1-1 00:00:00 UTC+0 开始到现在所经过的毫秒数。 getTimezoneOffset()返回 UTC 与本地时区之间的时差,以分钟为单位:
设置日期组件下列方法可以设置日期/时间组件:
以上方法除了 我们可以看到,有些方法可以一次性设置多个组件,比如 举个例子:
自动校准(Autocorrection)自动校准 是 举个例子:
超出范围的日期组件将会被自动分配。 假设我们要在日期 “28 Feb 2016” 上加 2 天。结果可能是 “2 Mar” 或 “1
Mar”,因为存在闰年。但是我们不需要考虑这些,只需要直接加 2 天,剩下的
这个特性经常被用来获取给定时间段后的日期。例如,我们想获取“现在 70 秒后”的日期:
我们还可以设置 0 甚至可以设置负值。例如:
日期转化为数字,日期差值当
有一个重要的副作用:日期可以相减,相减的结果是以毫秒为单位时间差。 这个作用可以用于时间测量:
Date.now()如果我们仅仅想要测量时间间隔,我们不需要 有一个特殊的方法 它相当于 这种方法很多时候因为方便,又或是因性能方面的考虑而被采用,例如使用 JavaScript 编写游戏或其他的特殊应用场景。 因此这样做可能会更好:
基准测试(Benchmarking)在对一个很耗 CPU 性能的函数进行可靠的基准测试(Benchmarking)时,我们需要谨慎一点。 例如,我们想判断以下两个计算日期差值的函数:哪个更快? 这种性能测量通常称为“基准测试(benchmark)”。
这两个函数做的事情完全相同,但是其中一个函数使用显式的 那么,哪个更快呢? 首先想到的方法可能是连续运行两者很多次,并计算所消耗的时间之差。就这个例子而言,函数过于简单,所以我们必须执行至少 100000 次。 让我们开始测量:
看起来使用 我们得到了结论,但是这并不是一个很好的度量的例子。 想象一下当运行 对于现代多进程操作系统来说,这是一个非常常见的场景。 比起第二个函数,第一个函数所能使用的 CPU 资源更少。这可能导致错误的结论。 为了得到更加可靠的度量,整个度量测试包应该重新运行多次。 例如,像下面的代码这样:
现代的 JavaScript 引擎的先进优化策略只对执行很多次的 “hot code” 有效(对于执行很少次数的代码没有必要优化)。因此,在上面的例子中,第一次执行的优化程度不高。我们可能需要增加一个预热步骤:
进行微型基准测试时要小心 现代的 JavaScript 引擎执行了很多优化。与正常编写的代码相比,它们可能会改变“人为编写的专用于测试的代码”的执行流程,特别是在我们对很小的代码片段进行基准测试时,例如某个运算符或内建函数的工作方式。因此,为了深入理解性能问题,请学习 JavaScript 引擎的工作原理。在那之后,你或许再也不需要进行微型基准测试了。 http://mrale.ph 提供了很多 V8 引擎相关的文章。 对字符串调用 Date.parseDate.parse(str) 方法可以从一个字符串中读取日期。 字符串的格式应该为:
简短形式也是可以的,比如
举个例子:
我们可以通过时间戳来立即创建一个
总结
和其他系统不同,JavaScript 中时间戳以毫秒为单位,而不是秒。 有时我们需要更加精准的时间度量。JavaScript 自身并没有测量微秒的方法(百万分之一秒),但大多数运行环境会提供。例如:浏览器有 performance.now() 方法来给出从页面加载开始的以毫秒为单位的微秒数(精确到毫秒的小数点后三位):
Node.js 可以通过 任务重要程度: 5 创建一个 使用
所以二月对应的数值是 1。 这是一个以数字作为日期参数的示例:
我们还可以从字符串创建日期,像这样:
重要程度: 5 编写一个函数 例如:
打开带有测试的沙箱。
我们创建一个关于星期的数组,这样我们就可以通过编号获取正确的日期名称:
使用沙箱的测试功能打开解决方案。 重要程度: 5 欧洲国家的星期计算是从星期一(数字 1)开始的,然后是星期二(数字 2),直到星期日(数字 7)。编写一个函数
打开带有测试的沙箱。
使用沙箱的测试功能打开解决方案。 重要程度: 4 写一个函数 例如,假设今天是 20 号,那么 跨月、年也应该是正确输出:
P.S. 函数不应该修改给定的 打开带有测试的沙箱。 思路很简单:从
……但是函数不能修改 要实现这一点,我们可以复制这个日期,就像这样:
使用沙箱的测试功能打开解决方案。 重要程度: 5 写一个函数 参数:
举个例子, 打开带有测试的沙箱。 让我们使用下个月创建日期,但将零作为天数(day)传递:
通常,日期从 1 开始,但从技术上讲,我们可以传递任何数字,日期会自动进行调整。因此,当我们传递 0 时,它的意思是“一个月的第一天的前一天”,换句话说:“上个月的最后一天”。 使用沙箱的测试功能打开解决方案。 重要程度: 5 写一个函数 例如:如果现在是
该函数应该在任意一天都能正确运行。那意味着,它不应具有“今天”的硬编码值。 为获取秒数,我们可以使用今天的日期和 00:00:00 这个时间创建一个日期,然后使用当前时间减去该时间。 不同之处在于,从今天之初开始算起的时间是以毫秒计算的,我们应该将其除以 1000,进而得到秒数:
另一种解决方法是获取 hours/minutes/seconds,然后把它们转换为秒数:
重要程度: 5 写一个函数 例如,现在是
P.S. 该函数应该在任意一天都能正确运行。那意味着,它不应具有“今天”的硬编码值。 为获取距离明天的毫秒数,我们可以用“明天 00:00:00”这个日期减去当前的日期。 首先我们生成“明天”,然后对其进行减法操作:
另一种解法:
请注意,很多国家有夏令时(DST),因此他们的一天可能有 23 小时或者 25 小时。我们对这些天数要区别对待。 重要程度: 4 写一个函数
举个例子:
打开带有测试的沙箱。 为了获取
另一种解法:
使用沙箱的测试功能打开解决方案。 |