JavaScript日期处理:常见问题与解决方案

JavaScript中的日期处理是一个常见但有时又令人头疼的任务。在这篇博客文章中,我将分享一些在JavaScript中处理日期时遇到的常见问题以及它们的解决方法。

日期格式化

1.1 日期格式:yyyy-MM-dd

formatDate() {
    var value = new Date()
	var year = value.getFullYear();
	var month = value.getMonth() + 1;
	var date = value.getDate()
	if (date >= 1 && date <= 9) {                  // 日如果小于10就补个0
	    date = "0" + date;
	}
	if (month >= 1 && month <= 9) {                // 月如果小于10就补个0
	    month = "0" + month;
	}
	console.log(year + '-' + month + '-' + date)   // 打印出年 - 月 - 日
    var time = year + '-' + month + '-' + date
    return time
}

const formattedDate = this.formatDate();
console.log(formattedDate); // 输出类似 '2021-05-14' 的字符串

1.2 日期格式:yyyy-MM-dd HH:mm:ss

formatDate(date) {
    const year = date.getFullYear();
    const month = ('0' + (date.getMonth() + 1)).slice(-2);
    const day = ('0' + date.getDate()).slice(-2);
    const hours = ('0' + date.getHours()).slice(-2);
    const minutes = ('0' + date.getMinutes()).slice(-2);
    const seconds = ('0' + date.getSeconds()).slice(-2);
    return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
}

const date = new Date();
const formattedDate = this.formatDate(date);
console.log(formattedDate); // 输出类似 '2021-05-14 16:30:00' 的字符串

基于当前日期的计算

2.1 通过时间戳输出年月日

timestampToYearMonthDay(timestamp) {
  const date = new Date(timestamp);
  const year = date.getFullYear();
  const month = String(date.getMonth() + 1).padStart(2, '0'); // 月份从0开始,所以需要+1
  const day = String(date.getDate()).padStart(2, '0');

  return `${year}-${month}-${day}`;
}

2.2 获取当前日期的前一天或后一天

Var preDate = new Date().getTime() - 24*60*60*1000;  // 前一天
Var nextDate = new Date().getTime() + 24*60*60*1000; // 后一天

// 获得时间戳:1717490977923

2.3 获取当前日期的上个月或下个月

/*
  * 获取当前日期的上个月
  * @date 格式为yyyy-mm-dd的日期,如:2014-01-25
*/
getPreMonth(date) {
  var arr = date.split('-');
  var year = arr[0];      // 获取当前日期的年份
  var month = arr[1];     // 获取当前日期的月份
  var day = arr[2];       // 获取当前日期的日
  var days = new Date(year, month, 0);
  days = days.getDate();  // 获取当前日期中月的天数
  var year2 = year;
  var month2 = parseInt(month) - 1;
  if (month2 == 0) {
    year2 = parseInt(year2) - 1;
    month2 = 12;
  }
  var day2 = day;
  var days2 = new Date(year2, month2, 0);
  days2 = days2.getDate();
  if (day2 > days2) {
    day2 = days2;
  }
  if (month2 < 10) {
    month2 = '0' + month2;
  }
  var t2 = year2 + '-' + month2 + '-' + day2;
  return t2;
}

/*
  * 获取当前日期的下个月
  * @date 格式为yyyy-mm-dd的日期,如:2014-01-25
*/        
getNextMonth(date) {
  var arr = date.split('-');
  var year = arr[0];      // 获取当前日期的年份
  var month = arr[1];     // 获取当前日期的月份
  var day = arr[2];       // 获取当前日期的日
  var days = new Date(year, month, 0);
  days = days.getDate();  // 获取当前日期中的月的天数
  var year2 = year;
  var month2 = parseInt(month) + 1;
  if (month2 == 13) {
    year2 = parseInt(year2) + 1;
    month2 = 1;
  }
  var day2 = day;
  var days2 = new Date(year2, month2, 0);
  days2 = days2.getDate();
  if (day2 > days2) {
    day2 = days2;
  }
  if (month2 < 10) {
    month2 = '0' + month2;
  }

  var t2 = year2 + '-' + month2 + '-' + day2;
  return t2;
}

