JavaScript日期和时间处理手册

news2024/11/16 9:05:35

🧑‍🎓 个人主页:《爱蹦跶的大A阿》

🔥当前正在更新专栏:《VUE》 、《JavaScript保姆级教程》、《krpano》

​ 

✨ 前言

        日期和时间在应用开发中是非常常用的功能。本文将全面介绍JavaScript中处理日期和时间的方法,让你可以快速上手各种日期操作。

本文将讲解:

  • 创建和解析Date对象的各种方法
  • 抽取日期的指定部分如年、月、日等
  • 格式化日期显示不同格式字符串
  • 通过偏移进行日期时间的计算
  • 时间戳与Date的相互转化
  • 处理时区和国际时间表示
  • Moment.js的便捷用法
  • 如何实现一个日期选择器

准备掌握JavaScript的日期和时间处理技能了吗?让我们开始吧!

第一节:Date对象

        Date对象在JavaScript中用于表示日期和时间,它是一个构造函数。创建Date对象有以下几种方式:

  1. 不传参创建当前日期和时间的Date对象:
    let now = new Date();
  2. 传递表示日期时间的毫秒数创建Date对象:
    let date = new Date(1674192000000); // 指定毫秒数
  3. 传递日期时间参数创建Date对象:
    new Date(2023, 0, 1); // 2023-01-01
    new Date(2023, 0, 1, 12, 0, 0); // 2023-01-01 12:00:00
  4. 解析字符串创建Date对象:
    new Date('2023-01-01');

        Date对象具有丰富的方法可以获取日期各个部分,进行格式化和计算。理解Date对象的创建方式,是学习日期处理的第一步。

第二节:获取时间

        可以通过下列Date对象的方法获取到日期时间的细节部分:

  • getFullYear() 获取四位年份
  • getMonth() 获取月份(0-11)
  • getDate() 获取当前月中的天数(1-31)
  • getDay() 获取星期几(0-6)
  • getHours() 获取小时(0-23)
  • getMinutes() 获取分钟(0-59)
  • getSeconds() 获取秒(0-59)
  • getMilliseconds() 获取毫秒(0-999)
  • getTime() 获取总的毫秒数

例如获取当前时间:

let now = new Date();

now.getFullYear(); // 2023
now.getMonth(); // 0
now.getDate(); // 15
now.getDay(); // 1 表示星期二

        getMonth()需要注意月份范围是0-11,实际月份要加1。这些方法可以获取Date对象表示时间的各个组成部分。

第三节:格式化日期

        获取到Date对象时间信息后,可以进行格式化后输出需要的日期字符串:

  1. toISOString() 输出标准ISO格式
    let now = new Date();
    now.toISOString(); // 2023-01-15T13:49:35.029Z
  2. toUTCString()/toLocaleString() 输出UTC或本地格式
  3. 自定义格式化
    let date = new Date();
    
    let str = 
      date.getFullYear() + '-' +
      (date.getMonth() + 1) + '-' +
      date.getDate(); // 2023-01-15

第四节:日期计算

        可以通过给Date对象的毫秒数做算术运算来计算新的日期:

let date = new Date(2023, 0, 1); // 2023-01-01

let newDate = new Date(date.getTime() + 5 * 24 * 60 * 60 * 1000);
// 5天后的日期

        Date对象也提供了许多方法可以快捷计算新日期:

  • setDate(d) 设置日期
  • setMonth(m) 设置月份
  • setFullYear(y) 设置年份
  • setHours(h) 设置小时
  • setMinutes(m) 设置分钟
  • setSeconds(s) 设置秒

例如增加一个月:

let date = new Date(2023, 0, 1); 

date.setMonth(date.getMonth() + 1);

        这些方法可以对Date对象进行日期时间的运算和偏移得到新日期。

第五节:时间戳转换

        时间戳是从1970年1月1日到当前日期的总毫秒数。

        Date对象与时间戳的相互转换:

// Date -> 时间戳
let date = new Date();
let ts = date.getTime();

// 时间戳 -> Date
let date = new Date(1673875600000);

         时间戳是一个整数,可以更方便地进行存储和传输,并通过Date对象解析为本地时间。

        接下来我将介绍日期的国际化和时区处理,以及一些实用的第三方库,欢迎提出您的意见!

第六节:国际时间和时区

        Date对象默认创建的时间是当前环境的本地时间。我们可以转换为UTC时间:

