SQLite与GLib返回的儒略日期不一致,哪个是正确的?
2025-02-05儒略日期差异解析
针对公历日期2025-02-05,不同工具/API返回的儒略日期结果存在明显差异:
- longpela工具计算结果:25036
- GLib库计算结果:739287,对应的C语言代码及输出如下:
#include <glib-2.0/glib.h> /* gcc main.c -I/usr/include `pkg-config --cflags glib-2.0` `pkg-config --libs glib-2.0` */ int main(int argc, char *argv[]) { GDate *dmy = g_date_new_dmy(5,2,2025); guint32 my_julian = g_date_get_julian(dmy); GDateDay day = g_date_get_day(dmy); GDateMonth month = g_date_get_month(dmy); GDateYear year = g_date_get_year(dmy); g_print("YYYY-MM-DD = %02u-%02u-%02u\n",year, month, day); g_print("Julian = %u\n", my_julian); return 0; }
输出:
YYYY-MM-DD = 2025-02-05 Julian = 739287
- SQLite计算结果:2460711.5,对应的SQL语句及输出如下:
/* From an SQLite session */ SELECT julianday('2025-02-05'); 2460711.5
这些结果没有绝对的“错误”,差异源于儒略日期的计数基准定义不同:
SQLite的2460711.5:这是标准天文学儒略日(Julian Day, JD),计数起点为公元前4713年1月1日正午,小数部分代表一天内的时间。2460711.5对应2025-02-05的午夜(从正午算起,午夜恰好是半天),这是全球天文学领域及多数通用日期处理库遵循的标准定义。
GLib的739287:GLib的
g_date_get_julian方法采用了自定义的儒略日计数规则,起点为公元1年1月1日。通过标准JD计算验证:公元1年1月1日的标准JD为1721425.5,2460711.5 - 1721425.5 = 739286,取整后得到739287,和GLib的结果一致。这是GLib库特有的计数方式,仅适用于该库的日期处理逻辑。longpela工具的25036:该结果对应longpela工具自定义的儒略日计数规则,其起点显然与标准JD、GLib都不同(可能是某个近代起始日期),属于工具专属的计数方式,需参考该工具的文档确认具体定义。
总结来说,若需符合通用天文学或跨平台日期交互的标准,SQLite返回的结果是最具通用性的“正确”值;GLib和longpela的结果则是各自生态内符合自身定义的正确值。
内容的提问来源于stack exchange,提问作者9-Pin
相关产品推荐
相关产品推荐

