当前位置: 首页 > article >正文

uniapp日期处理全攻略:获取某月首尾日、近七天日期等实用技巧

Uniapp日期处理实战从基础格式化到高级业务场景解决方案在移动应用开发中日期处理几乎贯穿所有业务场景。无论是电商平台的限时抢购、医疗应用的预约挂号还是企业系统的报表统计精准高效的日期操作都是保障业务逻辑完整性的关键。Uniapp作为跨平台开发框架虽然提供了基础的Date对象支持但面对复杂的业务需求时开发者往往需要自行构建一系列工具方法。本文将系统性地分享Uniapp项目中经过实战检验的日期处理方案覆盖从基础格式化到月首尾日计算、动态日期范围生成等高级场景。1. 基础日期格式化与人性化显示日期格式化是处理时间数据的第一道门槛。不同于简单的toLocaleString()调用业务中往往需要精确控制输出格式。我们在项目中通常会扩展Date原型提供标准化格式化方法// 在utils/date.js中定义核心格式化方法 Date.prototype.format function(pattern yyyy-MM-dd) { const padZero (num) (num 10 ? 0${num} : num); return pattern .replace(yyyy, this.getFullYear()) .replace(MM, padZero(this.getMonth() 1)) .replace(dd, padZero(this.getDate())) .replace(hh, padZero(this.getHours())) .replace(mm, padZero(this.getMinutes())) .replace(ss, padZero(this.getSeconds())); };实际业务中不同场景需要不同的格式组合。我们通常会预设几种常用格式完整时间戳new Date().format(yyyy-MM-dd hh:mm:ss)→ 2023-07-15 14:30:45纯日期new Date().format(yyyy年MM月dd日)→ 2023年07月15日时间短格式new Date().format(hh:mm)→ 14:30对于社交类应用XX分钟前这样的人性化显示更能提升用户体验。以下是一个智能时间显示方案Date.prototype.humanize function() { const now new Date(); const diff (now - this) / 1000; // 秒级差值 if (diff 60) return 刚刚; if (diff 3600) return ${Math.floor(diff/60)}分钟前; if (this.toDateString() now.toDateString()) { return 今天 ${this.format(hh:mm)}; } if (this.getFullYear() now.getFullYear()) { return this.format(MM月dd日 hh:mm); } return this.format(yyyy年MM月dd日); };2. 月份边界日期计算实战财务报表、数据统计等业务常需要获取某个月份的首日和末日。这两个关键时间点的计算需要考虑闰年、月份天数等边界情况2.1 获取月份首日月份首日相对简单固定为当月1日但需要注意时区问题function getMonthStart(date new Date()) { const d new Date(date); return new Date(d.getFullYear(), d.getMonth(), 1); } // 使用示例 const firstDay getMonthStart().format(yyyy-MM-dd); // 2023-07-012.2 获取月份末日月末日的计算需要巧妙利用JavaScript Date对象的自动进位特性function getMonthEnd(date new Date()) { const d new Date(date); return new Date(d.getFullYear(), d.getMonth() 1, 0); } // 包含时分秒的完整版本 function getMonthEndFull(date new Date()) { const d new Date(date); const end new Date(d.getFullYear(), d.getMonth() 1, 0); end.setHours(23, 59, 59, 999); return end; }实际项目中我们经常需要处理跨年月份的特殊情况。下表展示了不同月份的计算结果输入日期首日末日2023-02-152023-02-012023-02-282024-02-152024-02-012024-02-292023-12-312023-12-012023-12-313. 动态日期范围生成策略预约系统、统计报表等功能常需要生成连续的日期序列。以下是几种典型场景的解决方案3.1 生成指定天数范围的日期function generateDateRange(startDate, days) { const result []; const start new Date(startDate); for (let i 0; i days; i) { const date new Date(start); date.setDate(start.getDate() i); result.push(date.format(yyyy-MM-dd)); } return result; } // 获取接下来7天日期 const nextWeek generateDateRange(new Date(), 7);3.2 生成两个日期之间的所有日期当需要处理任意起止日期时需要考虑跨月、跨年的情况function getDatesBetween(start, end) { const dateArray []; let current new Date(start); const endDate new Date(end); while (current endDate) { dateArray.push(new Date(current).format(yyyy-MM-dd)); current.setDate(current.getDate() 1); } return dateArray; }3.3 近七天日期带星期显示对于预约类应用通常需要显示日期和星期几的组合信息function getLastSevenDays(baseDate new Date()) { const days [日, 一, 二, 三, 四, 五, 六]; return Array.from({ length: 7 }, (_, i) { const date new Date(baseDate); date.setDate(date.getDate() i); return { date: date.format(MM月dd日), week: 周${days[date.getDay()]}, full: date.format(yyyy-MM-dd) }; }); }4. 业务场景深度解决方案4.1 预约时间段生成挂号、会议预约等场景需要将一天划分为多个时间段function generateTimeSlots(options {}) { const { interval 30, // 分钟间隔 start 08:00, end 18:00, format HH:mm } options; const [startHour, startMin] start.split(:).map(Number); const [endHour, endMin] end.split(:).map(Number); const slots []; let currentHour startHour; let currentMin startMin; while (currentHour endHour || (currentHour endHour currentMin endMin)) { const timeStr ${String(currentHour).padStart(2, 0)}:${ String(currentMin).padStart(2, 0)}; slots.push(timeStr); currentMin interval; if (currentMin 60) { currentHour Math.floor(currentMin / 60); currentMin currentMin % 60; } } return slots.map((time, index) ({ start: time, end: slots[index 1] || end, label: ${time}-${slots[index 1] || end} })); }4.2 节假日特殊处理中国节假日往往需要特殊处理我们可以预先维护节假日数据const holidays { 2023: { 01: [01, 02], // 元旦 04: [05], // 清明节 05: [01, 02, 03], // 劳动节 06: [22, 23, 24], // 端午节 // ...其他节假日 } }; function isHoliday(date) { const d new Date(date); const year d.getFullYear().toString(); const month (d.getMonth() 1).toString().padStart(2, 0); const day d.getDate().toString().padStart(2, 0); return holidays[year]?.[month]?.includes(day) || d.getDay() 0 || d.getDay() 6; }4.3 倒计时组件实现电商限时活动需要精确到秒的倒计时// components/countdown.vue export default { props: { endTime: { type: [String, Date], required: true } }, data() { return { remaining: 00:00:00 }; }, mounted() { this.startCountdown(); }, methods: { startCountdown() { const end new Date(this.endTime).getTime(); this.timer setInterval(() { const now new Date().getTime(); const diff end - now; if (diff 0) { clearInterval(this.timer); this.remaining 已结束; this.$emit(end); return; } const hours Math.floor(diff / (1000 * 60 * 60)); const mins Math.floor((diff % (1000 * 60 * 60)) / (1000 * 60)); const secs Math.floor((diff % (1000 * 60)) / 1000); this.remaining [ hours.toString().padStart(2, 0), mins.toString().padStart(2, 0), secs.toString().padStart(2, 0) ].join(:); }, 1000); } }, beforeDestroy() { clearInterval(this.timer); } };5. 性能优化与最佳实践5.1 减少Date对象创建频繁创建Date对象会影响性能特别是在渲染列表时// 不佳的实现 function formatDates(dates) { return dates.map(dateStr new Date(dateStr).format()); } // 优化后的实现 function formatDates(dates) { const formatter new Intl.DateTimeFormat(zh-CN, { year: numeric, month: 2-digit, day: 2-digit }); return dates.map(dateStr formatter.format(new Date(dateStr))); }5.2 使用Web Worker处理复杂计算当需要处理大量日期数据时如日历组件可以移交给Web Worker// worker.js self.onmessage function(e) { const { type, payload } e.data; if (type GENERATE_CALENDAR) { const { year, month } payload; const weeks []; // ...生成日历数据的逻辑 postMessage({ type: CALENDAR_DATA, data: weeks }); } }; // 组件中 const worker new Worker(worker.js); worker.postMessage({ type: GENERATE_CALENDAR, payload: { year: 2023, month: 7 } }); worker.onmessage (e) { if (e.data.type CALENDAR_DATA) { this.calendarData e.data.data; } };5.3 时区处理方案国际化应用必须考虑时区问题function toLocalTime(utcDate, timeZone) { return new Date(utcDate).toLocaleString(zh-CN, { timeZone, hour12: false, year: numeric, month: 2-digit, day: 2-digit, hour: 2-digit, minute: 2-digit }); } // 使用示例 const localTime toLocalTime(2023-07-15T12:00:00Z, Asia/Shanghai);在实际项目开发中我们团队发现将日期工具函数统一封装在/utils/date.js中并通过Vue插件形式全局注册最为高效。对于复杂日期选择器推荐使用第三方库如dayjs或date-fns作为基础再根据业务需求进行二次封装。

