当前位置:首页 > 问答 > 正文

JavaScript 时间操作 jq 获取当前时间戳,时光倾听,时间纪录

JavaScript时间魔法:用jq轻松玩转时间戳与时光记录

"凌晨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中的时间戳处理技巧

jq作为强大的JSON处理工具,处理时间戳也很拿手,假设我们有个包含时间戳的日志文件log.json:

JavaScript 时间操作 jq 获取当前时间戳,时光倾听,时间纪录

{
  "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:计算倒计时

JavaScript 时间操作 jq 获取当前时间戳,时光倾听,时间纪录

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] 系统运行正常

避坑指南

  1. 时区陷阱new Date()会使用浏览器/系统的时区设置,服务器端可能不同

    // 明确指定UTC时间
    const utcDate = new Date().toISOString();
  2. 闰秒问题:JavaScript不处理闰秒,但大多数场景不影响

  3. 性能考量:频繁创建Date对象会影响性能,必要时重用对象

    JavaScript 时间操作 jq 获取当前时间戳,时光倾听,时间纪录

  4. jq版本差异:strftime在jq 1.5及以下版本不可用

"时间操作就像煮泡面——看似简单,但水温差5度味道就不同,现在你掌握了JavaScript和jq的时间魔法,下次看到1583029260000这样的数字,终于可以淡定地喝口咖啡,优雅地把它转换成人类语言了。"

最后的小测验:你知道为什么计算机要从1970年1月1日开始计算时间吗?(提示:这和Unix系统的诞生有关)

发表评论