1
0
Fork 0
mirror of https://github.com/miniflux/v2.git synced 2025-09-30 19:22:11 +00:00

fix(timezone): make sure legacy time zones are no longer used

Debian Trixie has removed several time zones. This change makes sure only the current IANA time zones are in use.
This commit is contained in:
Frédéric Guillot 2025-09-12 16:20:27 -07:00 committed by GitHub
parent 4eff9129ab
commit b1742168e1
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 652 additions and 54 deletions

View file

@ -1158,4 +1158,187 @@ var migrations = [...]func(tx *sql.Tx) error{
_, err = tx.Exec(sql)
return err
},
// This migration replaces deprecated timezones by their equivalent on Debian Trixie.
func(tx *sql.Tx) (err error) {
var deprecatedTimeZoneMap = map[string]string{
// Africa
"Africa/Asmera": "Africa/Asmara",
// America - Argentina
"America/Argentina/ComodRivadavia": "America/Argentina/Catamarca",
"America/Buenos_Aires": "America/Argentina/Buenos_Aires",
"America/Catamarca": "America/Argentina/Catamarca",
"America/Cordoba": "America/Argentina/Cordoba",
"America/Jujuy": "America/Argentina/Jujuy",
"America/Mendoza": "America/Argentina/Mendoza",
"America/Rosario": "America/Argentina/Cordoba",
// America - US
"America/Fort_Wayne": "America/Indiana/Indianapolis",
"America/Indianapolis": "America/Indiana/Indianapolis",
"America/Knox_IN": "America/Indiana/Knox",
"America/Louisville": "America/Kentucky/Louisville",
// America - Greenland
"America/Godthab": "America/Nuuk",
// Antarctica
"Antarctica/South_Pole": "Pacific/Auckland",
// Asia
"Asia/Ashkhabad": "Asia/Ashgabat",
"Asia/Calcutta": "Asia/Kolkata",
"Asia/Choibalsan": "Asia/Ulaanbaatar",
"Asia/Chungking": "Asia/Chongqing",
"Asia/Dacca": "Asia/Dhaka",
"Asia/Katmandu": "Asia/Kathmandu",
"Asia/Macao": "Asia/Macau",
"Asia/Rangoon": "Asia/Yangon",
"Asia/Saigon": "Asia/Ho_Chi_Minh",
"Asia/Thimbu": "Asia/Thimphu",
"Asia/Ujung_Pandang": "Asia/Makassar",
"Asia/Ulan_Bator": "Asia/Ulaanbaatar",
// Atlantic
"Atlantic/Faeroe": "Atlantic/Faroe",
// Australia
"Australia/ACT": "Australia/Sydney",
"Australia/LHI": "Australia/Lord_Howe",
"Australia/North": "Australia/Darwin",
"Australia/NSW": "Australia/Sydney",
"Australia/Queensland": "Australia/Brisbane",
"Australia/South": "Australia/Adelaide",
"Australia/Tasmania": "Australia/Hobart",
"Australia/Victoria": "Australia/Melbourne",
"Australia/West": "Australia/Perth",
// Brazil
"Brazil/Acre": "America/Rio_Branco",
"Brazil/DeNoronha": "America/Noronha",
"Brazil/East": "America/Sao_Paulo",
"Brazil/West": "America/Manaus",
// Canada
"Canada/Atlantic": "America/Halifax",
"Canada/Central": "America/Winnipeg",
"Canada/Eastern": "America/Toronto",
"Canada/Mountain": "America/Edmonton",
"Canada/Newfoundland": "America/St_Johns",
"Canada/Pacific": "America/Vancouver",
"Canada/Saskatchewan": "America/Regina",
"Canada/Yukon": "America/Whitehorse",
// Europe
"CET": "Europe/Paris",
"EET": "Europe/Sofia",
"Europe/Kiev": "Europe/Kyiv",
"Europe/Uzhgorod": "Europe/Kyiv",
"Europe/Zaporozhye": "Europe/Kyiv",
"MET": "Europe/Paris",
"WET": "Europe/Lisbon",
// Chile
"Chile/Continental": "America/Santiago",
"Chile/EasterIsland": "Pacific/Easter",
// Fixed offset and generic zones
"CST6CDT": "America/Chicago",
"EST": "America/New_York",
"EST5EDT": "America/New_York",
"HST": "Pacific/Honolulu",
"MST": "America/Denver",
"MST7MDT": "America/Denver",
"PST8PDT": "America/Los_Angeles",
// Countries/Regions
"Cuba": "America/Havana",
"Egypt": "Africa/Cairo",
"Eire": "Europe/Dublin",
"GB": "Europe/London",
"GB-Eire": "Europe/London",
"Hongkong": "Asia/Hong_Kong",
"Iceland": "Atlantic/Reykjavik",
"Iran": "Asia/Tehran",
"Israel": "Asia/Jerusalem",
"Jamaica": "America/Jamaica",
"Japan": "Asia/Tokyo",
"Libya": "Africa/Tripoli",
"Poland": "Europe/Warsaw",
"Portugal": "Europe/Lisbon",
"PRC": "Asia/Shanghai",
"ROC": "Asia/Taipei",
"ROK": "Asia/Seoul",
"Singapore": "Asia/Singapore",
"Turkey": "Europe/Istanbul",
// GMT variations
"GMT+0": "GMT",
"GMT-0": "GMT",
"GMT0": "GMT",
"Greenwich": "GMT",
"UCT": "UTC",
"Universal": "UTC",
"Zulu": "UTC",
// Mexico
"Mexico/BajaNorte": "America/Tijuana",
"Mexico/BajaSur": "America/Mazatlan",
"Mexico/General": "America/Mexico_City",
// US zones
"Navajo": "America/Denver",
"US/Alaska": "America/Anchorage",
"US/Aleutian": "America/Adak",
"US/Arizona": "America/Phoenix",
"US/Central": "America/Chicago",
"US/Eastern": "America/New_York",
"US/East-Indiana": "America/Indiana/Indianapolis",
"US/Hawaii": "Pacific/Honolulu",
"US/Indiana-Starke": "America/Indiana/Knox",
"US/Michigan": "America/Detroit",
"US/Mountain": "America/Denver",
"US/Pacific": "America/Los_Angeles",
"US/Samoa": "Pacific/Pago_Pago",
// Pacific
"Kwajalein": "Pacific/Kwajalein",
"NZ": "Pacific/Auckland",
"NZ-CHAT": "Pacific/Chatham",
"Pacific/Enderbury": "Pacific/Kanton",
"Pacific/Ponape": "Pacific/Pohnpei",
"Pacific/Truk": "Pacific/Chuuk",
// Special cases
"Factory": "UTC", // Factory is used for unconfigured systems
"W-SU": "Europe/Moscow",
}
// Loop through each user and correct the timezone
rows, err := tx.Query(`SELECT id, timezone FROM users`)
if err != nil {
return err
}
userTimezoneMap := make(map[int64]string)
for rows.Next() {
var userID int64
var userTimezone string
if err := rows.Scan(&userID, &userTimezone); err != nil {
return err
}
userTimezoneMap[userID] = userTimezone
}
rows.Close()
for userID, userTimezone := range userTimezoneMap {
if newTimezone, found := deprecatedTimeZoneMap[userTimezone]; found {
if _, err := tx.Exec(`UPDATE users SET timezone = $1 WHERE id = $2`, newTimezone, userID); err != nil {
return err
}
}
}
return nil
},
}