Waqt

面向开发者

为你的程序提供阿富汗的日期和时间

太阳历和伊斯兰历、七种语言的月份名称、每个省会的日出和日落:几个简单的文件和一个 JavaScript 模块。无需密钥,无需注册。

版本 1JSON 和 JavaScriptJavaScript 和 PHP 示例

本页内容

简而言之所有文件都在 waqt.qudqu.com/api/v1/,任何网站都能读取。每个文件都由本站运行的同一套代码生成,因此 API 和本站绝不会给出两个不同的日期。其中没有任何伊朗月份名称。

快速开始

在 <script type="module"> 里写一行 import 就够了:无需安装、无需密钥、无需注册。这段代码刚刚在你的浏览器里运行过,每行下面是今天的结果。

quick-start.htmlHTML
刚刚运行
<script type="module">
	import { Calendar, Language, formatDate, wallTime }
		from 'https://waqt.qudqu.com/api/v1/waqt.js';

	// Today on Afghan time, as a day number
	const today = wallTime(Date.now()).day;

	console.log(formatDate(today, Calendar.SHAMSI, Language.DARI).text);
	// → …
	console.log(formatDate(today, Calendar.QAMARI, Language.PASHTO).text);
	// → …
	console.log(formatDate(today, Calendar.GREGORIAN, Language.ENGLISH).text);
	// → …
</script>

文件

文件内容大小
calendar.json太阳历和伊斯兰历的年份表、日序号的定义、阿富汗时间3 KB
names.json三种历法的月份、星期和数字,七种语言3 KB
places.json34 个省会:坐标,以及城市和省份在七种语言中的名称4 KB
sun/kabul.json太阳历每一天的太阳;每个省会一个文件4 KB
waqt.jsJavaScript 模块:日期的转换和书写、阿富汗时间、太阳和月亮20 KB
大小为压缩后(gzip),即浏览器收到的大小。每个 JSON 文件都在 description 中说明如何读取。

用日序号转换日期

每个日期都有一个日序号:自 1970 年 1 月 1 日起的天数。三种历法都能与日序号互相转换,所以日期通过日序号从一种历法转到另一种。

模块用一个函数就能做到。没有模块也很简单:在 calendar.json 中找到在这一天或之前开始的最后一年,然后数月份。

import {
	Calendar, Digits, HijriAdjustment, Language,
	formatDate, fromGregorian, fromShamsi,
	toGregorian, toQamari, toShamsi, wallTime
} from 'https://waqt.qudqu.com/api/v1/waqt.js';

// A date is a day number: whole days since 1 January 1970
const nowruz = fromGregorian(2026, 3, 21);
console.log(nowruz);
// → 20533
console.log(toShamsi(nowruz));
// → { year: 1405, month: 1, day: 1 }
console.log(toQamari(nowruz));
// → { year: 1447, month: 10, day: 2 }
console.log(toGregorian(fromShamsi(1404, 12, 29)));
// → { year: 2026, month: 3, day: 20 }

// If the month began a day later in Afghanistan than in Umm al-Qura
console.log(toQamari(nowruz, HijriAdjustment.DAY_LATER));
// → { year: 1447, month: 10, day: 1 }

// As text, in any of the seven languages
console.log(formatDate(nowruz, Calendar.SHAMSI, Language.DARI).text);
// → ۱ حمل ۱۴۰۵
console.log(formatDate(nowruz, Calendar.SHAMSI, Language.PASHTO).text);
// → ۱ وری ۱۴۰۵
console.log(formatDate(nowruz, Calendar.QAMARI, Language.ENGLISH).text);
// → 2 Shawwal 1447

// With the weekday, in Latin digits
const options = { weekday: true, digits: Digits.LATIN };
console.log(formatDate(nowruz, Calendar.SHAMSI, Language.DARI, options).text);
// → شنبه، 1 حمل 1405

// Today, on Afghan time
const today = wallTime(Date.now()).day;
console.log(formatDate(today, Calendar.QAMARI, Language.DARI).text);

伊斯兰历日期与观月

伊斯兰历的表格采用乌姆古拉历。在阿富汗,伊斯兰历的月份从看到新月牙时开始,这无法提前计算:日期有时会和表格相差一天。如果某月比表格晚一天开始,就按前一天读表格(日序号减 1);如果早一天,就按后一天读。模块的函数用 HijriAdjustment.DAY_LATER 或 HijriAdjustment.DAY_EARLIER 表示同样的事。

