Установка часового пояса во всем мире в Голанге - PullRequest
0 голосов
/ 25 января 2019

Я пытаюсь изменить часовой пояс golang для своего приложения

Я посмотрел на пакет time , инициализация часового пояса происходит в

time /zoneinfo_unix.go @ initLocal

Функция просто пытается прочитать переменную окружения TZ и, если она действительна, загружает ее

, а если нет, возвращает /etc/localtime, и еслиэто недопустимо, оно возвращается к UTC


, что я пробовал до сих пор

1 - работает нормально - но я не хочу использовать ни один из этих подходов -:

  • в моем файле докера я передаю ENV в контейнер, TZ = Africa/Cairo
  • входя в контейнер bash, выполняя $ export TZ = Africa/Cairo

2- Не работал

  • при инициализации моего приложения (инициализация приложения находится в отдельном пакете, который импортируется в основной), я использую os.SetEnv ("TZ", "Africa / Cairo")")

Когда я упрощаю основной и использую os.SetEnv (" TZ "," Africa / Cairo ") без импорта каких-либо других пакетовкроме «os-time» он работает как положено


Есть идеи о том, как заставить работать второй подход?

Изображение Docker: golang: 1.11.2

1 Ответ

0 голосов
/ 25 января 2019

С помощью os.Setenv("TZ", "Africa/Cairo") вы можете добиться того, что хотите, внутри своего приложения, важно то, что вы должны вызвать его, прежде чем любой другой пакет будет использовать что-либо из пакета time.

Как это обеспечить? Создайте пакет, который ничего не делает, кроме как устанавливает часовой пояс (позже вы можете добавить к нему другие вещи, но для нашего примера этого достаточно).

Как это:

package tzinit

import (
    "os"
)

func init() {
    os.Setenv("TZ", "Africa/Cairo")
}

Импортируйте tzinit пакет первую вещь в вашем main пакете, как это:

package main

import _ "path/to/tzinit"

// Your other, "regular" imports:
import (
    "fmt"
    "os"
    "time"
    ...
)

И поэтому установка TZ env var произойдет до того, как любой другой пакет сможет получить доступ к пакету time.

Обратите внимание, что я использовал отдельную декларацию import только для tzinit, и причина этого в том, что многие редакторы / IDE кода переставят импорт по алфавиту, это гарантирует, что импорт tzinit останется первым импортом .

Слово предупреждения.

Spec: Инициализация пакета устанавливает требования и правила инициализации пакетов, а порядок, в котором обрабатывается импорт, не указан (гарантируется только то, что все упомянутые пакеты будут рекурсивно инициализированы до того, как смогут использоваться). Это означает, что хотя текущие компиляторы обрабатывают их, как указано в списке, вы не можете полагаться на это на 100%. Также существует проблема наличия нескольких исходных файлов даже для пакета main, так как предоставление их в другом порядке компилятору также может изменить порядок инициализации. Спецификация имеет это в качестве «рекомендации»:

Чтобы обеспечить воспроизводимое поведение при инициализации, системам сборки рекомендуется представлять компилятору несколько файлов, принадлежащих одному и тому же пакету, в лексическом порядке имен файлов.

Поэтому, чтобы быть в безопасности, лучше всего установить переменную окружения TZ до запуска приложения Go.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...