2.4 获取本周、本月、本年的开始和结束时间

getTimeRangeFormatted() {
	const currentDate = new Date();
	const currentDay = currentDate.getDay();
	const currentMonth = currentDate.getMonth();
	const currentYear = currentDate.getFullYear();

	// 获取本周的第一天和最后一天
	const startOfWeek = new Date(currentDate);
	startOfWeek.setDate(currentDate.getDate() - currentDay + (currentDay === 0 ? -6 : 1));
	const endOfWeek = new Date(currentDate);
	endOfWeek.setDate(startOfWeek.getDate() + 6);

	// 获取本月的第一天和最后一天
	const startOfMonth = new Date(currentYear, currentMonth, 1);
	const endOfMonth = new Date(currentYear, currentMonth + 1, 0);

	// 获取本年的第一天和最后一天
	const startOfYear = new Date(currentYear, 0, 1);
	const endOfYear = new Date(currentYear, 11, 31);

	// 格式化日期为:YYYY-MM-DD
	const formatDate = (date) => {
		const year = date.getFullYear();
		const month = String(date.getMonth() + 1).padStart(2, '0');
		const day = String(date.getDate()).padStart(2, '0');
		return `${year}-${month}-${day}`;
	};

	return {
		thisWeek: { startDate: formatDate(startOfWeek), endDate: formatDate(endOfWeek) },
		thisMonth: { startDate: formatDate(startOfMonth), endDate: formatDate(endOfMonth) },
		thisYear: { startDate: formatDate(startOfYear), endDate: formatDate(endOfYear) }
	};
}

使用:
const { thisWeek, thisMonth, thisYear } = this.getTimeRangeFormatted();
console.log(thisWeek, thisMonth, thisYear,'本周/本月/本年');

 控制台输出:

相对日期范围与周期计算

3.1 获取输入日期几个月前或几个月后的具体日期

/**
  *获取输入日期几个月前的具体日期
  *{param:DateTime} date 输入日期(YYYY-MM-DD)
  *{param:number } monthNum 月数
*/
GetPreMonthDay(date, monthNum) {
  var dateArr = date.split('-');
  var year = dateArr[0];     // 获取当前日期的年份
  var month = dateArr[1];    // 获取当前日期的月份
  var day = dateArr[2];      // 获取当前日期的日
  var days = new Date(year, month, 0);
  days = days.getDate();     // 获取当前日期中月的天数
  var year2 = year;
  var month2 = parseInt(month) - monthNum;
  if (month2 <= 0) {
    var absM = Math.abs(month2);
    year2 = parseInt(year2) - Math.ceil(absM / 12 == 0 ? 1 : parseInt(absM) / 12);
    month2 = 12 - (absM % 12);
  }
  var day2 = day;
  var days2 = new Date(year2, month2, 0);
  days2 = days2.getDate();
  if (day2 > days2) {
    day2 = days2;
  }
  if (month2 < 10) {
    month2 = '0' + month2;
  }
  var t2 = year2 + '-' + month2 + '-' + day2;
  return t2;
}

/*
  *获取输入日期几个月后的具体日期
  *{param:DateTime} date 输入日期(YYYY-MM-DD)
  *{param:number } monthNum 月数
*/
GetNextMonthDay(date, monthNum) {
  var dateArr = date.split('-');
  var year = dateArr[0];    // 获取当前日期的年份
  var month = dateArr[1];   // 获取当前日期的月份
  var day = dateArr[2];     // 获取当前日期的日
  var days = new Date(year, month, 0);
  days = days.getDate();    // 获取当前日期中的月的天数
  var year2 = year;
  var month2 = parseInt(month) + parseInt(monthNum);
  if (month2 > 12) {
    year2 = parseInt(year2) + parseInt((parseInt(month2) / 12 == 0 ? 1 : parseInt(month2) / 12));
    month2 = parseInt(month2) % 12;
  }
  var day2 = day;
  var days2 = new Date(year2, month2, 0);
  days2 = days2.getDate();
  if (day2 > days2) {
    day2 = days2;
  }
  if (month2 < 10) {
    month2 = '0' + month2;
  }
  var t2 = year2 + '-' + month2 + '-' + day2;
  return t2;
},

