Skip to content

Commit

Permalink
minor: 微调文章
Browse files Browse the repository at this point in the history
  • Loading branch information
shabbywu committed Aug 18, 2023
1 parent 1de3c6e commit 851beac
Showing 1 changed file with 6 additions and 4 deletions.
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
---
date: 2023-03-23
date: 2023-08-18
title: 记一次时区异常问题排查思路和过程
sidebarDepth: 2
category: 基础技术
Expand Down Expand Up @@ -32,13 +32,15 @@ Fri Aug 11 14:23:51 CST 2023
datetime.datetime(2023, 8, 11, 14, 27, 42, 544771)
```

通过交叉验证暂时可以判断是 nodejs 获取时区的逻辑与 linux `date` 命令和 python `datetime.now()` 函数不一致, 所以排除问题需要先确认 `nodejs` 获取时区的逻辑,nodejs 的源码可以在 [nodejs/node](https://github.com/nodejs/node) 项目中找到。

# 深入源码分析

通过查阅 nodejs 的源码, 可以追踪到 nodejs 的时区探测是基于 [ICU](https://github.com/nodejs/node/tree/main/deps/icu-small), 而 python 的 `datetime.datetime.now()` 使用的是 c 语言的 [localtime_r](https://github.com/python/cpython/blob/main/Modules/_datetimemodule.c#L5120) 获取系统的时间
通过查阅 nodejs 的源码, 可以追踪到 nodejs 的时区选择是基于 [ICU](https://github.com/nodejs/node/tree/main/deps/icu-small), 而 python 的 `datetime.datetime.now()` 是通过 c 语言的 [localtime_r](https://github.com/python/cpython/blob/main/Modules/_datetimemodule.c#L5120) 获取系统时间

**显然目前的时区错误是 `ICU` 算法与 `localtime_r` 的行为不一致导致的。**
> **显然,目前可以判断时区错误是 `ICU` 算法与 `localtime_r` 的行为不一致导致的。**
再次深入 `ICU` 的算法排查, 可以看到 `ICU` 的主入口是 [TimeZone::detectHostTimeZone](https://github.com/nodejs/node/blob/main/deps/icu-small/source/i18n/timezone.cpp#L457)
因此需要再次深入 `ICU` 的算法排查, 可以看到 `ICU` 的主入口是 [TimeZone::detectHostTimeZone](https://github.com/nodejs/node/blob/main/deps/icu-small/source/i18n/timezone.cpp#L457)

```cpp
TimeZone* U_EXPORT2
Expand Down

0 comments on commit 851beac

Please sign in to comment.