相关文章:

uniapp日期处理全攻略:获取某月首尾日、近七天日期等实用技巧

Uniapp日期处理实战:从基础格式化到高级业务场景解决方案 在移动应用开发中,日期处理几乎贯穿所有业务场景。无论是电商平台的限时抢购、医疗应用的预约挂号,还是企业系统的报表统计,精准高效的日期操作都是保障业务逻辑完整性的关…...

Java开发必备:高德、百度、WGS84坐标互转实战(附完整代码)

Java开发实战:高德、百度与WGS84坐标系互转解决方案 当你需要在不同地图服务之间切换时,坐标系的差异往往会成为开发中的痛点。想象一下这样的场景:你的应用同时接入了高德地图和百度地图,用户上传的GPS数据却无法在两个平台上准确…...

保姆级教程:在QT中配置qcustomplot实现热力图(含常见问题解决方案)

QT中qcustomplot热力图实战:从配置到交互优化的完整指南 第一次在QT项目中尝试用qcustomplot绘制热力图时,我被数据映射和实时刷新的问题困扰了整整两天。直到凌晨三点调试通过的那一刻,才真正理解这个强大可视化工具的精妙之处。本文将分享那…...

MoMask:文本驱动3D运动生成技术全解析

MoMask:文本驱动3D运动生成技术全解析 【免费下载链接】momask-codes Official implementation of "MoMask: Generative Masked Modeling of 3D Human Motions (CVPR2024)" 项目地址: https://gitcode.com/gh_mirrors/mo/momask-codes 价值定位&am…...