七种语言的月份和星期名称

names.json 为每种语言列出三种历法的月份、从星期六开始的星期、“上午”和“下午”、历法名称以及该语言的数字。普什图语有自己的月份名称;其他语言用自己的文字书写达里语的名称。

这些文件中没有任何伊朗月份名称,我们的测试会检查每种语言的每一天。请从这个文件取名称,不要从浏览器取:许多浏览器为阿富汗显示伊朗的名称。

names.jsonJSON
{
  "languages": {
    "fa": {
      "months": {
        "shamsi": [
          "حمل", "ثور", "جوزا", "سرطان", "اسد", "سنبله",
          "میزان", "عقرب", "قوس", "جدی", "دلو", "حوت"
        ],
        "qamari": ["محرم", …],
        "gregorian": ["جنوری", …]
      },
      "weekdays": [
        "شنبه", "یکشنبه", "دوشنبه", "سه‌شنبه",
        "چهارشنبه", "پنجشنبه", "جمعه"
      ],
      "digits": "۰۱۲۳۴۵۶۷۸۹",
      …
    },
    "ps": {
      "months": {
        "shamsi": [
          "وری", "غویی", "غبرګولی", "چنګاښ", "زمری", "وږی",
          "تله", "لړم", "لیندۍ", "مرغومی", "سلواغه", "کب"
        ],
        "qamari": ["محرم", …],
        "gregorian": ["جنوري", …]
      },
      "weekdays": [
        "شنبه", "یکشنبه", "دوشنبه", "سه شنبه",
        "چهارشنبه", "پنجشنبه", "جمعه"
      ],
      "digits": "۰۱۲۳۴۵۶۷۸۹",
      …
    },
    "en": { "months": { "shamsi": ["Hamal", "Sawr", "Jawza", …] }, … },
    …
  }
}

日出和日落

每个省会都有一张表:天亮、日出、正午、日落、天黑以及昼长,覆盖太阳历的每一天,按阿富汗时间。因为太阳历跟随太阳,这张表对任何年份都准确到 2 分钟以内。

需要某一年的精确分钟,或其他任何地点时,请使用 sunDay。它的公式这里也有 PHP 版本。

// A sun table needs no code: months[m - 1][d - 1] is Shamsi month m, day d
const url = 'https://waqt.qudqu.com/api/v1/sun/herat.json';
const table = await (await fetch(url)).json();
console.log(table.columns);
// → [ 'firstLight', 'sunrise', 'noon', 'sunset', 'dark', 'dayLength' ]
console.log(table.months[0][0]); // 1 Hamal
// → [ '05:30', '06:25', '12:29', '18:33', '19:27', '12:08' ]

月亮

模块给出从任何地点看到的月亮在天空中的位置、被照亮的比例、每天的月出和月落,以及下一次新月和满月。它不用于观测一个月的第一道新月牙。

moon.jsJavaScript
import {
	MoonPhase, moonState, nextMoonPhase
} from 'https://waqt.qudqu.com/api/v1/waqt.js';

// The moon over Kabul on an evening (or moonState(ms, latitude, longitude))
const evening = Date.parse('2026-03-21T19:00:00+04:30');
const moon = moonState(evening);

// Percent lit, and days since the new moon
console.log(Math.round(moon.lit * 100), moon.age.toFixed(1));
// → 9 2.8

const full = nextMoonPhase(evening, MoonPhase.FULL);
console.log(new Date(full).toISOString().slice(0, 16));
// → 2026-04-02T02:14

版本 1:不会改变的事

  • 文件的结构保持不变。 可能会增加内容,但不会删除或改动任何名称。不符合这条规则的改动会成为 /api/v2/,而版本 1 保留。
  • 从 1900 年 1 月 1 日到 2174 年 11 月 25 日(太阳历 1278 至 1553 年,伊斯兰历 1317 至 1600 年)。超出这个范围,函数会报错。
  • 任何网站都能用。 文件带有 Access-Control-Allow-Origin: *,浏览器会保存 10 分钟。
  • 没有统计,没有 Cookie。 文件不设置 Cookie,也不收集统计数据。

许可

许可:CC BY 4.0

发现错误或缺少什么?请告诉我们。