JavaScript 基本引用类型Date详解

Date

​ Date 类型提供关于日期和时间的信息,包括当前日期、时间及相关计算。

​ ECMAScript 的 Date 类型参考了 Java 早期版本中的 java.util.Date。为此,Date 类型将日期保存为自协调世界时(UTC,Universal Time Coordinated)时间 1970 年 1 月 1 日午夜(零时)至今所经过的毫秒数。使用这种存储格式,Date 类型可以精确表示 1970 年 1 月 1 日之前及之后 285616 年的日期。 要创建日期对象,就使用 new 操作符来调用 Date 构造函数:

let now = new Date();

​ 在不给 Date 构造函数传参数的情况下,创建的对象将保存当前日期和时间。要基于其他日期和时间创建日期对象,必须传入其毫秒表示(UNIX 纪元 1970 年 1 月 1 日午夜之后的毫秒数)。ECMAScript 为此提供了两个辅助方法:Date.parse() 和 Date.UTC()。

Date.parse()

​ Date.parse() 方法接收一个表示日期的字符串参数,尝试将这个字符串转换为表示该日期的毫秒数。ECMA-262 第 5 版定义了 Date.parse() 应该支持的日期格式,填充了第 3 版遗留的空白。所有实现都必须支持下列日期格式:

  • “月/日/年”,如"5/23/2019";

  • “月名 日, 年”,如"May 23, 2019";

  • “周几 月名 日 年 时:分:秒 时区”,如"Tue May 23 2019 00:00:00 GMT-0700";

  • ISO 8601 扩展格式“YYYY-MM-DDTHH:mm:ss.sssZ”,如 2019-05-23T00:00:00(只适用于兼容 ES5 的实现)。

    比如,要创建一个表示“2019 年 5 月 23 日”的日期对象,可以使用以下代码:

let someDate = new Date(Date.parse("May 23, 2019")); // 或者
let someDate1 = new Date(Date.parse("5/23/2019")); 

​ 如果传给 Date.parse() 的字符串并不表示日期,则该方法会返回 NaN。如果直接把表示日期的字符串传给 Date 构造函数,那么 Date 会在后台调用 Date.parse()。换句话说,下面这行代码跟前面那行代码是等价的:

let someDate = new Date("May 23, 2019"); // 或者
let someDate1 = new Date("5/23/2019"); 

​ 这两行代码得到的日期对象相同。

注意:不同的浏览器对 Date 类型的实现有很多问题。比如,很多浏览器会选择用当前日期替代越界的日期,因此有些浏览器会将"January 32, 2019"解释为"February 1, 2019"。Opera 则会插入当前月的当前日,返回"January 当前日, 2019"。就是说,如果是在 9 月 21 日运行代码,会返回"January 21, 2019"。

Date.UTC()

​ Date.UTC() 方法也返回日期的毫秒表示,但使用的是跟 Date.parse()不同的信息来生成这个值。 传给 Date.UTC() 的参数是年、零起点月数(1 月是 0,2 月是 1,以此类推)、日(131)、时(023)、 分、秒和毫秒。这些参数中,只有前两个(年和月)是必需的。如果不提供日,那么默认为 1 日。其他参数的默认值都是 0。下面是使用 Date.UTC()的两个例子:

// GMT 时间 2000 年 1 月 1 日零点
let y2k = new Date(Date.UTC(2000, 0)); // GMT 时间 2005 年 5 月 5 日下午 5 点 55 分 55 秒
let allFives = new Date(Date.UTC(2005, 4, 5, 17, 55, 55)); 

​ 这个例子创建了两个日期 。第一个日期是 2000 年 1 月 1 日零点(GMT),2000 代表年,0 代表月(1 月)。因为没有其他参数(日取 1,其他取 0),所以结果就是该月第 1 天零点。第二个日期表示 2005 年 5 月 5 日下午 5 点 55 分 55 秒(GMT)。虽然日期里面涉及的都是 5,但月数必须用 4,因为月数是零起点的。小时也必须是 17,因为这里采用的是 24 小时制,即取值范围是 0~23。其他参数就都很直观了。与 Date.parse() 一样, Date.UTC() 也会被 Date 构造函数隐式调用,但有一个区别:这种情况下创建的是本地日期,不是 GMT 日期。不过 Date 构造函数跟 Date.UTC() 接收的参数是一样的。因此,如果第一个参数是数值,则构造函数假设它是日期中的年,第二个参数就是月,以此类推。前面的例子也可以这样来写:

// 本地时间 2000 年 1 月 1 日零点
let y2k = new Date(2000, 0); // 本地时间 2005 年 5 月 5 日下午 5 点 55 分 55 秒
let allFives = new Date(2005, 4, 5, 17, 55, 55); 