3.2 通过年月去获取本月份第一天和最后一天日期

例如:
  let datem = { month: 3, year: 2024 }; 
  let { monthFirstday, monthLastday } = this.getFirstAndLastDay(datem);
  输出 monthFirstday: 2024-03-01 , monthLastday: 2024-03-31

getFirstAndLastDay(datem) {
  // 获取本月第一天
  let firstDay = new Date(datem.year, datem.month - 1, 1);
  // 获取下个月第一天
  let nextMonthFirstDay = new Date(datem.year, datem.month, 1);
  // 获取本月最后一天
  let lastDay = new Date(nextMonthFirstDay - 1);
  let monthFirstday = this.formatDate(firstDay)
  let monthLastday = this.formatDate(lastDay)
  return { monthFirstday, monthLastday };
},

3.3 计算两个日期之间相差多少天

formatDate(preTime,nextTime){
  let nowtime = new Date(preTime).getTime()
  let updatatime = new Date(nextTime).getTime()
  let difftime = nowtime - updatatime
  let day = parseInt(difftime/(1000*60*60*24))
  return day
}

let differDate = this.formatDate("2023-10-11 11:35:11","2023-12-21 11:35:11")
console.log(differDate,'距离上次时间相差几天')

3.4 计算日期和月份的相加减

let data = 2025-11-06 // 日期
let num = 3           // 月份

//计算日期和月份的相加(日期 + 月份 = 日期)
CountTime(date, num) {
  var monthnum = 0;
  if (typeof (num) == "string")
    monthnum = parseInt(num);
  else
    monthnum = num;
  if (typeof (date) == "string")
    date = new Date(date);
    var year = date.getFullYear();
    var month = date.getMonth() + 1;
    var day = date.getDate();
    var sumMonths = month + monthnum;
    var newyear = year + parseInt(sumMonths/12);
    var newmonth = this.checkMonth(sumMonths % 12);   
    var newday = this.checkMonth(day);
  if (newmonth < 1) {
    if (newmonth == 0) newyear--;
    newmonth =0- (sumMonths-1) % 12; 
  } 
  var da = new Date(newyear, newmonth, 0);
  return newyear + "-" + newmonth + "-" + (da.getDate() < newday?da.getDate():newday);
},

//计算日期和月份的相减(日期 - 月份 = 日期)
SubTime(date, num) {
  var monthnum = 0;
  if (typeof (num) == "string")
    monthnum = parseInt(num);
  else
    monthnum = num;
  if (typeof (date) == "string")
  date = new Date(date);
  var Y = date.getFullYear();
  var M = date.getMonth() + 1;
  var D = this.checkMonth(date.getDate());
  let H = parseInt(monthnum%12)
  let y = parseInt(monthnum/12).toFixed(0)
  if(H < M){
    Y = Y - y
    M = M - H
  }else{
    Y = Y - y - 1
    M = 12 + M - H
  }
  var da = new Date(Y, M, 0);
  let MM = this.checkMonth(M)
  return Y + "-" + MM + "-" + (da.getDate() < D?da.getDate():D);
},

// 计算'月'、'日'前年加上0
checkMonth (i) {
  if (i<10){
      i = "0" + i;
  }
  return i;
},

总结

在本文中,我们深入探讨了JavaScript中日期处理的多个方面。从基本的日期格式化到复杂的日期计算和周期性日期范围的获取,我们提供了一系列的解决方案和示例代码。这些示例不仅展示了如何使用JavaScript的Date对象来格式化和计算日期,而且还提供了实用的函数,以帮助开发者在实际项目中更高效地处理日期和时间。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【系统架构设计师】二、操作系统知识(操作系统概述|进程管理)