let date = new Date();
date.toUTCString(); //转换为UTC时间

 也可以显示特定时区的时间:

date.toLocaleString('zh-CN', {timeZone: 'Asia/Shanghai'}); // 中国时区时间

处理时间对象时,需要注意时区问题,显示给用户的时间信息是否正确。

  • Date对象的时间原点

        Date对象中的时间是以1970年1月1日00:00:00作为时间原点的,这个时间被称为Unix Epoch时间。Date对象中存储的毫秒数是从时间原点开始算起的。

        这就是getTime()返回的毫秒数,以及创建Date对象时传入的毫秒数的参数代表的意义。

  • 本地时间与UTC时间

        Date对象默认首先创建表示当前环境的本地时间。我们可以通过转换显示UTC时间:

let d = new Date();
d.toUTCString();

        UTC时间与本地时间可能存在时差,需要注意。在网络传输时推荐使用标准的UTC时间。

  • 夏令时的影响

        有一些地区实行夏令时,这会导致本地时间在夏令时期间会增加1个小时。

        这可能会对表示当地时间造成影响,需要注意正确显示时间。

  • 不同地区显示不同时区时间

        展示给用户查看的时间信息,需要显示正确的时区时间,而不是固定的UTC时间:

d.toLocaleString('zh-CN', {timeZone: 'Asia/Shanghai'});

        根据用户所在地区动态显示本地格式和时区时间非常重要。 

第七节:第三方库Moment.js

        Moment.js是一个轻量的日期处理库,提供了更便捷的日期格式化和操作方法:

let now = moment();

now.format('YYYY-MM-DD'); // 格式化
now.add(1, 'd'); // 增加1天

        Moment.js可以快速处理复杂的日期格式,计算跨度等操作。

第八节:日期选择控件

        可以利用Date对象构建日期选择器:

  1. 生成年、月、日菜单供选择
  2. 计算选择的日期结果
  3. 高亮显示当前选择日期

        合理运用Date对象的方法,可以实现功能强大的日期选择器,提高用户体验。

  • 生成日期选择菜单

        可以通过获取当前年月日信息,调用setFullYear()、setMonth()、setDate()方法生成年、月、日的选择菜单。

        增加前后导航按钮可以切换年月。

  • 选择日期时实时更新

        可以给菜单添加onchange事件,当用户选择年、月、日时,实时构建选中的日期对象,并更新显示。

  • 高亮今天日期

        可以获取今天的日期,比较选择框中的日期,如果相同就添加特殊样式来高亮显示今天。

  • 禁用不可选择日期

        可以定一些规则,例如只能选择今天之后的日期,灰显过去的日期,通过启用disable属性来禁止选择。

  • 国际化

        可以根据不同语言和地区显示不同的日期文本,如月份名称等。

  • 浮层显示

        可以用浮动div将日期选择器渲染成一个浮层,点击输入框时弹出。

代码示例:


<div id="date-picker">

  <select id="year"></select>

  <select id="month"></select>
  
  <select id="day"></select>

  <div id="selected-date"></div>

</div>
// 生成年份选择菜单
const yearSelect = document.getElementById('year');

for (let i = 1990; i <= 2030; i++) {
  let opt = document.createElement('option');
  opt.value = i;
  opt.innerHTML = i;
  yearSelect.appendChild(opt);
}

// 生成月份选择菜单
const monthSelect = document.getElementById('month');

for (let i = 1; i <= 12; i++) {
  let opt = document.createElement('option');
  opt.value = i;
  opt.innerHTML = i;
  monthSelect.appendChild(opt);
} 

// 选择日期时更新显示
function updateDate() {
  let year = yearSelect.value;
  let month = monthSelect.value;
  let day = daySelect.value;

  let displayDate = year + '-' + month + '-' + day;

  selectedDate.innerHTML = displayDate; 
}

yearSelect.onchange = monthSelect.onchange = updateDate;

         以上演示了基本的日期选择实现,还可以继续优化交互、样式等。