​ 以上代码创建了与前面例子中相同的两个日期,但这次的两个日期是(由于系统设置决定的)本地时区的日期。

​ ECMAScript 还提供了 Date.now() 方法,返回表示方法执行时日期和时间的毫秒数。这个方法可以方便地用在代码分析中:

// 起始时间
let start = Date.now(); // 调用函数
doSomething(); // 结束时间
let stop = Date.now(), 
result = stop - start;

继承的方法

​ 与其他类型一样,Date 类型重写了 toLocaleString()、toString() 和 valueOf() 方法。但与其他类型不同,重写后这些方法的返回值不一样。

  • Date 类型的 toLocaleString() 方法返回与浏览器运行的本地环境一致的日期和时间。这通常意味着格式中包含针对时间的 AM(上午)或 PM(下午), 但不包含时区信息(具体格式可能因浏览器而不同)。
  • toString() 方法通常返回带时区信息的日期和时间,而时间也是以 24 小时制(0~23)表示的。

下面给出了 toLocaleString() 和 toString() 返回的 2019 年 2 月 1 日零点的示例(地区为"en-US"的 PST,即 Pacific Standard Time,太平洋标准时间)

toLocaleString() - 2/1/2019 12:00:00 AM toString() - Thu Feb 1 2019 00:00:00 GMT-0800 (Pacific Standard Time)

​ 现代浏览器在这两个方法的输出上已经趋于一致。在比较老的浏览器上,每个方法返回的结果可能在每个浏览器上都是不同的。这些差异意味着 toLocaleString() 和 toString() 可能只对调试有用,不能用于显示。

​ Date 类型的 valueOf() 方法根本就不返回字符串,这个方法被重写后返回的是日期的毫秒表示。 因此,操作符(如小于号和大于号)可以直接使用它返回的值。比如下面的例子:

let date1 = new Date(2019, 0, 1); // 2019 年 1 月 1 日
let date2 = new Date(2019, 1, 1); // 2019 年 2 月 1 日console.log(date1 < date2); // true 
console.log(date1 > date2); // false 

​ 日期 2019 年 1 月 1 日在 2019 年 2 月 1 日之前,所以说前者小于后者没问题。因为 2019 年 1 月 1 日 的毫秒表示小于 2019 年 2 月 1 日的毫秒表示,所以用小于号比较这两个日期时会返回 true。这也是确保日期先后的一个简单方式。

日期格式化方法

​ Date 类型有几个专门用于格式化日期的方法,它们都会返回字符串:

  • toDateString() 显示日期中的周几、月、日、年(格式特定于实现);

  • toTimeString() 显示日期中的时、分、秒和时区(格式特定于实现);

  • toLocaleDateString() 显示日期中的周几、月、日、年(格式特定于实现和地区);

  • toLocaleTimeString() 显示日期中的时、分、秒(格式特定于实现和地区);

  • toUTCString() 显示完整的 UTC 日期(格式特定于实现)。

    ​ 这些方法的输出与 toLocaleString() 和 toString() 一样,会因浏览器而异。因此不能用于在用户界面上一致地显示日期。

    ​ 注意:还有一个方法叫 toGMTString(),这个方法跟 toUTCString() 是一样的,目的是为了向后兼容。不过,规范建议新代码使用 toUTCString()

日期/时间组件方法

​ Date 类型剩下的方法(见下表)直接涉及取得或设置日期值的特定部分。注意表中“UTC 日期”, 指的是没有时区偏移(将日期转换为 GMT)时的日期。

