С помощью 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.