目录 一、操作系统概述 1.1 操作系统定义 1.2 操作系统的功能 1.3 操作系统的分类 1.4 嵌入式操作系统主要特点 二、进程管理 2.1 进程的组成与状态 2.2 前趋图 2.3 进程资源图 2.4 进程调度 2.5进程调度算法 2.6 死锁 2.7 进程与线程 2.7.1 进程 2.7.2 线程 2…

RabbitMQ 相关概念

引言 什么是消息中间件 消息是指在应用间传送的数据&#xff0c;包含文本字符串、JSON等。消息队列中间件&#xff08;MQ&#xff09;指利用高效可靠的消息传递机制进行平台无关的数据交流&#xff0c;并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息排队模型…

Part 4.4 树形动态规划

树形动态规划&#xff0c;即在树上进行的动态规划。 因为树的递归性质&#xff0c;树形动态规划一般都是递归求解的。 没有上司的舞会 题目描述 某大学有 n n n 个职员&#xff0c;编号为 1 … n 1\ldots n 1…n。 他们之间有从属关系&#xff0c;也就是说他们的关系就像…

swagger手动添加cookies信息、浏览器中手动添加cookies信息

在实际项目使用中&#xff0c;我们可能需要把登录token放到cookies中&#xff0c;请求时从cookies中获取token值&#xff0c;以此校验用户登录信息&#xff0c;以下整理一下怎么在cookies中手动添加数据。 操作步骤如下&#xff1a; (1)&#xff1a;F12打开调试工具&#xff…

CP AUTOSAR标准之LargeDataCOM(AUTOSAR_CP_SWS_LargeDataCOM)

1 简介和功能概述 该规范描述了AUTOSAR基础软件模块LdCom的功能、API和配置。   在AUTOSAR分层架构中,AUTOSAR LdCom模块位于RTE/SwCluC_LdComProxy和PDU路由之间,参见[1,EXP LayeredSoftwareArchitecture]。   AUTOSAR LdCom模块提供了一种替代的交互层机制。通过专注于…

Python函数与模块知识点

函数 变量作用域 匿名函数 内置函数 递归函数 思维导图 global关键字 在 Python 中&#xff0c;如果你在函数内部想要修改一个全局变量的值&#xff0c;你需要使用 global 关键字来声明这个变量。 python x 10 # 全局变量def change_x(): global x # 声明 x 是全局变量 x 20 …

算法课程笔记——单调栈单调队列

算法课程笔记——单调栈&单调队列

解锁应用新技能:Xinstall助力快速获取H5信息,轻松提升用户体验

在移动互联网时代&#xff0c;数据是驱动应用发展的关键。对于许多开发者来说&#xff0c;如何高效、准确地获取H5信息成为了一个不小的挑战。今天&#xff0c;我们为大家介绍一款强大的工具——Xinstall&#xff0c;它将帮助你轻松解决这一难题&#xff0c;让你的应用数据获取…

Jacob调用Windows桌面软件(Adobe系列,CAD,ABBYY FineReader 等)

参考资料 jacob调用adobe动态库https://blog.csdn.net/love_5209/article/details/19162185 python查看查看 COM 组件的 ProgID 或 CLSID 对应的字符串参数https://blog.51cto.com/u_16175517/10484354加载动态库示例https://baijiahao.baidu.com/s?id=1777971964908285215&…

在Spring Boot中使用Sa-Token实现路径拦截和特定接口放行

在Spring Boot中使用Sa-Token实现路径拦截和特定接口放行 很喜欢的一段话&#xff1a;别想太多&#xff0c;好好生活&#xff0c;也许日子过着过着就会有答案&#xff0c;努力走着走着就会有温柔的着落。 春在路上&#xff0c;花在枝上&#xff0c;所有的美好都在路上&#xff…

【STM32】使用标准库创建一个工程

创建工程 本系列文章中使用的硬件和软件版本如下&#xff1a; CPU型号&#xff1a;STM32F407ZGT6 Keil版本&#xff1a;V5.38.0.0 ARM编译器版本&#xff1a;V5.06 标准库版本&#xff1a;V1.8.0 1.下载标准库 官网链接&#xff1a;STSW-STM32065 - STM32F4 DSP和标准外…

