From f226c34600cf29513d307297ded8219a28bc2308 Mon Sep 17 00:00:00 2001 From: LeviDing Date: Thu, 20 Feb 2020 17:43:54 +0800 Subject: [PATCH 01/22] Update article.md --- 1-js/05-data-types/11-date/article.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/1-js/05-data-types/11-date/article.md b/1-js/05-data-types/11-date/article.md index 8fed5dfb9d..497410934c 100644 --- a/1-js/05-data-types/11-date/article.md +++ b/1-js/05-data-types/11-date/article.md @@ -1,12 +1,12 @@ # 日期和时间 -让我一起探讨一个新的内置对象:[日期](mdn:js/Date)。该对象存储日期、时间以及提供管理它们的方法。 +让我一起学习一个新的内建对象:[日期(Date)](mdn:js/Date)。该对象存储日期和时间,并提供了日期/时间的管理方法。 -举个例子,我们可以使用它来存储创建、修改事件的时间,或者用来度量时间开销,再或者用来打印当前时间。 +例如,我们可以使用它来存储创建/修改时间,或者用来度量时间,再或者仅用来打印当前时间。 ## 创建 -创建一个新的 `Date` 对象,只需要调用 `new Date()`,附加下列参数中的其中一个: +创建一个新的 `Date` 对象,只需要调用 `new Date()`,在调用时可以带有下面这些参数之一: `new Date()` : 不带参数 —— 创建一个表示当前日期和时间的 `Date` 对象: @@ -17,14 +17,14 @@ ``` `new Date(milliseconds)` -: 创建一个 `Date` 对象,参数是从 1970-01-01 00:00:00 UTC+0 开始所经过的毫秒(一秒的千分之一)数。 +: 创建一个 `Date` 对象,其时间等于 1970-01-01 00:00:00 UTC+0 再过一毫秒(1/1000 秒)。 ```js run // 0 表示 01.01.1970 UTC+0 let Jan01_1970 = new Date(0); alert( Jan01_1970 ); - // 增加 24 小时,得到 02.01.1970 UTC+0 + // 现在增加 24 小时,得到 02.01.1970 UTC+0 let Jan02_1970 = new Date(24 * 3600 * 1000); alert( Jan02_1970 ); ``` From e54474603b4b4ffa97a9c213c411c72ac89c950c Mon Sep 17 00:00:00 2001 From: LeviDing Date: Thu, 20 Feb 2020 22:26:54 +0800 Subject: [PATCH 02/22] Update article.md --- 1-js/05-data-types/11-date/article.md | 160 ++++++++++++++------------ 1 file changed, 86 insertions(+), 74 deletions(-) diff --git a/1-js/05-data-types/11-date/article.md b/1-js/05-data-types/11-date/article.md index 497410934c..2c219d9c07 100644 --- a/1-js/05-data-types/11-date/article.md +++ b/1-js/05-data-types/11-date/article.md @@ -29,37 +29,47 @@ alert( Jan02_1970 ); ``` - 传入的参数是自 1970-01-01 00:00:00 开始计算的毫秒数,被称为**时间戳**。 + 传入的整数参数代表的是自 1970-01-01 00:00:00 以来经过的毫秒数,该整数被称为 **时间戳**。 - 这是一种日期的轻量级表示方法。我们通常使用时间戳来创建一个日期,比如 `new Date(timestamp)`,以及使用 `date.getTime()` 来将现有的 `Date` 对象转化为时间戳(下面将提到)。 + 这是一种日期的轻量级数字表示形式。我们通常使用 `new Date(timestamp)` 通过时间戳来创建日期,并可以使用 `date.getTime()` 将现有的 `Date` 对象转化为时间戳(下文会讲到)。 -`new Date(datestring)` -: 如果只有一个参数,并且是字符串,那么该参数会通过 `Date.parse` 算法解析(下面会提到)。 + 在 01.01.1970 之前的日期带有负的时间戳,例如: + ```js run + // 31 Dec 1969 + let Dec31_1969 = new Date(-24 * 3600 * 1000); + alert( Dec31_1969 ); + ``` +`new Date(datestring)` +: 如果只有一个参数,并且是字符串,那么它会被自动解析。该算法与 `Date.parse` 所使用的算法相同,我们将在下文中进行介绍。 ```js run let date = new Date("2017-01-26"); - alert(date); // Thu Jan 26 2017 ... + alert(date);时间未设置,因此假定为格林尼治标准时间午夜 50 //根据运行代码的时区进行调整 + // 该时间未被设定,因此被假定为格林尼治标准时间(GMT)的午夜(midnight) + // 并会根据你运行代码时的时区进行调整 + // 因此,结果可能是 + // Thu Jan 26 2017 11:00:00 GMT+1100 (Australian Eastern Daylight Time) + // 或 + // Wed Jan 25 2017 16:00:00 GMT-0800 (Pacific Standard Time) ``` `new Date(year, month, date, hours, minutes, seconds, ms)` -: 创建一个 Date 对象,参数是当地时区的日期组合信息。只有前两个参数是必须的。 - - 注意: +: 使用当前时区中的给定组件创建日期。只有前两个参数是必须的。 - `year` 必须是四位数:`2013` 是合法的,`98` 是不合法的。 - - `month` 计数从 `0` (一月) 开始,到 `11` (12月)。 - - `date` 是当月的具体某一天,如果缺失,默认是 `1`。 - - 如果 `hours/minutes/seconds/ms` 缺失的话,它们默认值是 `0`。 + - `month` 计数从 `0`(一月)开始,到 `11`(十二月)结束。 + - `date` 是当月的具体某一天,如果缺失,则为默认值 `1`。 + - 如果 `hours/minutes/seconds/ms` 缺失,则均为默认值 `0`。 - 举个例子: + 例如: ```js - new Date(2011, 0, 1, 0, 0, 0, 0); // // 1 Jan 2011, 00:00:00 - new Date(2011, 0, 1); // 同样,时分秒等默认为 0 + new Date(2011, 0, 1, 0, 0, 0, 0); // 1 Jan 2011, 00:00:00 + new Date(2011, 0, 1); // 同样,时分秒等均为默认值 0 ``` - 时间度量最小精确到 1 毫秒(千分之一秒): + 时间度量最小精确到 1 毫秒(1/1000 秒): ```js run let date = new Date(2011, 0, 1, 2, 3, 4, 567); @@ -68,32 +78,32 @@ ## 访问日期组件 -从 `Date` 对象中访问年、月等信息有很多种方式。通过分类可以很容易记忆。 +从 `Date` 对象中访问年、月等信息有多种方式: [getFullYear()](mdn:js/Date/getFullYear) : 获取年份(4 位数) [getMonth()](mdn:js/Date/getMonth) -: 获取月份**从 0 到 11**。 +: 获取月份,**从 0 到 11**。 [getDate()](mdn:js/Date/getDate) -: 获取当月的日期,从 1 到 31,这个方法名称可能看起来有些令人疑惑。 +: 获取当月的具体日期,从 1 到 31,这个方法名称可能看起来有些令人疑惑。 -[getHours()](mdn:js/Date/getHours), [getMinutes()](mdn:js/Date/getMinutes), [getSeconds()](mdn:js/Date/getSeconds), [getMilliseconds()](mdn:js/Date/getMilliseconds) -: 获取相应的时间信息。 +[getHours()](mdn:js/Date/getHours),[getMinutes()](mdn:js/Date/getMinutes),[getSeconds()](mdn:js/Date/getSeconds),[getMilliseconds()](mdn:js/Date/getMilliseconds) +: 获取相应的时间组件。 ```warn header="不是 `getYear()`,而是 `getFullYear()`" -很多 JavaScript 引擎都实现了一个非标准化的方法 `getYear()`,这个方法不建议使用。它有可能返回 2 位的年份信息。请不要使用它。获取年份,使用 `getFullYear()`。 +很多 JavaScript 引擎都实现了一个非标准化的方法 `getYear()`。不推荐使用这个方法。它有时候可能会返回 2 位的年份信息。永远都不要使用它。要获取年份就使用 `getFullYear()`。 ``` 另外,我们还可以获取一周中的第几天: [getDay()](mdn:js/Date/getDay) -: 获取一周中的第几天,从 `0`(星期天)到 `6` (星期六)。第一天始终是星期天,在某些国家可能不是这样的习惯,但是这不能被改变。 +: 获取一周中的第几天,从 `0`(星期日)到 `6`(星期六)。第一天始终是星期日,在某些国家可能不是这样的习惯,但是这不能被改变。 -**以上所有的方法返回的信息都是基于当地时区的。** +**以上的所有方法返回的组件都是基于当地时区的。** -当然,也有与之对应的 UTC 版本方法,它们会返回基于 UTC+0 时区的天数、月份、年份等等信息:[getUTCFullYear()](mdn:js/Date/getUTCFullYear), [getUTCMonth()](mdn:js/Date/getUTCMonth), [getUTCDay()](mdn:js/Date/getUTCDay)。只需要在 `"get"` 之后插入 `"UTC"`。 +当然,也有与当地时区的 UTC 对应项,它们会返回基于 UTC+0 时区的日、月、年等:[getUTCFullYear()](mdn:js/Date/getUTCFullYear),[getUTCMonth()](mdn:js/Date/getUTCMonth),[getUTCDay()](mdn:js/Date/getUTCDay)。只需要在 `"get"` 之后插入 `"UTC"` 即可。 如果你当地时区相对于 UTC 有偏移,那么下面代码会显示不同的小时数: @@ -108,13 +118,13 @@ alert( date.getHours() ); alert( date.getUTCHours() ); ``` -在以上给出的方法中,有两个与众不同的,它们没有 UTC 版本: +除了上述给定的方法,还有两个没有 UTC 变体的特殊方法: [getTime()](mdn:js/Date/getTime) -: 返回日期的时间戳 —— 从 1970-1-1 00:00:00 UTC+0 开始的毫秒数。 +: 返回日期的时间戳 —— 从 1970-1-1 00:00:00 UTC+0 开始到现在所经过的毫秒数。 [getTimezoneOffset()](mdn:js/Date/getTimezoneOffset) -: 返回时区偏移数,以分钟为单位: +: 返回本地时区与 UTC 之间的时差,以分钟为单位: ```js run // 如果你在时区 UTC-1,输出 60 @@ -123,22 +133,22 @@ alert( date.getUTCHours() ); ``` -## 设置日期信息 +## 设置日期组件 -以下方法可以设置日期/时间信息: +下列方法可以设置日期/时间组件: -- [`setFullYear(year [, month, date])`](mdn:js/Date/setFullYear) -- [`setMonth(month [, date])`](mdn:js/Date/setMonth) +- [`setFullYear(year, [month], [date])`](mdn:js/Date/setFullYear) +- [`setMonth(month, [date])`](mdn:js/Date/setMonth) - [`setDate(date)`](mdn:js/Date/setDate) -- [`setHours(hour [, min, sec, ms])`](mdn:js/Date/setHours) -- [`setMinutes(min [, sec, ms])`](mdn:js/Date/setMinutes) -- [`setSeconds(sec [, ms])`](mdn:js/Date/setSeconds) +- [`setHours(hour, [min], [sec], [ms])`](mdn:js/Date/setHours) +- [`setMinutes(min, [sec], [ms])`](mdn:js/Date/setMinutes) +- [`setSeconds(sec, [ms])`](mdn:js/Date/setSeconds) - [`setMilliseconds(ms)`](mdn:js/Date/setMilliseconds) -- [`setTime(milliseconds)`](mdn:js/Date/setTime) (使用自 1970-01-01 00:00:00 UTC+0 开始的毫秒数来设置整个日期对象) +- [`setTime(milliseconds)`](mdn:js/Date/setTime)(使用自 1970-01-01 00:00:00 UTC+0 以来的毫秒数来设置整个日期) -以上方法除了 `setTime()` 都有 UTC 版本,比如 `setUTCHours()`。 +以上方法除了 `setTime()` 都有 UTC 变体,例如:`setUTCHours()`。 -我们可以看到,有些方法可以一次性设置多个信息,比如 `setHours`。另外,在这些方法中没有提到的信息将不会被修改。 +我们可以看到,有些方法可以一次性设置多个组件,比如 `setHours`。未提及的组件不会被修改。 举个例子: @@ -146,26 +156,26 @@ alert( date.getUTCHours() ); let today = new Date(); today.setHours(0); -alert(today); // 日期依然是今天,只不过小时数改为 0 +alert(today); // 日期依然是今天,但是小时数被改为了 0 today.setHours(0, 0, 0, 0); alert(today); // 日期依然是今天,时间为 00:00:00。 ``` -## 自动校准 +## 自动校准(Autocorrection) -**自动校准**是 `Date` 对象一个非常方便的特性。我们可以设置超范围的数值,它会自动校准。 +**自动校准** 是 `Date` 对象的一个非常方便的特性。我们可以设置超范围的数值,它会自动校准。 举个例子: ```js run let date = new Date(2013, 0, *!*32*/!*); // 32 Jan 2013 ?!? -alert(date); // ...是 1st Feb 2013! +alert(date); // ……是 1st Feb 2013! ``` -超出范围的日期信息会被自动分配。 +超出范围的日期组件将会被自动分配。 -假设我们要在日期「2016 年 2 月 28 日」上再加 2 天。结果可能是「3 月 2 日」或者「3 月 1 日」,原因是闰年的存在。但是我们不需要去考虑这些,直接加两天,剩下的 `Date` 对象会帮我们处理: +假设我们要在日期 "28 Feb 2016" 上加 2 天。结果可能是 "2 Mar" 或 "1 Mar",因为存在闰年。但是我们不需要去考虑这些,只需要直接加 2 天,剩下的 `Date` 对象会帮我们处理: ```js run let date = new Date(2016, 1, 28); @@ -173,10 +183,10 @@ let date = new Date(2016, 1, 28); date.setDate(date.getDate() + 2); */!* -alert( date ); // 2016 年 3 月 1 日 +alert( date ); // 1 Mar 2016 ``` -这个特性经常被用来获取一段时间后的日期信息。举个例子,我们想得到「当前日期 70 秒之后的日期」: +这个特性经常被用来获取给定时间段后的日期。例如,我们想获取“现在 70 秒后”的日期: ```js run let date = new Date(); @@ -185,7 +195,7 @@ date.setSeconds(date.getSeconds() + 70); alert( date ); // 显示正确的日期信息 ``` -我们可以设置 0 甚至 负值。举个例子: +我们还可以设置 0 甚至可以设置负值。例如: ```js run let date = new Date(2016, 0, 2); // 2016 年 1 月 2 日 @@ -193,51 +203,51 @@ let date = new Date(2016, 0, 2); // 2016 年 1 月 2 日 date.setDate(1); // 设置为当月的第一天 alert( date ); -date.setDate(0); // 天数最小可以设置为 1,所以这里设置为上一月的最后一天 -alert( date ); // 2015 年 12 月 31 日 +date.setDate(0); // 天数最小可以设置为 1,所以这里设置的是上一月的最后一天 +alert( date ); // 31 Dec 2015 ``` ## 日期转化为数字,日期差值 -当 `Date` 对象转化为数字时,得到的是对应的时间戳,相当于 `date.getTime()`: +当 `Date` 对象被转化为数字时,得到的是对应的时间戳,与使用 `date.getTime()` 的结果相同: ```js run let date = new Date(); -alert(+date); // 以毫秒为单位的数值,相当于 date.getTime() +alert(+date); // 以毫秒为单位的数值,与使用 date.getTime() 的结果相同 ``` -有一个重要的副作用:日期可以相减,它们相减的结果是以毫秒为单位。 +有一个重要的副作用:日期可以相减,相减的结果是以毫秒为单位时间差。 -这个作用可以用来做时间度量: +这个作用可以用于时间度量: ```js run -let start = new Date(); // 起始时间 +let start = new Date(); // 开始度量时间 -// 做一些操作 +// do the job for (let i = 0; i < 100000; i++) { let doSomething = i * i * i; } -let end = new Date(); // 结束时间 +let end = new Date(); // 结束度量时间 alert( `The loop took ${end - start} ms` ); ``` ## Date.now() -如果我们仅仅想要度量时间间隔,我们不需要整个 `Date` 对象。 +如果我们仅仅想要度量时间间隔,我们不需要 `Date` 对象。 有一个特殊的方法 `Date.now()`,它会返回当前的时间戳。 -它相当于 `new Date().getTime()`,但它不会在中间创建一个 `Date` 对象。因此它更快,而且不会对垃圾处理造成额外的压力。 +它相当于 `new Date().getTime()`,但它不会创建中间的 `Date` 对象。因此它更快,而且不会对垃圾处理造成额外的压力。 -这种方法很多时候因为方便而被采用,又或者从性能上考虑,像 JavaScript 中的游戏以及其他的特殊应用。 +这种方法很多时候因为方便,又或是因性能方面的考虑而被采用,例如使用 JavaScript 编写游戏或其他的特殊应用场景。 因此这样做可能会更好: ```js run *!* -let start = Date.now(); // 从 1979-01-01 00:00:00 开始至今的时间戳 +let start = Date.now(); // 从 1 Jan 1970 至今的时间戳 */!* // do the job @@ -246,20 +256,22 @@ for (let i = 0; i < 100000; i++) { } *!* -let end = Date.now(); // 操作完成后,得到这一时刻的时间戳 +let end = Date.now(); // 完成 */!* alert( `The loop took ${end - start} ms` ); // 相减的是时间戳,而不是日期 ``` -## 基准 +## 基准(Benchmarking) 如果我们想要为一个很耗 CPU 性能的函数提供一个可靠的基准,我们应该小心一点。 -举个例子:我们想判断两个计算日期差值的函数,那个更快? +例如,我们想判断两个计算日期差值的函数:哪个更快? + +这种性能度量通常称为“基准”。 ```js -// 我们有 date1 和 date2,哪个函数会更快返回两者的时间差? +// 我们有 date1 和 date2,哪个函数会更快地返回两者的时间差? function diffSubtract(date1, date2) { return date2 - date1; } @@ -270,11 +282,11 @@ function diffGetTime(date1, date2) { } ``` -两个函数做的事情完全相同,但是其中一个明确使用 `date.getTime()` 来获取毫秒形式的日期,另外一个依赖「日期-数字」的转化。它们的结果是一致的。 +这两个函数做的事情完全相同,但是其中一个函数使用显性的 `date.getTime()` 来获取毫秒形式的日期,另一个则依赖于“日期 — 数字”的转换。它们的结果是一样的。 那么,哪个更快呢? -首先想到的方法是:分别运行它们很多次,然后计算各自的时间差。在我们的例子中,函数非常简单,所以我们需要运行 100000 次左右。 +首先想到的方法可能是连续运行它们很多次,并计算时间差。就我们的例子而言,函数非常简单,所以我们必须执行至少 100000 次。 让我们开始测量: @@ -304,15 +316,15 @@ alert( 'Time of diffGetTime: ' + bench(diffGetTime) + 'ms' ); 好,我们得到了结论,但是这并不是一个很好的基准例子。 -想象一下当运行 `bench(diffSubtract)` 的同时,CPU 还在并行处理其他事务。然而,运行 `bench(diffGetTime)` 的时候,并行处理的事务完成了。 +想象一下当运行 `bench(diffSubtract)` 的同时,CPU 还在并行处理其他事务,并且这也会占用资源。然而,运行 `bench(diffGetTime)` 的时候,并行处理的事务完成了。 -这是一个对于现代多进程操作系统来说,毫不夸张的场景。 +这是对于现代多进程操作系统来说的一个非常真实的场景。 -结果就是,第一个函数相比于第二个,缺少 CPU 资源,这可能导致错误的结论。 +结果就是,第一个函数相比于第二个函数,缺少 CPU 资源。这可能导致错误的结论。 -**为了得到更加可靠的基准,所有的时间间隔需要多次返回。** +**为了得到更加可靠的基准,整个基准测试包应该重新运行多次。** -下面是示范代码: +例如,像下面的代码这样: ```js run function diffSubtract(date1, date2) { @@ -336,7 +348,7 @@ let time1 = 0; let time2 = 0; *!* -// 交替运行 bench(upperSlice) 和 bench(upperLoop) 10 次 +// 交替运行 bench(upperSlice) 和 bench(upperLoop) 各 10 次 for (let i = 0; i < 10; i++) { time1 += bench(diffSubtract); time2 += bench(diffGetTime); @@ -347,10 +359,10 @@ alert( 'Total time for diffSubtract: ' + time1 ); alert( 'Total time for diffGetTime: ' + time2 ); ``` -现代的 JavaScript 引擎的先进优化策略只对执行很多次的 "hot code" 有效(对于执行很少次数的代码没有必要优化)。因此,以上的例子中,第一部分不会被优化,我们可能需要增加一个升温步骤: +现代的 JavaScript 引擎的先进优化策略只对执行很多次的 "hot code" 有效(对于执行很少次数的代码没有必要优化)。因此,在上面的例子中,第一次执行的优化程度不高。我们可能需要增加一个升温步骤: ```js -// 主循环中增加「升温」环节 +// 在主循环中增加“升温”环节 bench(diffSubtract); bench(diffGetTime); @@ -361,7 +373,7 @@ for (let i = 0; i < 10; i++) { } ``` -```warn header="做微度量时请小心" +```warn header="进行微基准测试时要小心" 现代的 JavaScript 引擎会做很多优化。相对于「正常情况」,它们可能会改变「人为测试」的结果,特别是我们度量的目标很细微。因此,如果你想好好了解一下性能,请学习 JavaScript 引擎的工作原理。在那之后,你可能再也不需要微度量了。 关于 V8 引擎的大量文章,点击:. From 95d4d5ba9a899bf27e4fcf568dc862def8ea987f Mon Sep 17 00:00:00 2001 From: LeviDing Date: Thu, 20 Feb 2020 22:39:49 +0800 Subject: [PATCH 03/22] Update article.md --- 1-js/05-data-types/11-date/article.md | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/1-js/05-data-types/11-date/article.md b/1-js/05-data-types/11-date/article.md index 2c219d9c07..3f33f83df6 100644 --- a/1-js/05-data-types/11-date/article.md +++ b/1-js/05-data-types/11-date/article.md @@ -2,7 +2,7 @@ 让我一起学习一个新的内建对象:[日期(Date)](mdn:js/Date)。该对象存储日期和时间,并提供了日期/时间的管理方法。 -例如,我们可以使用它来存储创建/修改时间,或者用来度量时间,再或者仅用来打印当前时间。 +例如,我们可以使用它来存储创建/修改时间,或者用来测量时间,再或者仅用来打印当前时间。 ## 创建 @@ -218,24 +218,24 @@ alert(+date); // 以毫秒为单位的数值,与使用 date.getTime() 的结 有一个重要的副作用:日期可以相减,相减的结果是以毫秒为单位时间差。 -这个作用可以用于时间度量: +这个作用可以用于时间测量: ```js run -let start = new Date(); // 开始度量时间 +let start = new Date(); // 开始测量时间 // do the job for (let i = 0; i < 100000; i++) { let doSomething = i * i * i; } -let end = new Date(); // 结束度量时间 +let end = new Date(); // 结束测量时间 alert( `The loop took ${end - start} ms` ); ``` ## Date.now() -如果我们仅仅想要度量时间间隔,我们不需要 `Date` 对象。 +如果我们仅仅想要测量时间间隔,我们不需要 `Date` 对象。 有一个特殊的方法 `Date.now()`,它会返回当前的时间戳。 @@ -262,13 +262,13 @@ let end = Date.now(); // 完成 alert( `The loop took ${end - start} ms` ); // 相减的是时间戳,而不是日期 ``` -## 基准(Benchmarking) +## 度量(Benchmarking) -如果我们想要为一个很耗 CPU 性能的函数提供一个可靠的基准,我们应该小心一点。 +如果我们想要为一个很耗 CPU 性能的函数提供一个可靠的度量(benchmark),我们应该小心一点。 例如,我们想判断两个计算日期差值的函数:哪个更快? -这种性能度量通常称为“基准”。 +这种性能测量通常称为“度量(benchmark)”。 ```js // 我们有 date1 和 date2,哪个函数会更快地返回两者的时间差? @@ -314,7 +314,7 @@ alert( 'Time of diffGetTime: ' + bench(diffGetTime) + 'ms' ); 哇!使用 `getTime()` 这种方式快得多!原因是它没有类型转化,这样对引擎优化来说更加简单。 -好,我们得到了结论,但是这并不是一个很好的基准例子。 +好,我们得到了结论,但是这并不是一个很好的度量的例子。 想象一下当运行 `bench(diffSubtract)` 的同时,CPU 还在并行处理其他事务,并且这也会占用资源。然而,运行 `bench(diffGetTime)` 的时候,并行处理的事务完成了。 @@ -322,7 +322,7 @@ alert( 'Time of diffGetTime: ' + bench(diffGetTime) + 'ms' ); 结果就是,第一个函数相比于第二个函数,缺少 CPU 资源。这可能导致错误的结论。 -**为了得到更加可靠的基准,整个基准测试包应该重新运行多次。** +**为了得到更加可靠的度量,整个度量测试包应该重新运行多次。** 例如,像下面的代码这样: @@ -373,10 +373,10 @@ for (let i = 0; i < 10; i++) { } ``` -```warn header="进行微基准测试时要小心" -现代的 JavaScript 引擎会做很多优化。相对于「正常情况」,它们可能会改变「人为测试」的结果,特别是我们度量的目标很细微。因此,如果你想好好了解一下性能,请学习 JavaScript 引擎的工作原理。在那之后,你可能再也不需要微度量了。 +```warn header="进行微度量测试时要小心" +现代的 JavaScript 引擎执行了很多优化。与“正常使用”相比,它们可能会改变“人为测试”的结果,特别是在我们对很细微的东西进行度量测试时,例如 operator 的工作方式或内建函数。因此,如果你想好好了解一下性能,请学习 JavaScript 引擎的工作原理。在那之后,你可能再也不需要微度量了。 -关于 V8 引擎的大量文章,点击:. +关于 V8 引擎的大量文章,可以在 找到。 ``` ## 对一个字符串使用 Date.parse From 743d7f76ff34f29912d71e3c282ff61910dae6f8 Mon Sep 17 00:00:00 2001 From: LeviDing Date: Fri, 21 Feb 2020 09:16:22 +0800 Subject: [PATCH 04/22] Update article.md --- 1-js/05-data-types/11-date/article.md | 36 +++++++++++++-------------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/1-js/05-data-types/11-date/article.md b/1-js/05-data-types/11-date/article.md index 3f33f83df6..f8d18b25f8 100644 --- a/1-js/05-data-types/11-date/article.md +++ b/1-js/05-data-types/11-date/article.md @@ -383,16 +383,16 @@ for (let i = 0; i < 10; i++) { [Date.parse(str)](mdn:js/Date/parse) 方法可以从一个字符串中读取日期。 -字符串的格式是:`YYYY-MM-DDTHH:mm:ss.sssZ`,其中: +字符串的格式应该为:`YYYY-MM-DDTHH:mm:ss.sssZ`,其中: - `YYYY-MM-DD` —— 日期:年-月-日。 -- 字符串 `"T"` 是一个分隔符。 +- 字符 `"T"` 是一个分隔符。 - `HH:mm:ss.sss` —— 时间:小时,分钟,秒,毫秒。 -- 可选字符 `'Z'` 代表时区。单个字符 `Z` 代表 UTC+0。 +- 可选字符 `'Z'` 为 `+-hh:mm` 格式的时区。单个字符 `Z` 代表 UTC+0 时区。 -简短形式也是可以的,比如 `YYYY-MM-DD` 或者 `YYYY-MM` 又或者 `YYYY`。 +简短形式也是可以的,比如 `YYYY-MM-DD` 或 `YYYY-MM`,甚至可以是 `YYYY`。 -`Date.parse(str)` 方法会转化一个特定格式的字符串,返回一个时间戳(自 1970-01-01 00:00:00 起的毫秒数),如果格式不正确,返回 `NaN`。 +`Date.parse(str)` 调用会解析给定格式的字符串,并返回时间戳(自 1970-01-01 00:00:00 起所经过的毫秒数)。如果给定字符串的格式不正确,则返回 `NaN`。 举个例子: @@ -402,7 +402,7 @@ let ms = Date.parse('2012-01-26T13:51:50.417-07:00'); alert(ms); // 1327611110417 (时间戳) ``` -我们可以通过时间戳来立即创建一个 `new Date` 对象戳: +我们可以通过时间戳来立即创建一个 `new Date` 对象: ```js run let date = new Date( Date.parse('2012-01-26T13:51:50.417-07:00') ); @@ -410,24 +410,24 @@ let date = new Date( Date.parse('2012-01-26T13:51:50.417-07:00') ); alert(date); ``` -## 小结 +## 总结 -- 在 JavaScript 中,日期和时间使用 [Date](mdn:js/Date) 对象来表示。不能只创建日期,或者只创建时间,`Date` 对象总是两个都创建。 +- 在 JavaScript 中,日期和时间使用 [Date](mdn:js/Date) 对象来表示。我们不能只创建日期,或者只创建时间,`Date` 对象总是同时创建两者。 - 月份从 0 开始计数(对,一月是 0)。 -- 一周的某一天 `getDay()` 同样从 0 开始计算(0 代表星期天)。 -- 当超出范围的信息被设置时,`Date` 会做自我校准。这一点对于日/月/小时 的加减很有效。 -- 日期可以相减,得到的是两者的差值,用毫秒表示。因为当转化为数字时,`Date` 对象变为时间戳。 -- 使用 `Date.now()` 可以更快地得到当前时间的时间戳。 +- 一周中的某一天 `getDay()` 同样从 0 开始计算(0 代表星期日)。 +- 当设置了超出范围的组件时,`Date` 会进行自我校准。这一点对于日/月/小时的加减很有用。 +- 日期可以相减,得到的是以毫秒表示的两者的差值。因为当 `Date` 被转换为数字时,`Date` 对象会被转换为时间戳。 +- 使用 `Date.now()` 可以更快地获取当前时间的时间戳。 -和其他语言不同,JavaScript 中时间戳是用毫秒表示,而不是秒。 +和其他系统不同,JavaScript 中时间戳以毫秒为单位,而不是秒。 -同样,有时候我们会需要更加精准的时间度量。JavaScript 自身并不能度量微秒(一秒的百万分之一),但很多环境会提供。举个例子:浏览器拥有 [performance.now()](mdn:api/Performance/now) 方法来提供页面加载的微秒数(毫秒的小数点再右移三位): +有时我们需要更加精准的时间度量。JavaScript 自身并没有测量微秒的方法(百万分之一秒),但大多数运行环境会提供。例如:浏览器有 [performance.now()](mdn:api/Performance/now) 方法来给出从页面加载开始的以毫秒为单位的微秒数(精确到毫秒的小数点后三位): ```js run alert(`Loading started ${performance.now()}ms ago`); -// 得到 "Loading started 34731.26000000001ms ago" -// .26 is 微秒(260 微秒) -// 小数点后超过 3 位是错误,只有前三位是正确的 +// 类似于 "Loading started 34731.26000000001ms ago" +// .26 表示的是微秒(260 微秒) +// 小数点后超过 3 位的数字是精度错误,只有前三位数字是正确的 ``` -Node.JS 拥有 `microtime` 模块以及其他方法。从技术上来说,任何设备和环境都允许获取更精确的数值,不只是 `Date` 对象。 +Node.js 有 `microtime` 模块以及其他方法。从技术上讲,几乎所有的设备和环境都允许获取更高精度的数值,只是不是通过 `Date` 对象。 From cbe016c34ed130ef5621396001156da986eb5c1a Mon Sep 17 00:00:00 2001 From: LeviDing Date: Fri, 21 Feb 2020 09:30:18 +0800 Subject: [PATCH 05/22] Update solution.md --- 1-js/05-data-types/11-date/1-new-date/solution.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/05-data-types/11-date/1-new-date/solution.md b/1-js/05-data-types/11-date/1-new-date/solution.md index 60947be98c..1a677e42b6 100644 --- a/1-js/05-data-types/11-date/1-new-date/solution.md +++ b/1-js/05-data-types/11-date/1-new-date/solution.md @@ -1,4 +1,4 @@ -`new Date` 构造函数默认使用当地时区。所以唯一需要牢记的是月份从 0 开始计数。 +`new Date` 构造函数默认使用本地时区。所以唯一需要牢记的就是月份从 0 开始计数。 所以二月对应的数值是 1。 From 5396fa467e3e4064f9d82070b2f71739cf00981a Mon Sep 17 00:00:00 2001 From: LeviDing Date: Fri, 21 Feb 2020 09:37:45 +0800 Subject: [PATCH 06/22] Update task.md --- 1-js/05-data-types/11-date/2-get-week-day/task.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/1-js/05-data-types/11-date/2-get-week-day/task.md b/1-js/05-data-types/11-date/2-get-week-day/task.md index e4e5090986..0abfa3c45d 100644 --- a/1-js/05-data-types/11-date/2-get-week-day/task.md +++ b/1-js/05-data-types/11-date/2-get-week-day/task.md @@ -2,11 +2,11 @@ importance: 5 --- -# 展示星期数 +# 显示星期数 -写一个函数 `getWeekDay(date)` 来显示一个日期的星期数,用简写表示:'MO'、'TU'、'WE'、'TH'、'FR'、'SA'、'SU'。 +编写一个函数 `getWeekDay(date)` 以短格式来显示一个日期的星期数:'MO','TU','WE','TH','FR','SA','SU'。 -举个例子 +例如: ```js no-beautify let date = new Date(2012, 0, 3); // 3 Jan 2012 From 7c71669b8a58b33f115f9d7cafa7476822dae001 Mon Sep 17 00:00:00 2001 From: LeviDing Date: Fri, 21 Feb 2020 10:34:47 +0800 Subject: [PATCH 07/22] Update solution.md --- 1-js/05-data-types/11-date/2-get-week-day/solution.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/1-js/05-data-types/11-date/2-get-week-day/solution.md b/1-js/05-data-types/11-date/2-get-week-day/solution.md index 3ffff7c6e7..8c2c7e78c3 100644 --- a/1-js/05-data-types/11-date/2-get-week-day/solution.md +++ b/1-js/05-data-types/11-date/2-get-week-day/solution.md @@ -1,8 +1,8 @@ -`date.getDay()` 方法返回星期数,从星期日开始。 +`date.getDay()` 方法返回从星期日开始的星期数。 -我们创建一个星期数组,这样可以通过它的序号得到名称: +我们创建一个关于星期的数组,这样我们就可以通过编号获取正确的日期名称: -```js run +```js run demo function getWeekDay(date) { let days = ['SU', 'MO', 'TU', 'WE', 'TH', 'FR', 'SA']; From 2eecffe62ab9292697aa6e2a810e333d5cac0710 Mon Sep 17 00:00:00 2001 From: LeviDing Date: Fri, 21 Feb 2020 10:37:28 +0800 Subject: [PATCH 08/22] Update solution.md --- 1-js/05-data-types/11-date/3-weekday/solution.md | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/1-js/05-data-types/11-date/3-weekday/solution.md b/1-js/05-data-types/11-date/3-weekday/solution.md index 58f81bb35d..8b13789179 100644 --- a/1-js/05-data-types/11-date/3-weekday/solution.md +++ b/1-js/05-data-types/11-date/3-weekday/solution.md @@ -1,14 +1 @@ -```js run -function getLocalDay(date) { - let day = date.getDay(); - -  if (day == 0) { // 0,改为 7 - day = 7; - } - - return day; -} - -alert( getLocalDay(new Date(2012, 0, 3)) ); // 2 -``` From 0c7ccaa86b1ba89304d93cd4867c6d7ab509b822 Mon Sep 17 00:00:00 2001 From: LeviDing Date: Fri, 21 Feb 2020 10:37:47 +0800 Subject: [PATCH 09/22] Update solution.md From 8732db96b1b12528bb429acef8f1fec117a73be3 Mon Sep 17 00:00:00 2001 From: LeviDing Date: Fri, 21 Feb 2020 10:40:35 +0800 Subject: [PATCH 10/22] Update task.md --- 1-js/05-data-types/11-date/3-weekday/task.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/1-js/05-data-types/11-date/3-weekday/task.md b/1-js/05-data-types/11-date/3-weekday/task.md index 353a34ba1e..b730d93315 100644 --- a/1-js/05-data-types/11-date/3-weekday/task.md +++ b/1-js/05-data-types/11-date/3-weekday/task.md @@ -4,9 +4,9 @@ importance: 5 # 欧洲的星期表示方法 -欧洲国家的星期计算是从星期一(数字 1)开始,然后星期二(数字 2),直到星期日(数字 7)。写一个函数 `getLocalDay(date)`,返回日期的欧洲式星期数。 +欧洲国家的星期计算是从星期一(数字 1)开始的,然后是星期二(数字 2),直到星期日(数字 7)。编写一个函数 `getLocalDay(date)`,并返回日期的欧洲式星期数。 ```js no-beautify let date = new Date(2012, 0, 3); // 3 Jan 2012 -alert( getLocalDay(date) );       // 星期二,应该返回 2 +alert( getLocalDay(date) ); // 星期二,应该显示 2 ``` From 983ccd88ad0ea8666f9ce2ea7e78474dc1460b76 Mon Sep 17 00:00:00 2001 From: LeviDing Date: Fri, 21 Feb 2020 11:19:53 +0800 Subject: [PATCH 11/22] Update task.md --- 1-js/05-data-types/11-date/4-get-date-ago/task.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/1-js/05-data-types/11-date/4-get-date-ago/task.md b/1-js/05-data-types/11-date/4-get-date-ago/task.md index 676403657c..72077e8c84 100644 --- a/1-js/05-data-types/11-date/4-get-date-ago/task.md +++ b/1-js/05-data-types/11-date/4-get-date-ago/task.md @@ -2,11 +2,11 @@ importance: 4 --- -# 许多天之前是该月的哪一天? +# 许多天之前是哪个月几号? -写一个函数 `getDateAgo(date, days)`,返回特定日期 `date` 往前 `days` 天数后,是当月的哪一天。 +写一个函数 `getDateAgo(date, days)`,返回特定日期 `date` 往前 `days` 天是哪个月的哪一天。 -举个例子,今天是 20 号,那么 `getDateAgo(new Date(), 1)` 应该是 19 号,`getDateAgo(new Date(), 2)` 应该是 18 号。 +例如,假设今天是 20 号,那么 `getDateAgo(new Date(), 1)` 的结果应该是 19 号,`getDateAgo(new Date(), 2)` 的结果应该是 18 号。 跨月、年也应该是正确输出: @@ -18,4 +18,4 @@ alert( getDateAgo(date, 2) ); // 31, (31 Dec 2014) alert( getDateAgo(date, 365) ); // 2, (2 Jan 2014) ``` -另:函数不能修改给定的 `date` 值。 +P.S. 函数不应该修改给定的 `date` 值。 From 276b043e58358dcfd64689accb1ad610bdd29a7f Mon Sep 17 00:00:00 2001 From: LeviDing Date: Fri, 21 Feb 2020 11:42:42 +0800 Subject: [PATCH 12/22] Update solution.md --- 1-js/05-data-types/11-date/4-get-date-ago/solution.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/1-js/05-data-types/11-date/4-get-date-ago/solution.md b/1-js/05-data-types/11-date/4-get-date-ago/solution.md index 08f5d35784..f96f29336c 100644 --- a/1-js/05-data-types/11-date/4-get-date-ago/solution.md +++ b/1-js/05-data-types/11-date/4-get-date-ago/solution.md @@ -7,11 +7,11 @@ function getDateAgo(date, days) { } ``` -...但是函数不能修改 `date`。这一点很重要,因为外部环境不希望它被修改。 +……但是函数不能修改 `date`。这一点很重要,因为我们提供日期的外部代码不希望它被修改。 要实现这一点,我们可以复制这个日期,就像这样: -```js run +```js run demo function getDateAgo(date, days) { let dateCopy = new Date(date); From 7bf358efeff204d865e1776711ab6d55c2c6ff87 Mon Sep 17 00:00:00 2001 From: LeviDing Date: Fri, 21 Feb 2020 11:51:17 +0800 Subject: [PATCH 13/22] Update task.md --- 1-js/05-data-types/11-date/5-last-day-of-month/task.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/1-js/05-data-types/11-date/5-last-day-of-month/task.md b/1-js/05-data-types/11-date/5-last-day-of-month/task.md index 8ae1267064..f4ca360978 100644 --- a/1-js/05-data-types/11-date/5-last-day-of-month/task.md +++ b/1-js/05-data-types/11-date/5-last-day-of-month/task.md @@ -4,11 +4,11 @@ importance: 5 # 某月的最后一天? -写一个函数 `getLastDayOfMonth(year, month)`,返回某月的最后一天,有时候是 30,有时是31,甚至是二月的 28/29。 +写一个函数 `getLastDayOfMonth(year, month)` 返回 month 月的最后一天。有时候是 30,有时是 31,甚至在二月的时候会是 28/29。 参数: - `year` —— 四位数的年份,比如 2012。 - `month` —— 月份,从 0 到 11。 -举个例子,`getLastDayOfMonth(2012, 1) = 29` +举个例子,`getLastDayOfMonth(2012, 1) = 29`(闰年,二月) From 8c6a4de905ad093b2e5fbed8a35d0457c08bd933 Mon Sep 17 00:00:00 2001 From: LeviDing Date: Fri, 21 Feb 2020 12:14:14 +0800 Subject: [PATCH 14/22] Update solution.md --- 1-js/05-data-types/11-date/5-last-day-of-month/solution.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/1-js/05-data-types/11-date/5-last-day-of-month/solution.md b/1-js/05-data-types/11-date/5-last-day-of-month/solution.md index 65f61c5bae..08fde3ca56 100644 --- a/1-js/05-data-types/11-date/5-last-day-of-month/solution.md +++ b/1-js/05-data-types/11-date/5-last-day-of-month/solution.md @@ -1,5 +1,5 @@ -Let's create a date using the next month, but pass zero as the day: -```js run +让我们使用下个月创建日期,但将零作为天数(day)传递: +```js run demo function getLastDayOfMonth(year, month) { let date = new Date(year, month + 1, 0); return date.getDate(); @@ -10,4 +10,4 @@ alert( getLastDayOfMonth(2012, 1) ); // 29 alert( getLastDayOfMonth(2013, 1) ); // 28 ``` -Normally, dates start from 1, but technically we can pass any number, the date will autoadjust itself. So when we pass 0, then it means "one day before 1st day of the month", in other words: "the last day of the previous month". +通常,日期从 1 开始,但从技术上讲,我们可以传递任何数字,日期会自动进行调整。因此,当我们传递 0 时,它的意思是“一个月的第一天的前一天”,换句话说:“上个月的最后一天”。 From 6db8c622b82dee69af678f6ad05acdd35c590bb2 Mon Sep 17 00:00:00 2001 From: LeviDing Date: Fri, 21 Feb 2020 12:16:10 +0800 Subject: [PATCH 15/22] Update task.md --- 1-js/05-data-types/11-date/6-get-seconds-today/task.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/1-js/05-data-types/11-date/6-get-seconds-today/task.md b/1-js/05-data-types/11-date/6-get-seconds-today/task.md index 0c240a5c39..e06f3cf95a 100644 --- a/1-js/05-data-types/11-date/6-get-seconds-today/task.md +++ b/1-js/05-data-types/11-date/6-get-seconds-today/task.md @@ -6,10 +6,10 @@ importance: 5 写一个函数 `getSecondsToday()`,返回今天已经过去了多少秒? -举个例子:如果现在是`10:00 am`,并且没有夏令时转移,那么: +例如:如果现在是 `10:00 am`,并且没有夏令时转换,那么: ```js getSecondsToday() == 36000 // (3600 * 10) ``` -该函数应该在任意一天都能正确运行。那意味着,它不应具有「今天」的硬编码值。 +该函数应该在任意一天都能正确运行。那意味着,它不应具有“今天”的硬编码值。 From 66687dc871bcd398d0d77ff3e5e7dee7708cefad Mon Sep 17 00:00:00 2001 From: LeviDing Date: Fri, 21 Feb 2020 12:38:44 +0800 Subject: [PATCH 16/22] Update solution.md --- .../11-date/6-get-seconds-today/solution.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/1-js/05-data-types/11-date/6-get-seconds-today/solution.md b/1-js/05-data-types/11-date/6-get-seconds-today/solution.md index 2af9ae5802..58fec592b4 100644 --- a/1-js/05-data-types/11-date/6-get-seconds-today/solution.md +++ b/1-js/05-data-types/11-date/6-get-seconds-today/solution.md @@ -1,13 +1,13 @@ -为获取秒数,我们可以创建一个日期,使用今天的日期和 00:00:00 这个时间,然后当前时间减去该时间。 +为获取秒数,我们可以使用今天的日期和 00:00:00 这个时间创建一个日期,然后使用当前时间减去该时间。 -不同之处在于,这样得到的今天之初的日期是毫秒计算,我们应该除以 1000,得到秒数: +不同之处在于,从今天之初开始算起的时间是以毫秒计算的,我们应该将其处以 1000,进而得到秒数: ```js run function getSecondsToday() { let now = new Date(); -  // 创建一个对象,使用当前的 day/month/year -  let today = new Date(now.getFullYear(), now.getMonth(), now.getDate()); +  // 使用当前的 day/month/year 创建一个对象 + let today = new Date(now.getFullYear(), now.getMonth(), now.getDate()); let diff = now - today; // ms difference return Math.round(diff / 1000); // make seconds @@ -16,7 +16,7 @@ function getSecondsToday() { alert( getSecondsToday() ); ``` -另一种解决方法是得到 hours/minutes/seconds,然后把它们转化为秒数: +另一种解决方法是获取 hours/minutes/seconds,然后把它们转换为秒数: ```js run function getSecondsToday() { From f3469e97964deac65c6edcd9b5fca95c12011d6d Mon Sep 17 00:00:00 2001 From: LeviDing Date: Fri, 21 Feb 2020 12:41:04 +0800 Subject: [PATCH 17/22] Update task.md --- 1-js/05-data-types/11-date/7-get-seconds-to-tomorrow/task.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/1-js/05-data-types/11-date/7-get-seconds-to-tomorrow/task.md b/1-js/05-data-types/11-date/7-get-seconds-to-tomorrow/task.md index 775e27e00e..a547fa3b39 100644 --- a/1-js/05-data-types/11-date/7-get-seconds-to-tomorrow/task.md +++ b/1-js/05-data-types/11-date/7-get-seconds-to-tomorrow/task.md @@ -6,10 +6,10 @@ importance: 5 写一个函数 `getSecondsToTomorrow()`,返回距离明天的秒数。 -举个例子,现在是 `23:00`,那么: +例如,现在是 `23:00`,那么: ```js getSecondsToTomorrow() == 3600 ``` -另:该函数应该能在任意一天运行 +P.S. 该函数应该在任意一天都能正确运行。那意味着,它不应具有“今天”的硬编码值。 From 6509237539de9848e314d30fb50982f83ed3a903 Mon Sep 17 00:00:00 2001 From: LeviDing Date: Fri, 21 Feb 2020 12:46:31 +0800 Subject: [PATCH 18/22] Update solution.md --- .../11-date/7-get-seconds-to-tomorrow/solution.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/1-js/05-data-types/11-date/7-get-seconds-to-tomorrow/solution.md b/1-js/05-data-types/11-date/7-get-seconds-to-tomorrow/solution.md index e119258cf5..3adf8f4a74 100644 --- a/1-js/05-data-types/11-date/7-get-seconds-to-tomorrow/solution.md +++ b/1-js/05-data-types/11-date/7-get-seconds-to-tomorrow/solution.md @@ -1,5 +1,6 @@ -为获取距离明天的毫秒数,我们可以用「第二天 00:00:00」这个对象减去当前的日期。 -首先我们生成「第二天」,然后对它做操作: +为获取距离明天的毫秒数,我们可以用“明天 00:00:00”这个日期减去当前的日期。 + +首先我们生成“明天”,然后对其进行减法操作: ```js run function getSecondsToTomorrow() { @@ -28,4 +29,4 @@ function getSecondsToTomorrow() { } ``` -请注意,很多国家有夏令时(DST),因此他们可能一天有 23 小时或者 25 小时。我们对这些天数要区别对待。 +请注意,很多国家有夏令时(DST),因此他们的一天可能有 23 小时或者 25 小时。我们对这些天数要区别对待。 From 997aed2cd5b638f0212282900ffabe7dcd174b70 Mon Sep 17 00:00:00 2001 From: LeviDing Date: Fri, 21 Feb 2020 12:52:44 +0800 Subject: [PATCH 19/22] Update task.md --- .../11-date/8-format-date-relative/task.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/1-js/05-data-types/11-date/8-format-date-relative/task.md b/1-js/05-data-types/11-date/8-format-date-relative/task.md index 2f9042a85f..1ae208297b 100644 --- a/1-js/05-data-types/11-date/8-format-date-relative/task.md +++ b/1-js/05-data-types/11-date/8-format-date-relative/task.md @@ -4,12 +4,12 @@ importance: 4 # 格式化相对日期 -写一个函数 `formatDate(date)`,能够将 `date` 格式化如下: +写一个函数 `formatDate(date)`,能够对 `date` 进行如下格式化: -- 如果 `date` 距离现在少于 1 秒,输出 `"刚刚"`。 -- 否则,如果少于 1 分钟,输出 `"n 秒之前"`。 -- 否则,如果少于 1 小时,输出 `"n 分钟之前"`。 -- 否则,输出完整日期,用格式`"DD.MM.YY HH:mm"`。即:`"day.month.year hours:minutes"`,所有的数都用两位数表示,例如:`31.12.16 10:00`。 +- 如果 `date` 距离现在不到 1 秒,输出 `"right now"`。 +- 否则,如果 `date` 距离现在不到 1 分钟,输出 `"n sec. ago"`。 +- 否则,如果不到 1 小时,输出 `"m min. ago"`。 +- 否则,以 `"DD.MM.YY HH:mm"` 格式输出完整日期。即:`"day.month.year hours:minutes"`,全部以两位数格式表示,例如:`31.12.16 10:00`。 举个例子: @@ -20,6 +20,6 @@ alert( formatDate(new Date(new Date - 30 * 1000)) ); // "30 sec. ago" alert( formatDate(new Date(new Date - 5 * 60 * 1000)) ); // "5 min. ago" -// yesterday's date like 31.12.2016, 20:00 +// yesterday's date like 31.12.16, 20:00 alert( formatDate(new Date(new Date - 86400 * 1000)) ); ``` From f503cd50e760f8a885be9f8699a92aaa8110c221 Mon Sep 17 00:00:00 2001 From: LeviDing Date: Fri, 21 Feb 2020 13:48:22 +0800 Subject: [PATCH 20/22] Update solution.md --- .../8-format-date-relative/solution.md | 28 ++++++++++--------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/1-js/05-data-types/11-date/8-format-date-relative/solution.md b/1-js/05-data-types/11-date/8-format-date-relative/solution.md index 124c143190..83d65d5ce8 100644 --- a/1-js/05-data-types/11-date/8-format-date-relative/solution.md +++ b/1-js/05-data-types/11-date/8-format-date-relative/solution.md @@ -1,26 +1,26 @@ -为获取 `date` 距离当前时间的间隔 —— 我们将两个日期相减。 +为了获取 `date` 距离当前时间的间隔 —— 我们将两个日期相减。 -```js run +```js run demo function formatDate(date) { -  let diff = new Date() - date; // 差值用毫秒表示 + let diff = new Date() - date; // 以毫秒表示的差值 -  if (diff < 1000) { // 少于一秒 +  if (diff < 1000) { // 少于 1 秒    return 'right now'; } -  let sec = Math.floor(diff / 1000); // 将间隔转化为秒 + let sec = Math.floor(diff / 1000); // 将 diff 转换为秒 if (sec < 60) { return sec + ' sec. ago'; } -  let min = Math.floor(diff / 60000); // 将间隔转化为分钟 + let min = Math.floor(diff / 60000); // 将 diff 转换为分钟  if (min < 60) { return min + ' min. ago'; } -  // 格式化日期 -  // 在单个数值之前加 0 日/月/小时/分钟 + // 格式化 date + // 将前置 0 加到单个数值 day/month/hours/minutes 前 let d = date; d = [ '0' + d.getDate(), @@ -40,7 +40,7 @@ alert( formatDate(new Date(new Date - 30 * 1000)) ); // "30 sec. ago" alert( formatDate(new Date(new Date - 5 * 60 * 1000)) ); // "5 min. ago" -// 昨天的日期如: 31.12.2016, 20:00 +// 昨天的日期如:31.12.2016, 20:00 alert( formatDate(new Date(new Date - 86400 * 1000)) ); ``` @@ -57,12 +57,14 @@ function formatDate(date) { let diffSec = Math.round(diffMs / 1000); let diffMin = diffSec / 60; let diffHour = diffMin / 60; - -  // 格式化 -  year = year.toString().slice(-2); + + // 格式化 + year = year.toString().slice(-2); month = month < 10 ? '0' + month : month; dayOfMonth = dayOfMonth < 10 ? '0' + dayOfMonth : dayOfMonth; - + hour = hour < 10 ? '0' + hour : hour; + minutes = minutes < 10 ? '0' + minutes : minutes; + if (diffSec < 1) { return 'right now'; } else if (diffMin < 1) { From 8eea6c0d412896168114f2b800b9760620b37375 Mon Sep 17 00:00:00 2001 From: LeviDing Date: Fri, 21 Feb 2020 13:49:12 +0800 Subject: [PATCH 21/22] Update solution.md --- 1-js/05-data-types/11-date/8-format-date-relative/solution.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/05-data-types/11-date/8-format-date-relative/solution.md b/1-js/05-data-types/11-date/8-format-date-relative/solution.md index 83d65d5ce8..ac200c99d0 100644 --- a/1-js/05-data-types/11-date/8-format-date-relative/solution.md +++ b/1-js/05-data-types/11-date/8-format-date-relative/solution.md @@ -20,7 +20,7 @@ function formatDate(date) { } // 格式化 date - // 将前置 0 加到单个数值 day/month/hours/minutes 前 + // 将前置 0 加到单个数值的 day/month/hours/minutes 前 let d = date; d = [ '0' + d.getDate(), From 51e57a492b7c72d1f4686beceba6cb69648609f1 Mon Sep 17 00:00:00 2001 From: LeviDing Date: Fri, 21 Feb 2020 13:50:37 +0800 Subject: [PATCH 22/22] Update solution.md --- 1-js/05-data-types/11-date/8-format-date-relative/solution.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/05-data-types/11-date/8-format-date-relative/solution.md b/1-js/05-data-types/11-date/8-format-date-relative/solution.md index ac200c99d0..eb5fce1b17 100644 --- a/1-js/05-data-types/11-date/8-format-date-relative/solution.md +++ b/1-js/05-data-types/11-date/8-format-date-relative/solution.md @@ -20,7 +20,7 @@ function formatDate(date) { } // 格式化 date - // 将前置 0 加到单个数值的 day/month/hours/minutes 前 + // 将前置 0 加到一位数 day/month/hours/minutes 前 let d = date; d = [ '0' + d.getDate(),