✨ 结语     

        在这个内容丰富的指南中,我们全面介绍了JavaScript中处理日期和时间的各种方法 - 从Date对象的创建、各种获取时间方法、格式化显示、进行计算以及与时间戳相互转换等,涵盖了日期时间处理的方方面面。

        同时,我们也提到了一些需要注意的重点,比如本地时间与UTC时间、时区和国际时间的处理等。最后,还给出了一些额外的资源,如Moment.js这样优秀的第三方库。

        我尽力用通俗易懂的语言和示例代码做了全面的解读,希望这篇指南可以成为JavaScript日期和时间处理的参考指南,能够帮助大家快速上手。

        如果您在学习和使用过程中,还有任何疑问或建议,欢迎在评论区与我互动讨论。时间处理是开发中必不可少的功能,希望我们可以共同进步。感谢您的观看!

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

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

相关文章

vscode设置python脚本运行参数

1 添加配置文件 点击到你要配置的python文件&#xff0c;然后右上角点击 运行 &#xff0c;再点击 添加配置 再点击 “Pyhton文件” 选项&#xff08;其实就是在选择 当前的python文件 进行配置&#xff09; 接着就生成了配置文件 lanunch.json 2 参数配置 再上面代码的基础上…

1月10号代码随想录左叶子之和

404.左叶子之和 给定二叉树的根节点 root &#xff0c;返回所有左叶子之和。 示例 1&#xff1a; 输入: root [3,9,20,null,null,15,7] 输出: 24 解释: 在这个二叉树中&#xff0c;有两个左叶子&#xff0c;分别是 9 和 15&#xff0c;所以返回 24示例 2: 输入: root [1]…

206. 反转链表(Java)

题目描述&#xff1a; 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 输入&#xff1a; head [1,2,3,4,5] 输出&#xff1a; [5,4,3,2,1] 代码实现&#xff1a; 1.根据题意创建一个结点类&#xff1a; public class ListNode {int val…

【详细】双系统 Ubuntu 如何给根目录扩容

1.分配出一块未分配空间&#xff08;需要和Ubuntu系统存储分区位于同一个硬盘上&#xff09; 这一步我直接利用windows系统自带的“创建并格式化硬盘分区”功能进行的。 如图&#xff0c;在想要切割出来一部分空间的卷上右键&#xff0c;选择压缩卷选项&#xff0c;之后输入空…

使用Windbg动态调试目标进程的一般步骤详解

目录 1、概述 2、将Windbg附加到已经启动起来的目标进程上&#xff0c;或者用Windbg启动目标程序 2.1、将Windbg附加到已经启动起来的目标进程上 2.2、用Windbg启动目标程序 2.3、Windbg关联到目标进程上会中断下来&#xff0c;输入g命令将该中断跳过去 3、分析实例说明 …

leetcode:1716. 计算力扣银行的钱(python3解法)

难度&#xff1a;简单 Hercy 想要为购买第一辆车存钱。他 每天 都往力扣银行里存钱。 最开始&#xff0c;他在周一的时候存入 1 块钱。从周二到周日&#xff0c;他每天都比前一天多存入 1 块钱。在接下来每一个周一&#xff0c;他都会比 前一个周一 多存入 1 块钱。 给你 n &am…

安卓文件传输工具---Android File Transfer中文

Android File Transfer是一款专为安卓设备设计的文件传输工具&#xff0c;可以帮助用户快速方便地在安卓设备和计算机之间传输文件。这款软件支持多种文件类型&#xff0c;包括图片、音乐、视频、文档等&#xff0c;使得用户可以轻松地将文件从计算机传输到安卓设备&#xff0c…

[足式机器人]Part2 Dr. CAN学习笔记-动态系统建模与分析 Ch02-7二阶系统

本文仅供学习使用 本文参考&#xff1a; B站&#xff1a;DR_CAN Dr. CAN学习笔记-动态系统建模与分析 Ch02-7二阶系统 1. 二阶系统对初始条件的动态响应 Matlab/Simulink - 2nd Order Syetem Response to IC2. 二阶系统的单位阶跃响应 2nd Order System Unit Step Response3. 二…

CNN——GoogLeNet

1.GoogLeNet简介 GoogLeNet是谷歌推出的基于Inception模块深度卷积神经网络结构。L和N大写还是为了致敬LeNet。在随后的两年中一直在改进&#xff0c;形成了Inception V2、Inception V3、Inception V4等版本。GoogLeNet&#xff08;Inception-V1&#xff09;&#xff0c;在Imag…

微服务下多模块拆分,公用类调用与模块隔离性怎么兼得呢