AI金融投资:批量下载巨潮资讯基金招募说明书

打开巨潮资讯的基金招募说明书页面&#xff1a; http://www.cninfo.com.cn/new/fulltextSearch/full?searchkey%E5%B0%81%E9%97%AD%E5%BC%8F%E5%9F%BA%E7%A1%80%E8%AE%BE%E6%96%BD%E8%AF%81%E5%88%B8%E6%8A%95%E8%B5%84%E5%9F%BA%E9%87%91%E6%8B%9B%E5%8B%9F%E8%AF%B4%E6%98%…

智慧校园综合解决方案:提供全方位的学校管理支持

在当今数字化时代&#xff0c;学校管理面临着越来越多的挑战&#xff0c;包括学生管理、教职员工管理、校园安全等。为了应对这些挑战&#xff0c;智慧校园综合解决方案应运而生。智慧校园综合解决方案融入了先进的信息技术&#xff0c;为学校带来了一场管理与教育模式的革新。…

主流电商平台API接口【京东商品详情按关键字搜索商品按图搜索京东商品(拍立淘)获得店铺的所有商品】

主流电商平台商品接口在电商企业中的应用可以帮助企业实现信息同步、库存管理、订单处理、数据分析和营销推广等多重功能&#xff0c;提升运营效率、优化用户体验&#xff0c;进而推动业务增长。 jd API 接入说明 API地址:申请调用KEY地址 调用示例&#xff1a; 参数说明 通用…

jenkins中配置参数化,并在python脚本接收参数实现参数化执行

在公司内进行Monkey测试脚本集成jenkins时&#xff0c;因为需要指定公司内不同的app进行测试。那么可以有两种方法解决该问题&#xff0c;要么创建多个脚本文件&#xff0c;多个jenkins jobs&#xff0c;进行构建。要么可以在配置job时通过传参数的方式&#xff0c;在python脚本…

什么牌子的灯好不伤眼?带你了解什么灯对眼睛伤害最小

眼睛是人类获取信息最重要的感官器官之一&#xff0c;而近视则会导致视力模糊&#xff0c;进而影响学习效果和生活品质。因此&#xff0c;什么灯对眼睛伤害最小成为许多人迫切寻找的目标。本文将为各位家长解答目前许多家长选择为孩子保护视力的产品——护眼台灯。护眼台灯以其…

MAC安装idea教程

https://blog.csdn.net/qq_41810415/article/details/131649541 JDK安装 https://blog.csdn.net/dddebug/article/details/121713633 2、编辑.bash_profile文件 vim .bash_profile 进入编辑模式后 按 i 开始添加内容 结束编辑模式按 ESC 结束后保存输入 :wq! 不保存输入 :q! 检…

数据库原理(关系数据库规范化理论)——(4)

一、关系模式规范化的必要性 1.关系可能出现的问题 数据冗余大&#xff1b;插入异常&#xff1b;删除异常&#xff1b;更新异常&#xff1b; 2.关系模式应满足的基本要求 元组的每个分量必须是不可分割的数据项&#xff1b;数据库中的数据冗余应尽可能少&#xff1b;不要出…

新手教学系列-​​​​​​基础知识(SSH使用)

基础知识(SSH使用) 什么是ssh Secure Shell(安全外壳协议,简称SSH)是一种加密的网络传输协议,可在不安全的网络中为网络服务提供安全的传输环境[1]。SSH通过在网络中创建安全隧道来实现SSH客户端与服务器之间的连接[2]。虽然任何网络服务都可以通过SSH实现安全传输,SS…

电商API接口是什么意思?有什么作用?

电商API接口是电子商务领域中一种技术解决方案&#xff0c;它允许不同的软件系统之间进行交互和数据交换。 在电商场景下&#xff0c;电商API接口可以实现的功能非常丰富&#xff0c;例如&#xff1a; 商品管理&#xff1a;获取商品列表、商品详情、搜索商品、上下架商品等&a…