用workers搭建节日倒计时api

Creato il: 9 marzo 2025

Risposto usando O1 da Chat01

Domanda

用workers搭建节日倒计时api

Pensiero

Crafting a festival countdown

I’m curious about building a serverless festival countdown API with Cloudflare Workers. This involves writing sample code to handle queries and respond with a JSON countdown for the next festival.

Reasoned for a few seconds

Risposta

下面的示例演示了如何使用 Cloudflare Workers(或同类 Serverless 平台的 Worker 方案)来搭建一个简易的“节日倒计时” API,给前端或其他调用方提供 JSON 格式的倒计时信息。思路和步骤大致如下:

  1. 明确需求和数据:

    • 哪些节日需要倒计时?
    • 使用哪一种时间计算方式(公历、农历等)?这里为了示例,咱们先直接用公历日期。
    • API 返回格式是怎样的?
  2. 准备节日数据:

    • 可以在代码中手动维护一个常量/数组,里面包含每个节日的日期、描述等。
    • 若有需要经常更新、节日较多,可将其放入 KV Storage 或持久化到其他数据库。
    • 这里示例就用最简单的硬编码。
  3. 核心逻辑:

    • 获取当前时间(UTC 或者指定时区)。
    • 遍历节日列表,计算每个节日距离当前的剩余天数。
    • 返回 JSON,比如:
      json
      { "festivals": [ { "name": "中秋节", "date": "2025-10-06", "daysLeft": 211 }, { "name": "国庆节", "date": "2025-10-01", "daysLeft": 206 } ] }
  4. 编写 Worker 代码:

    • 下方示例以 Cloudflare Workers + JavaScript 为例。
    • 部署前需要在本地安装 wrangler CLI(如需)或使用 Cloudflare Dashboard 的在线编辑器。

代码示例

以下是一个简单的 Workers 入口文件 index.js。它会在特定路由(如 GET /countdown)下返回 JSON 格式的倒计时数据。

js
// index.js /** * 节日数据示例:公历日期 * date 格式: YYYY-MM-DD */ const FESTIVALS = [ { name: '元旦', date: '2025-01-01' }, { name: '春节', date: '2025-01-29' }, { name: '中秋节', date: '2025-10-06' }, { name: '国庆节', date: '2025-10-01' }, // 可以继续添加更多节日... ]; export default { async fetch(request, env, ctx) { const url = new URL(request.url); // 可以通过路径判断,也可直接对根路径做处理 if (url.pathname === '/countdown') { // 计算倒计时 const data = getFestivalsCountdown(); return new Response(JSON.stringify(data), { headers: { 'Content-Type': 'application/json; charset=utf-8' }, }); } // 如果不是 /countdown 路由,就返回一个简单的提示或 404 return new Response('Not Found', { status: 404 }); }, }; /** * 计算每个节日剩余天数的函数 */ function getFestivalsCountdown() { // 获取当前日期(UTC) // 若要使用北京时间,可考虑:new Date().toLocaleString('zh-CN', { timeZone: 'Asia/Shanghai' }) // 也可以直接把此日期转成 UTC 0 点来算 const now = new Date(); // 遍历所有节日,计算剩余天数 const festivalCountdowns = FESTIVALS.map((f) => { // 解析节日日期 // 此时默认 JS 中 new Date() 以 UTC 或系统本地时间为准,一定要注意时区偏差 const festivalDate = new Date(f.date); // 计算差值(毫秒) const diffTime = festivalDate.getTime() - now.getTime(); // 转为天数并向下取整 const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24)); return { name: f.name, date: f.date, daysLeft: diffDays, }; }); // 这里返回的格式可根据需要灵活调整 return { festivals: festivalCountdowns }; }

关于时区问题

  • JavaScript 中 new Date() 默认使用系统本地时区,也会受服务器(或 worker)运行环境的时区影响。
  • Cloudflare Workers 环境默认使用 UTC 时区。
  • 如果需要以北京时区(UTC+8)计算,可通过 toLocaleString('zh-CN', { timeZone: 'Asia/Shanghai' }) 等方式先转化,然后再构造一个新的 Date 对象。但要注意字符串再转换回日期时可能还有一点格式处理。
  • 一种简化做法:直接将节日日期都换成 UTC 0 点,然后对比当前 UTC 时间,这样不会有时差问题。但日期上也要做好对应换算。

部署流程(以 Cloudflare 为例)

  1. 安装 wrangler(如果本地开发)

    bash
    npm install -g wrangler
  2. 初始化工程

    bash
    wrangler init festival-countdown

    按需修改 wrangler.toml 文件,可以写入你的账号 ID 等信息。

  3. 将上方代码放入 index.js
    也可改名为 worker.js 等,需在 wrangler.toml 里更新 main 字段。

  4. 本地预览测试

    bash
    wrangler dev

    在终端里可以看到一个本地预览地址,访问 http://127.0.0.1:8787/countdown 就会返回 JSON 数据。

  5. 发布

    bash
    wrangler publish

    成功后,会在你的 Cloudflare Workers 上生成一个子域名,比如 https://festival-countdown.your-subdomain.workers.dev/countdown,即可通过此地址获取倒计时数据。


返回示例

成功请求 GET /countdown 路径后,可能返回如下 JSON(基于当前时间不同,天数也会不同,仅作示例):

json
{ "festivals": [ { "name": "元旦", "date": "2025-01-01", "daysLeft": 300 }, { "name": "春节", "date": "2025-01-29", "daysLeft": 328 }, { "name": "中秋节", "date": "2025-10-06", "daysLeft": 577 }, { "name": "国庆节", "date": "2025-10-01", "daysLeft": 572 } ] }

进一步扩展

  1. 支持更多查询参数
    • 如支持单个节日查询:GET /countdown?name=中秋节,只返回对应的倒计时。
  2. 指定年份或支持农历
    • 农历计算相对复杂,需要引用对应的农历库或接口。可以在 Worker 中进行对应转换,然后再计算公历的倒计时。
  3. 与其他服务联动
    • 如果要把倒计时结果通过微信机器人、钉钉群机器人等进行推送,也可以在 Worker 中调用对应的 Webhook。
  4. 持久化、动态更新
    • 倒计时若需要动态更新(比如仅显示最近的下一个节日)或节日列表需要后台管理,可以结合 Cloudflare KV、D1 数据库或者第三方 API 来保持数据实时更新。

这样,你就可以在任意场景(前端、移动端、小程序、甚至命令行里)通过这个简单的节日倒计时 API 获取 JSON 数据并加以展示或处理。希望对你有所帮助,祝你开发顺利!

Condividi questa Q&A