GME-Qwen2-VL-2B助力AIGC内容创作:自动为图片生成创意文案与故事

GME-Qwen2-VL-2B助力AIGC内容创作:自动为图片生成创意文案与故事 你有没有过这样的经历?面对一张精心拍摄的照片,却怎么也憋不出几句像样的文案。或者,看着一张充满故事感的图片,脑海里思绪万千,落到笔尖却…...

麦橘超然Flux控制台快速体验:输入文字秒出高清图片

麦橘超然Flux控制台快速体验:输入文字秒出高清图片 1. 为什么选择Flux控制台 如果你正在寻找一个简单高效的AI图像生成工具,麦橘超然Flux控制台值得考虑。这个基于DiffSynth-Studio构建的Web服务,集成了majicflus_v1模型,通过fl…...

从订餐流程到并发编程:Petri网中的‘库所’与‘变迁’到底在模拟什么?

从订餐流程到并发编程:Petri网中的‘库所’与‘变迁’到底在模拟什么? 想象一下,你正在用手机订外卖:选择菜品、下单支付、等待制作、骑手配送——这个看似简单的流程背后,隐藏着一个精妙的系统状态转换模型。这正是Pe…...

DAMO-YOLO实战:用AI视觉系统做内容安全审核与统计

DAMO-YOLO实战:用AI视觉系统做内容安全审核与统计 1. 引言:当AI视觉遇见内容安全 在数字内容爆炸式增长的今天,如何高效地进行内容审核成为许多平台面临的挑战。传统人工审核不仅效率低下,而且容易因疲劳导致误判。本文将介绍如…...

Vulkan与OpenGL深度解析——现代图形渲染的技术演进

1. 从OpenGL到Vulkan:图形渲染的进化之路 还记得我第一次接触图形编程时,OpenGL就像一位和蔼的老教授,把复杂的GPU操作封装成简单的API调用。但随着项目复杂度提升,我逐渐发现这位"老教授"的教学方式有些过时——它隐藏…...

新手别慌!手把手教你用嘉立创EDA专业版搞定蓝桥杯平衡车PCB布局布线

