Math、Date

135 阅读4分钟

1. Math

1.1. 什么是

封装算数计算的常量和API

1.2. 何时
  • 只要执行数学计算
1.3. 如何
  • 创建: Math 不用创建, 不能 new, 直接使用
1.4. API
  • 取整: 3 种

    1. 上取整: 只要超过, 就取下一个整数 -> Math.ceil(num)

    2. 下取整: 只要超过, 就省略小数部分 -> Math.floor(num)

    3. 四舍五入取整: Math.round(num)

      • vs toFixed(d)

        • 四舍五入取整:
          • 缺点: 只能取整, 不能指定小数位数
          • 优点: 返回 number, 可直接计算
        • n.toFixed(d):
          • 缺点: 返回字符串, 要先转化, 再计算
          • 优点: 可按任意小数位数四舍五入
      • 自定义 round 函数:

        function round(n, d){
          //将n* 10的d次方
          n *= Math.pow(10, d);
          //将n四舍五入取整
          n = Math.round(n);
          //将n/ 10的d次方
          n /= Math.pow(10,d);
          return n;//返回n
        }
        
  • 乘方和开平方

    • 乘方: Mtah.pow(底数, 幂)
      • Ex: 10 的 3 次方 -> Math.pow(10, 3)
    • 开平方: Math.sqrt(n)
      • Ex: 16 开平方 -> Math.sqrt(16)
  • 最大值和最小值

    • 最大值: Math.max(值1, 值2, 值3, .....)
    • 最小值: Math.min(值1, 值2, 值3, ......)
    • 问题: max / min 不支持数组参数
      • 解决: Math.max.apply(null, arr)
      • 常作为获取数组中的最大值 / 最小值
  • 随机数: var numR = Math.roundom()

    • 0 <= numR < 1 -> 取到 0 的几率很低

    • 公示: 在任意 min ~ max 之间取一个随机整数

      • parseInt(Mathi.random() * (max - min + 1) + min)

      • 简写: 如果 0 ~ max 之间

        • parseInt(Math.randon() * (max + 1))

2. Date

2.1. 什么是

封装一个时间值, 并提供操作时间的API

2.2. 何时
  • 只要保存 / 操作时间, 都要使用 Date
2.3. 如何
  • 创建: 4 种

    1. 自动获得当前系统时间: var now = new Date()

      • 强调: 只能获得客户端本地时间

    2. 创建自定义时间点:

      1. var myDate = new Date('yyyy/MM/dd hh:mm:ss')
        • 如果只关心日期, 不关心时间, 后半部分时分秒可省略 -> 省略后, 默认时间: 00:00:00
      2. var myDate = new Date(yyyy, MM - 1, dd, hh, mm, ss)
        • 月份, 都要 -1 修正 -> 计算机中的月份从 0 开始计算, 这种定义要修正月份
    3. 使用毫秒数创建日期对象

      • 原理: 日期对象中保存的是 1970 年 1 月 1 日 0 点至今的毫秒数 -> 整数

      • 为什么: 时间段, 不受时区影响

      • 相同的毫秒数: 在不同时区可显示不同的时间点

      • 总结: 今后在数据库中存储时间或在程序中存储时间都用毫秒数, 不要用文字

      • 问题: 人看不懂毫秒数

        • 解决: 将毫秒数转化为程序中的日期对象, 再输出
        • var myDate = new Date(ms)
        • 两个日期对象可相减 -> 得到毫秒差
    4. 复制一个日期对象

      • 为什么: 日期的计算只能直接修改原日期
      • 后果: 计算后, 原日期无法保存
      • 解决: 如果希望同时保存开始时间和结束时间, 都要先将开始时间复制一份, 再用副本计算结束时间
      • 如何: var myDate = new Date(originalDate)
  • API: 3 句话

    • 单位:
      • 年:FullYear / 月: Month / 日: Date / 星期几: Day / 时: Hours / 分: Minutes / 秒: Seconds / 毫秒: Milliseconds

    1. 每个单位都有一对儿 get单位() / set单位() 方法
      • date.get单位(): 获取指定单位的值
      • date.set单位(): 设置指定单位的值
      • 特例: Day 没有 set单位() 方法
    2. 命名: 1. 年 / 月 / 日 / 星期没有 s 结尾 2. 时 / 分 / 秒 / 毫秒都有 s 结尾
    3. 取值范围:
      • FullYear: 和现实中份一致
      • month: 0 ~ 11
        • 现实中: 1 ~ 12 -> 计算机中的份值, 比现实中少 1 -> 需要修正
      • Date: 1 ~ 31 -> 和现实中的一样
      • Date: 0 ~ 6
        • 现实: 日 ~ 六 -> 和现实中的星期一样
      • Hours: 和现实中的一样
      • Minutes / Seconds: 0 ~ 59 和现实中的 / 一样
  • 日期计算:

    1. 两日期对象可直接相减计算时间差( ms 差 )
    2. 对任意单位做加减: 3 步 -> 以日为例
      1. 取值: var date = now.getDate()
      2. 做加减: date += 30
      3. 放回去: now.setDate(date)
        • setDate 会自动调整进制
      4. 简写: now.setDate(now.getDate() + 30)
    3. 问题: setDate 直接修改原日期对象, 无法保留开始时间
      • 解决: 在计算前, 都要先将开始时间复制一个副本, 再用副本计算结束时间
  • 转字符串:

    • String(date): 将 date 转为当地时间的完整格式
    • date.toLocaleString(): 将 date 转化为当地时间简化版格式
    • date.toLocaleDateString(): 将 date 转化为当地时间简化版格式, 仅保留日期部分
    • date.toLocaleTimeString(): 将 date 转化为当地时间简化版格式, 仅保留时分秒部分
    • date.toGMTString(): 将 date 转化为 0 时区国际标准时间