前言 在一个微服务项目中&#xff0c;为了追求低耦合&#xff0c;会根据业务板块对主系统进行切分为一个个子模块&#xff0c;模块间相互隔离&#xff0c;但是这样子就会导致一个问题&#xff1a;对于一些在多个子模块中都适用的配置类、工具类、封装类等都需要拷贝冗余到各个模…

大数据本地环境搭建-Linux基础环境搭建

1.安装VMware 下载 VMware Workstation Pro | CN 2.配置虚拟网卡 3.Windows网络配置 4.安装centos7.9 Download (centos.org) 4.1 新建虚拟机 如果开机的时候电脑蓝屏使用WindowsR输入optionalfeatures 打开启用或关闭Windows功能->勾选打开以下两项 重启 继续安装ce…

静态网页设计——滑板官网(HTML+CSS+JavaScript)(dw、sublime Text、webstorm、HBuilder X)

前言 声明&#xff1a;该文章只是做技术分享&#xff0c;若侵权请联系我删除。&#xff01;&#xff01; 感谢大佬的视频&#xff1a;https://www.bilibili.com/video/BV1Cw411u7hj/?vd_source5f425e0074a7f92921f53ab87712357b 源码&#xff1a;https://space.bilibili.com…

LeetCode 2807.在链表中插入最大公约数

【LetMeFly】2807.在链表中插入最大公约数 力扣题目链接&#xff1a;https://leetcode.cn/problems/insert-greatest-common-divisors-in-linked-list/ 给你一个链表的头 head &#xff0c;每个结点包含一个整数值。 在相邻结点之间&#xff0c;请你插入一个新的结点&#x…

Kafka集群部署 (KRaft模式集群)

KRaft 模式是 Kafka 在 3.0 版本中引入的新模式。KRaft 模式使用了 Raft 共识算法来管理 Kafka 集群元数据。Raft 算法是一种分布式共识算法&#xff0c;具有高可用性、可扩展性和安全性等优势。 在 KRaft 模式下&#xff0c;Kafka 集群中的每个 Broker 都具有和 Zookeeper 类…

Springboot3(一、lambda、::的应用)

文章目录 一、使用lambda简化实例创建1.语法&#xff1a;2.示例&#xff1a;3.Function包3.1 有入参&#xff0c;有返回值【多功能函数】3.2 有入参&#xff0c;无返回值【消费者】3.3 无入参&#xff0c;有返回值【提供者】3.4 无入参&#xff0c;无返回值 二、类::方法的使用…

centos7上升级mysql8.0.21到mysql8.0.35版本

1、下载安装包 cd /home/soft/mysql8.0.35 wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.35-1.el7.x86_64.rpm-bundle.tar 2、解压压缩包 3、停止掉mysqld服务 systemctl stop mysqld 4、强制安装新的版本包 rpm -ivh mysql-community-common-8.0.35-1.el…

富士康注资21亿元河南成立电动车公司 | 百能云芯

富士康在河南注册成立富士康新能源汽车产业发展有限公司&#xff0c;注册资本达人民币5亿元&#xff0c;展现了其在电动车产业的持续布局。这一全资子公司将致力于从事汽车零部件及配件制造、电机制造、新材料技术研发、新能源汽车整车销售等业务。作为鸿海集团的全资子公司&am…

基于Jackson封装的JSON、Properties、XML、YAML 相互转换的通用方法

文章目录 一、概述二、思路三、实现四、测试 一、概述 我们在 yaml转换成JSON、MAP、Properties 通过引入 实现了JSON、Properties、XML、YAML文件的相互转换&#xff0c;具体封装的类、方法如下&#xff1a; 上面的实现&#xff0c;定义了多个类、多个方法&#xff0c;使用…

FlinkAPI开发之数据合流

案例用到的测试数据请参考文章&#xff1a; Flink自定义Source模拟数据流 原文链接&#xff1a;https://blog.csdn.net/m0_52606060/article/details/135436048 概述 在实际应用中&#xff0c;我们经常会遇到来源不同的多条流&#xff0c;需要将它们的数据进行联合处理。所以…

关于程序员技术方面的一些思考

公司用的技术栈是 SpringBootVue&#xff0c;刚开始让我做的是后端开发&#xff0c;对一些简单的页面的 CRUD 进行开发。因为在学校自学的是 Java&#xff0c;而研发部门里面后端比较多&#xff0c;所以后端的活不缺人&#xff0c;领导建议我学学 Vue&#xff0c;分担一下前端的…