追求JS小姊姊系列 Day10 -- 如果时间能重来,我不想跟工具人聊天(下)

前情提要

在D特的帮助下,试着穿越时空,但时间碎片凑齐了却还是出不去,现在该怎办?

:...所以我们会永远困在这吗?
D特:....(沈思样),我想刚刚会失败的原因是我们试着凭空要取得一个时间点,但照理应该是要创照出时间,再去进行穿梭。
:不管怎样,赶快来进行吧


没有专属的时间?也能用Date不求人

操作月份 -- Date.prototype.setMonth();

公式: setMonth(monthValue, dateValue)
公式解释:

  1. monthValue:0-11的整数值,依序代表1-12月
    1. 输入值符合区间(0-11):回传对应的毫秒值
    2. 输入值不符合(ex:15):会自动进位,视为1年又3个月
  2. dateValue:1-31的整数值(不建议略过月份,直接设定日期)

回传值:
从1970年到输入值对应的总毫秒值(millionTime),例如输入1995,就是回传1995-1970後换算毫秒值。

let rightNow = new Date();
//2021/9/25 13:55  
rightNow.setMonth(11);
//会根据你当下的年份,往前推算(11:代表2021的12月)

Q:当你输入的值(0-11)超过范围会怎样?

let rightNow = new Date();
//2021/9/25 13:55  
rightNow.setMonth(12);
//上面有提过,会根据当下时间往前,所以:
//Tue Jan 25 2022 13:56:05 GMT+0800 (台北标准时间)

操作年份 -- Date.prototype.setFullYear()

公式: setFullYear(yearValue, monthValue, dateValue)
公式解释:

  1. yearValue:输入一个整数值,eg:1995 (选择性)
  2. monthValue:0-11的整数值,依序代表1-12月 (选择性)
    1. 输入值符合区间(0-11):回传对应的毫秒值
    2. 输入值不符合(ex:15):会自动进位,视为1年又3个月
  3. dateValue:1-31的整数值(不建议略过月份,直接设定日期)(选择性)

回传值:
从1970年到输入值对应的总毫秒值(millionTime),例如输入1995,就是回传1995-1970後换算毫秒值
如果没填monthValue,dateValue会自动以getMonth(),getDate(),也就是根据local time取出时间

操作日期 -- Date.prototype.setDate();

公式: setDate(dayValue)
公式解释:

  1. dateValue:1-31的整数值(不建议略过月份,直接设定日期)

回传值:
从1970年到输入值对应的总毫秒值(millionTime),例如输入1995,就是回传1995-1970後换算毫秒值。

Date().setDate(31);

Q:当你输入的值(1-31)超过范围会怎样?

Date().setDate(33);
//根据你本地端当下的月份日期长度,例如现在是9月,共30天
//所以setDate(33) = 33 - 当下月份日期长度

Q:当你输入的值为负值时会怎样?

Date().setDate(-1);
//根据你本地端当下的月份的前一个月最後一天开始计算
//以上面的结果为例就会得到8/30 

操作小时 -- Date.prototype.setHours();

公式setHours(hoursValue, minutesValue, secondsValue, msValue)
公式解释

  1. hoursValue:有效值为0-23
  2. minutesValue:有效值为0-59(选择性)
  3. secondsValue:有效值为0-59(选择性)
  4. msValue:有效值为0-999(选择性)
    上述值共通性:当你输入超过原本范围的值都会累加。

回传值
从1970年到输入值对应的总毫秒值(millionTime),例如输入1995,就是回传1995-1970後换算毫秒值。
没有输入的部分同样会自动透过getMinutes(),getSeconds()

Q:当你输入的值(0-23)超过范围会怎样?

rigthNow.setHours(25);
//根据你本地端当下天数往前累计
//9/25 24+1 = 9/26 1am

Q:当你输入的值为负值时会怎样?

rigthNow.setHours(-1);
//根据你本地端当下天数的最後小时开始计算
//9/25 24-1 =23pm


:这样真的靠谱吗?跟上次的步骤很像诶...
D特:有道理的担心,你知道世界上的时间规范不只一种吗?
为了找出最精确的时间,这次保险起见,要参照哪个规范的时间也来设定一下吧?

你知道吗? 不只UTC一种标准,简单认识ISO,GMT的差别

  1. UTC:
    又称世界协调时间,是世界上最主要的时间标准,最接近於格林威治标准时间,但它没有包含夏令时间的调整,欲知更多:Coordinated Universal Time
  2. ISO 8601:
    是由**国际标准化组织(ISO)**所奠定对於日期与时间的表示方法,内容包含日历、日期、当地时间等的规范,欲知更多:ISO 8601
  3. GMT:
    就是上述的格林威治标准时间,由於格林威治平时基於天文观测本身的缺陷,已经被原子钟报时的世界协调时间(UTC)所取代。欲知更多:格林威治平均时间

Date.prototype.toUTCString();

公式toUTCString()
回传值:回传依据UTC time zone 规范 的 字串型别内容,
分别是:Www, dd Mmm yyyy hh:mm:ss GMT

下图是对应的内容:

console.log(rightNow.toUTCString());
//Sat, 25 Sep 2021 07:14:11 GMT

D特:有注意到吗?刚刚我们的执行顺序是:
操作月 > 操作年 > 操作日期 > 操作小时
流程错了,是条件跟流程的问题!
(欲知正确流程:可看追求JS小姊姊系列 Day9 -- 如果时间能重来,我不想跟工具人聊天(上)
:这里也能业配?!

-- to be continued --


那今天就到这边搂!今天分享喜欢的歌是:
伍佰 Wu Bai&China Blue【挪威的森林 Norwegian forest】Official Music Video
https://www.youtube.com/watch?v=gPpZJlE0Ca8

每天的休息,是为了後面的追求,明天见。


reference:
  1. MDN
  2. https://pjchender.dev/javascript/js-date-time/
  3. https://medium.com/coding-hot-pot/javascript-date%E7%89%A9%E4%BB%B6-e63d80d8a180

<<:  [11] [烧瓶里的部落格] 01. 初始化一个 Flask 专案 - 使用工厂模式

>>:  【Day10】AddInvitationFragment(下) X DatePickerDialog

[Day 27] 微探讨 Pure pipe 与 Impure pipe

今天要介绍的 Tip 是有关於 pipe 的 pure 与 impure,当没有任何额外的设定下,自...

DAY 24:Composite Pattern,管理有层次的物件们

什麽是 Composite Pattern? 将单一与多个物件的使用方式统一给使用者使用 UML 图...

[Day 39] 心情随笔後台及前台(一) - 心情随笔列表

心情随笔後台及前台 今天我们终於要进行心情随笔的部分, 首先是要建後台画面及功能, 我们的心情随笔就...

从无到有打造验证码共享的 Line 机器人

想解决的问题 起因是今年七月开 Netflix 开始限制共享家庭方案,认证规则目前没有公开,但会根据...

Day 1.开赛前的小心得

前言 从去年就看到学长们在做铁人赛崩溃的样子,没想到这麽快,今年换我们了(;´༎ຶД༎ຶ`) 对於刚...