从零到精通:嘉立创EDA专业版实战蓝桥杯平衡车PCB设计全攻略 第一次接触蓝桥杯电子设计竞赛的平衡车项目时,面对密密麻麻的元器件和错综复杂的布线要求,很多同学都会感到无从下手。本文将带你一步步攻克这个看似复杂的PCB设计任务,…...

PX4仿真环境搭建全流程:解决roslaunch indoor1.launch报错及Gazebo崩溃问题

PX4仿真环境搭建全流程:从零构建到Gazebo调优实战 无人机仿真开发就像在数字世界里搭建一个飞行实验室,而PX4Gazebo的组合无疑是目前最接近真实飞行体验的虚拟试验场。但当你满怀期待地输入roslaunch indoor1.launch后,等待你的可能不是顺利起…...

小波分解选型指南:如何为你的数据选择最合适的pywt小波函数(db4/haar/symlets对比)

小波分解选型指南:如何为你的数据选择最合适的pywt小波函数(db4/haar/symlets对比) 在信号处理领域,小波分解就像一把瑞士军刀,能够同时提供时域和频域的信息。但面对pywt库中琳琅满目的小波函数——从经典的Haar到复杂…...

避坑指南:Synopsys VCS工具安装中的5个常见错误及解决方案

Synopsys VCS工具安装避坑实战:从报错排查到环境调优 在芯片设计领域,Synopsys VCS作为业界标准的仿真工具,其安装过程却常常成为工程师们的"第一道门槛"。不同于简单的解压即用软件,VCS的安装涉及复杂的依赖关系、权限…...

RouterOS L2TP服务器搭建与安全优化指南

1. L2TP协议基础与RouterOS适配性 L2TP协议全称为Layer 2 Tunneling Protocol,是一种工作在OSI模型第二层的隧道协议。我第一次接触这个协议是在2015年为企业部署远程办公系统时,当时发现它相比PPTP有着明显的安全优势。简单来说,L2TP就像是在…...

旧电脑秒变云服务器:用Proxmox VE打造家庭虚拟化实验室(ZFS配置优化版)

旧电脑秒变云服务器:用Proxmox VE打造家庭虚拟化实验室(ZFS配置优化版) 1. 为什么选择Proxmox VE搭建家庭实验室? 对于个人开发者和技术爱好者来说,拥有一套完整的虚拟化环境是提升技术能力的绝佳途径。Proxmox VE作为…...

USB2.0供电那些事儿:为什么你的外设总是供电不足?

USB2.0供电困境解析:从原理到实践的全面解决方案 当你的移动硬盘突然断开连接,或者外接键盘间歇性失灵时,很可能正遭遇USB2.0供电不足的经典难题。这种看似简单的接口背后,隐藏着复杂的电力分配机制与设备兼容性博弈。本文将带你穿…...

2023最新版Prometheus+Grafana监控系统搭建指南(含Docker-compose部署)

2023云原生监控实战:基于Docker-compose的PrometheusGrafana全栈部署指南 在云原生技术席卷各行各业的今天,监控系统已成为保障业务稳定性的神经中枢。传统监控方案在面对容器化、微服务架构时往往力不从心,而Prometheus作为CNCF毕业项目&…...

丹青识画系统Prompt工程指南:如何用文本描述引导更精准的风格鉴定

丹青识画系统Prompt工程指南:如何用文本描述引导更精准的风格鉴定 丹青识画这类AI系统,很多人以为它就是个“看图说话”的工具,把图片丢进去,它告诉你这是什么风格、哪个流派。这确实没错,但如果你只这么用&#xff0…...

别再踩坑了!手把手教你搞定vllm、nccl、cuda和python的版本匹配(附版本对照表)

深度学习环境配置避坑指南:vLLM与CUDA生态的版本兼容性实战 在部署大型语言模型推理服务时,vLLM因其高效的内存管理和推理优化成为热门选择。但许多开发者第一次接触vLLM时,往往会被复杂的依赖关系搞得焦头烂额——NCCL版本不匹配、CUDA驱动…...

编译原理实战:5分钟搞定词法分析器的选择题(含答案解析)