方法说明
getTime()返回日期的毫秒表示;与 valueOf()相同
setTime(milliseconds)设置日期的毫秒表示,从而修改整个日期
getFullYear()返回 4 位数年(即 2019 而不是 19)
getUTCFullYear()返回 UTC 日期的 4 位数年
setFullYear(year)设置日期的年(year 必须是 4 位数)
setUTCFullYear(year)设置 UTC 日期的年(year 必须是 4 位数)
getMonth()返回日期的月(0 表示 1 月,11 表示 12 月)
getUTCMonth()返回 UTC 日期的月(0 表示 1 月,11 表示 12 月)
setMonth(month)设置日期的月(month 为大于 0 的数值,大于 11 加年)
setUTCMonth(month)设置 UTC 日期的月(month 为大于 0 的数值,大于 11 加年)
getDate()返回日期中的日(1~31)
getUTCDate()返回 UTC 日期中的日(1~31)
setDate(date)设置日期中的日(如果 date 大于该月天数,则加月)
setUTCDate(date)设置 UTC 日期中的日(如果 date 大于该月天数,则加月)
getDay()返回日期中表示周几的数值(0 表示周日,6 表示周六)
getUTCDay()返回 UTC 日期中表示周几的数值(0 表示周日,6 表示周六)
getHours()返回日期中的时(0~23)
getUTCHours()返回 UTC 日期中的时(0~23)
setHours(hours)设置日期中的时(如果 hours 大于 23,则加日)
setUTCHours(hours)设置 UTC 日期中的时(如果 hours 大于 23,则加日)
getMinutes()返回日期中的分(0~59)
getUTCMinutes()返回 UTC 日期中的分(0~59)
setMinutes(minutes)设置日期中的分(如果 minutes 大于 59,则加时)
setUTCMinutes(minutes)设置 UTC 日期中的分(如果 minutes 大于 59,则加时)
getSeconds()返回日期中的秒(0~59)
getUTCSeconds()返回 UTC 日期中的秒(0~59)
setSeconds(seconds)设置日期中的秒(如果 seconds 大于 59,则加分)
setUTCSeconds(seconds)设置 UTC 日期中的秒(如果 seconds 大于 59,则加分)
getMilliseconds()返回日期中的毫秒
getUTCMilliseconds()返回 UTC 日期中的毫秒
setMilliseconds(milliseconds)设置日期中的毫秒
setUTCMilliseconds(milliseconds)设置 UTC 日期中的毫秒
getTimezoneOffset()返回以分钟计的 UTC 与本地时区的偏移量(如美国 EST 即“东部标准时间” 返回 300,进入夏令时的地区可能有所差异)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/656605.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Codeforces Round 799 (Div. 4)

