---
# System prepended metadata

title: 適用於 MicroPython 和 ESP32 的 ntptime 模組
tags: [ESP32, MicroPython]

---

---
disqus: paoyung
---
# 適用於 MicroPython 和 ESP32 的 ntptime 模組
###### tags: `MicroPython` `ESP32`
> [color=#58f][name=Paoyung][time=Jun 03, 2022] [:snake: ℳ𝒾𝒸𝓇ℴ𝒫𝓎𝓉𝒽ℴ𝓃 隨手記](/@PaoyungChang/mpy_trifiles)

ntptime module
---
MicroPython因為開源之故，所以有多種版本，因此在一些模組的操作與在網路上找到的使用範例並不一致。以 ntptime 這個模組來說，為了校正時差想到的屬性就是 timezone，但目前從官網下載的 ESP32 v1.18 firmware 並沒有 ntptime.timezone，可以用 help 指令得知：
```python
>>> help(ntptime)
object <module 'ntptime' from 'ntptime.py'> is of type module
  socket -- <module 'usocket'>
  NTP_DELTA -- 3155673600
  struct -- <module 'ustruct'>
  __name__ -- ntptime
  __file__ -- ntptime.py
  host -- pool.ntp.org
  time -- <function time at 0x3ffe5410>
  settime -- <function settime at 0x3ffe5420>
>>>
```
timezone
---
雖沒找到 timezone 但却發現 NTP_DELTA 這個值 3155673600 有點莫名，查看原始檔 [ntptime.py](https://github.com/micropython/micropython/blob/master/ports/esp8266/modules/ntptime.py)
```python=9
#...
# (date(2000, 1, 1) - date(1900, 1, 1)).days * 24*60*60
NTP_DELTA = 3155673600
#...
```
原來 ntp 的秒數是從 1900/01/01 開始起算，而 MicroPython 是從 2000/01/01 起算，所以要做差值才能正確的計算，而台灣是 UTC+8 亦即提早 28800 秒，因此把 NTP_DELTA 改為 3155644800 就會是台灣的當地時間。

ntp server
---
再則在執行 ntptime.settime() 偶爾會出現 timeout 的異常，從原始檔中得知 ntptime.host 預設值為 pool.ntp.org，既然在台灣就用台灣的 ntp server 吧！若擔心 timeout 異常造成對時不成功，可以下參數 must=True 強制對時，就把以上這些寫成 function，以利日後使用。
:::warning
:rocket: 記得要先連上網路.... 不然下了 must=True 就變成大迴圈了...
:::

{%gist paoyung/c8f3dddb9cf57722532e6e24b351849d %}

三點不一樣 :coffee:
---
> [color=darkgreen]
> * <span class="c_black">已 UTC+8</span>
> * <span class="c_black">台灣 NTP Server</span>
> * <span class="c_black">可要求強制對時</span>

{%hackmd /@PaoyungChang/css_01 %}

{%hackmd /@PaoyungChang/intro_v0702 %}