编译原理实战:词法分析器选择题高效解题指南 在编译原理的学习和考试中,词法分析器相关选择题往往是考察重点,也是许多同学容易失分的部分。面对复杂的正规式、有限自动机等概念,如何快速准确地做出判断?本文将带你深入…...

DriverStore Explorer:释放磁盘空间的开源驱动管理工具

DriverStore Explorer:释放磁盘空间的开源驱动管理工具 【免费下载链接】DriverStoreExplorer Driver Store Explorer [RAPR] 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer 1. 诊断驱动膨胀:3个隐藏原因解析 你的C盘空间是…...

Qwen2.5-VL-3B视频识别实战:从环境搭建到显存优化的踩坑记录

Qwen2.5-VL-3B视频识别实战:从环境搭建到显存优化的全流程指南 当开发者第一次尝试用Qwen2.5-VL-3B处理视频内容时,往往会遇到各种预料之外的挑战。从依赖包缺失到显存爆炸,从环境配置到参数调试,每一步都可能成为阻碍项目推进的绊…...

OpenClaw智能剪贴板:GLM-4.7-Flash增强复制粘贴功能

OpenClaw智能剪贴板:GLM-4.7-Flash增强复制粘贴功能 1. 为什么我们需要更聪明的剪贴板 作为一个每天要和大量文本打交道的技术写作者,我经常陷入这样的困境:从网页复制的内容带着乱七八糟的格式,从PDF摘录的段落夹杂着换行符和乱…...

工业质检新突破:如何用GLAD扩散模型实现高精度无监督异常检测(附MVTec-AD实测)

工业质检革命:GLAD扩散模型如何重塑无监督缺陷检测 在制造业智能化转型浪潮中,工业质检环节正经历着从人工目检到AI视觉的范式转移。传统基于规则或监督学习的检测系统面临标注成本高、泛化能力弱等痛点,而无监督异常检测技术凭借"零样本…...

GD32F30x串口DMA+空闲中断接收不定长数据,一个LED控制项目带你搞懂

GD32F30x串口DMA空闲中断实战:从零构建LED智能控制系统 在嵌入式开发中,串口通信就像设备的"嘴巴"和"耳朵",而DMA技术则是解放CPU的"隐形助手"。想象一下这样的场景:你需要通过手机APP远程控制实验…...

告别手动标注!用RexUniNLU零样本模型自动提取电商评论情感

告别手动标注!用RexUniNLU零样本模型自动提取电商评论情感 1. 电商评论分析的痛点与解决方案 电商平台每天产生海量用户评论,这些评论蕴含着宝贵的用户反馈和市场洞察。传统的情感分析方法通常面临两大难题: 标注成本高:需要大…...

XUnity.AutoTranslator:Unity游戏翻译解决方案的创新方法 | 玩家与开发者实战指南

XUnity.AutoTranslator:Unity游戏翻译解决方案的创新方法 | 玩家与开发者实战指南 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator 你是否曾因语言障碍错失优秀的外语游戏?是否在尝…...

Phi-4-reasoning-vision-15B企业案例:银行客户经理用截图快速生成信贷摘要

Phi-4-reasoning-vision-15B企业案例:银行客户经理用截图快速生成信贷摘要 1. 业务痛点与解决方案 1.1 银行信贷业务的效率瓶颈 在传统银行信贷审批流程中,客户经理需要花费大量时间整理客户资料、录入系统信息、撰写信贷报告。一个典型的信贷审批案例…...

别再被Kettle的流程线骗了!详解‘阻塞数据直到步骤都完成’控件的正确用法与避坑指南

Kettle并行执行模型深度解析:如何正确使用"阻塞数据直到步骤都完成"控件 在ETL工具Kettle的使用过程中,许多开发者都会遇到一个令人困惑的现象:明明在转换中画了流程线,步骤却没有按照预期的顺序执行。这种认知偏差往往…...

5分钟搞定Meson交叉编译:手把手教你配置ARM64目标平台(附DPDK实例)

Meson交叉编译实战指南:从零构建ARM64平台的DPDK应用 第一次接触交叉编译时,我盯着满屏的工具链路径和架构参数发愣——这简直像在解译外星密码。直到发现Meson的交叉编译配置文件,才发现原来构建跨平台应用可以如此优雅。本文将带你用Meson这…...