目录 A. Marathon B. All Distinct C. Where’s the Bishop? D. The Clock E. Binary Deque F. 3SUM G. 2^Sort H. Gambling A. Marathon 直接模拟 void solve() {int ans0;for(int i1;i<4;i) {cin>>a[i];if(i>1&&a[i]>a[1]) ans;}cout<&l…

离线生成双语字幕,一键生成中英双语字幕,基于AI大模型,ModelScope

离线生成双语字幕整合包,一键生成中英双语字幕,基于AI大模型 制作双语字幕的方案网上有很多&#xff0c;林林总总&#xff0c;不一而足。制作双语字幕的原理也极其简单&#xff0c;无非就是人声背景音分离、语音转文字、文字翻译&#xff0c;最后就是字幕文件的合并&#xff0c…

Next.js 学习笔记(七)——样式

样式 Next.js 支持不同的应用程序样式设计方法&#xff0c;包括&#xff1a; 全局 CSS&#xff1a;对于有传统 CSS 使用经验的人来说&#xff0c;使用简单且熟悉&#xff0c;但随着应用程序的增长&#xff0c;可能会导致 CSS 包过大&#xff0c;难以管理样式。CSS 模块&#…

Centos安装mysql/mariadb

1,yum install mysql-apt-config_0.8.12-1_all.deb 似乎后面会有冲突,不建议安装mysql了,直接mariadb吧 2, No such command: uninstall. Please use /usr/bin/yum --help It could be a YUM plugin command, try: "yum install dnf-command(uninstall)" It…

鸿蒙南向开发——GN快速入门指南

运行GN(Generate Ninja) 运行gn&#xff0c;你只需从命令行运行gn&#xff0c;对于大型项目&#xff0c;GN是与源码一起的。 对于Chromium和基于Chromium的项目&#xff0c;有一个在depot_tools中的脚本&#xff0c;它需要加入到你的PATH环境变量中。该脚本将在包含当前目录的…

紫外工业相机的优势与应用

紫外工业相机是一种特殊的相机,它能够捕捉到紫外光并把其转化为可见光。其原理主要是基于紫外光和可见光的波长不同,以及不同物质对紫外光的吸收和反射特性。紫外工业相机可有效地识别和检测出产品缺陷&#xff0c;提高产品质量&#xff0c;提升效率&#xff0c;降低成本。可应…

常用芯片学习——CD4094芯片

CD4094 8位移位寄存器/3态输出缓冲器 使用说明 CD4094是由一个 8 位串行移位寄存器和一个 3 态输出缓冲器组成的 CMOS 集成电路。寄存器带有存储锁存功能&#xff0c;集成电路根据 STROBE 信号确定锁存器是否接收移位寄存器各位数据&#xff0c;数据是否由锁存器传输到 3 态输…

non-void function does not return a value in all control paths

错误提示&#xff1a; Line 11: Char 5: error: non-void function does not return a value in all control paths [-Werror,-Wreturn-type] 11 | } | ^ 1 error generated. 解析&#xff1a; 非 void 函数在所有的控制路径上没有返回值。 即在函数中存在某些分支&#xff0c…

【教学类-35-23】20240130“红豆空心黑体”不能显示的汉字

作品展示&#xff1a; 背景需求 使用红豆空心黑体制作幼儿字帖&#xff08;涂色版&#xff09; 【教学类-35-22】正式版 20240129名字字卡3.0&#xff08;15CM正方形手工纸、先男后女&#xff0c;页眉是黑体包含全名&#xff0c;名字是红豆空心黑体&#xff09;-CSDN博客文章…

线性代数---------学习总结

线性代数之行列式 行列式的几条重要的性质 1.某两行某两列交换位置之后&#xff0c;值变号 2.行列式转置&#xff0c;值不变 3.范德蒙德行列式&#xff0c;用不同行的公比做一系列的累乘运算 4.把某一行的行列式加到另一行上&#xff0c;利用他们之间的倍数关系&#xff0…

Could not resolve host: github.com问题解决

git clone的时候发现机器无法解析github.com&#xff0c;其实应该改用ssh协议去clone&#xff0c;但是我用的是公用的机器&#xff0c;密钥对一直没配置好&#xff0c;所以也就堵死了。那么如果想让机器能解析github.com&#xff0c;&#xff08;机器本身没有ping命令&#xff…

Python XPath解析html出现⋆解决方法 html出现#123;解决方法

前言 爬网页又遇到一个坑&#xff0c;老是出现乱码&#xff0c;查看html出现的是&#数字;这样的。 网上相关的“Python字符中出现&#的解决办法”又没有很好的解决&#xff0c;自己继续冲浪&#xff0c;费了一番功夫解决了。 这算是又加深了一下我对这些iso、Unicode编…

嵌入式学习第二篇——C语言基础12

目录 指针 1.const指针 2.void 3.函数指针和指针函数: 1.指针函数: 2.函数指针: 4.C语言中二级指针使用场景: 1.指针数组传参时: 2.函数体内想修改函数体外指针变量值的时 构造数据类型: 数据类型: 1.基本数据类型: 1&#xff0c; int 2&#xff0c;…

MySQL原理(二)存储引擎(3)InnoDB

目录 一、概况&#xff1a; 1、介绍&#xff1a; 2、特点&#xff1a; 二、体系架构 1、后台线程 2、内存池&#xff08;缓冲池&#xff09; 三、物理结构 1、数据文件&#xff08;表数据和索引数据&#xff09; 1.1、作用&#xff1a; 1.2、共享表空间与独立表空间 …

计算机网络——静态路由的配置实验

1.实验题目 实验四&#xff1a;静态路由的配置 2.实验目的 1.了解路由器的基本配置。 2.实现对路由器的静态配置。 3.了解Ping命令和trace的原理和使用 3.实验任务 &#xff08;1&#xff09;路由器的基本配置&#xff1a;关闭域名解释&#xff1b;设置路由器接口 IP 地…

DVWA csrf代码分析

LOW级别 源码如下&#xff1a; <?phpif( isset( $_GET[ Change ] ) ) {$pass_new $_GET[ password_new ]; // 获取用户输入的新密码$pass_conf $_GET[ password_conf ]; //获取用户输入的确认密码// Do the passwords match?if( $pass_new $pass_conf ) { …

网络地址相关函数一网打尽

这块的函数又多又乱&#xff0c;今天写篇日志&#xff0c;以后慢慢补充 1. 网络地址介绍 1.1 ipv4 1.1.1 点、分十进制的ipv4 你对这个地址熟悉吗&#xff1f; 192.168.10.100&#xff0c;这可以当做一个字符串。被十进制数字、 “ . ”分开。IP地址的知识就不再多讲…

一文速学-selenium高阶操作连接已存在浏览器

前言 不得不说selenium不仅在自动化测试作为不可或缺的工具&#xff0c;在数据获取方面也是十分好用&#xff0c;能够十分快速的见到效果&#xff0c;这都取决于selenium框架的足够的灵活性&#xff0c;甚至在一些基于web端的自动化办公都十分有效。 通过selenium连接已经存在…

【解决】No match for argument: gflags-devel

背景 在centos-8中安装gflags-devel&#xff0c;直接dnf安装&#xff0c;失败了。 [rootpcs2 ~]# sudo dnf -y install gflags-devel Extra Packages for Enterprise Linux 8 - x86_64 Extra Packages…

SpringBoot整合RabbitMQ快速实战

目录 引入依赖 配置文件 不同模式下使用springboot收发消息 直连模式 生产者 消费者 Fanout模式 生产者 消费者 Topic主题模式 生产者 消费者 Headers模式 生产者 消费者 补充Quorum队列 生产者 消费者 引入依赖 <dependency><groupId>org.springf…