上一篇
"凌晨3点,程序员小李盯着屏幕上的报错信息抓狂——日志里所有时间都是看不懂的数字串!'1583029260000这到底是哪天啊?!' 如果你也遇到过这种崩溃时刻,今天这篇时间操作指南就是你的救星。"
时间戳就像计算机世界的"暗号",它表示自1970年1月1日(UTC)以来的毫秒数,在JavaScript中获取当前时间戳简单到令人发指:
// 方法1:Date对象的valueOf() const timestamp1 = new Date().valueOf(); // 方法2:更直接的写法 const timestamp2 = +new Date(); // 方法3:ES5之后推荐的方式 const timestamp3 = Date.now(); console.log(`当前时间戳:${timestamp3}`); // 输出类似:1722456000000(2025年7月的某个时刻)
小贴士:这三种方法效果相同,但Date.now()性能最好,因为它不需要创建Date对象。
拿到时间戳后,我们通常需要转换成人类能看懂的形式:
const timestamp = 1722456000000; // 假设这是2025-07-30的时间戳 // 转成本地时间字符串 const localDate = new Date(timestamp).toLocaleString(); console.log(`本地格式:${localDate}`); // 输出:"2025/7/30 00:00:00"(根据系统区域设置可能变化) // 自定义格式输出 const dateObj = new Date(timestamp); const formattedDate = `${dateObj.getFullYear()}-${(dateObj.getMonth()+1).toString().padStart(2,'0')}-${dateObj.getDate().toString().padStart(2,'0')} ${dateObj.getHours().toString().padStart(2,'0')}:${dateObj.getMinutes().toString().padStart(2,'0')}`; console.log(`自定义格式:${formattedDate}`); // 输出:"2025-07-30 00:00"
jq作为强大的JSON处理工具,处理时间戳也很拿手,假设我们有个包含时间戳的日志文件log.json:
{ "events": [ { "id": 1, "message": "系统启动", "timestamp": 1722456000000 }, { "id": 2, "message": "用户登录", "timestamp": 1722456060000 } ] }
我们可以用jq这样处理:
# 基础查询 cat log.json | jq '.events[].timestamp' # 带时间转换的查询(需要jq 1.6+) cat log.json | jq '.events[] | {message, time: (.timestamp | strftime("%Y-%m-%d %H:%M"))}'
注意:jq的strftime需要时间戳是秒级(不是毫秒),所以可能需要先除以1000:
cat log.json | jq '.events[] | {message, time: (.timestamp/1000 | strftime("%F %T"))}'
做一个简单的执行时间记录器:
class TimeTracker { constructor() { this.startTime = Date.now(); this.checkpoints = []; } checkpoint(name) { const now = Date.now(); this.checkpoints.push({ name, time: now, elapsed: now - this.startTime }); } summary() { console.log(`总耗时:${Date.now() - this.startTime}ms`); this.checkpoints.forEach(cp => { console.log(`[${cp.name}] ${cp.elapsed}ms`); }); } } // 使用示例 const tracker = new TimeTracker(); setTimeout(() => { tracker.checkpoint("第一阶段"); setTimeout(() => { tracker.checkpoint("第二阶段"); tracker.summary(); }, 500); }, 1000);
场景1:计算倒计时
function getCountdown(targetTimestamp) { const now = Date.now(); const diff = targetTimestamp - now; if(diff <= 0) return "已过期"; const days = Math.floor(diff / (1000 * 60 * 60 * 24)); const hours = Math.floor((diff % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60)); const mins = Math.floor((diff % (1000 * 60 * 60)) / (1000 * 60)); return `${days}天${hours}小时${mins}分钟`; } console.log(getCountdown(1725148800000)); // 假设这是2025-08-30的时间戳
场景2:日志时间格式化
function formatLog(timestamp, message) { const date = new Date(timestamp); return `[${date.toISOString()}] ${message}`; } console.log(formatLog(Date.now(), "系统运行正常")); // 输出类似:[2025-07-30T02:00:00.000Z] 系统运行正常
时区陷阱:new Date()
会使用浏览器/系统的时区设置,服务器端可能不同
// 明确指定UTC时间 const utcDate = new Date().toISOString();
闰秒问题:JavaScript不处理闰秒,但大多数场景不影响
性能考量:频繁创建Date对象会影响性能,必要时重用对象
jq版本差异:strftime在jq 1.5及以下版本不可用
"时间操作就像煮泡面——看似简单,但水温差5度味道就不同,现在你掌握了JavaScript和jq的时间魔法,下次看到1583029260000这样的数字,终于可以淡定地喝口咖啡,优雅地把它转换成人类语言了。"
最后的小测验:你知道为什么计算机要从1970年1月1日开始计算时间吗?(提示:这和Unix系统的诞生有关)
本文由 绳颖初 于2025-07-31发表在【云服务器提供商】,文中图片由(绳颖初)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://vps.7tqx.com/wenda/497222.html
发表评论