/update-timezone

A Simple repository to provide guideline to update timezone database for platforms and languages

The UnlicenseUnlicense

Update TimeZone Database

در سال ۱۴۰۲ شمسی، دولت ایران تصمیم گرفت که دیگر ساعت تابستانی یک ساعت به جلو نرود. به همین دلیل، در سیستم عامل‌ها و نرم‌افزارهای مختلف، نیاز به بروزرسانی پایگاه داده‌ی منطقه‌ی زمانی است. در این ریپازیتوری، در تلاشیم که نحوه‌ی بروزرسانی پایگاه داده‌ی منطقه‌ی زمانی برای زبان‌ها و سیستم‌عامل‌های مختلف را در کنار هم جمع‌آوری کنیم.

این ریپازیتوری متن‌باز است و کاملا از اصلاحات و pull requestهای شما برای تکمیل آن استقبال می‌شود.

OSs

Windows

Linux

Ubuntu/Debian (apt based)

در لینوکس، عموما بسته‌ی tzdata وظیفه‌ی نگهداری اطلاعات تایم‌زون‌های مختلف را بر عهده دارد. برای آپگرید آن می‌توانید دستورات زیر را در ترمینال بزنید:

sudo apt update
sudo apt install tzdata

اگر در محیط Docker و مثلا در Dockerfile نیاز به آپدیت دارید، لازم است که در حالت غیر تعاملی (non interactive) دستورات را اجرا کنید

RUN DEBIAN_FRONTEND=noninteractive apt-get update && DEBIAN_FRONTEND=noninteractive apt-get -y install tzdata

برای بررسی عدم تغییر ساعت در سال ۱۴۰۲، مثلا دستور زیر را اجرا کنید:

TZ=Asia/Tehran date --date='@1679589000'

خروجی باید مقدار زیر باشد:

Thu Mar 23 08:00:00 PM +0330 2023

Android

اگر گوشی شما root شده نیست و دسترسی superuser ندارید، طبق جستجوی من، تنها راه بروزرسانی پایگاه داده‌ی منطقه‌های زمانی، بروزرسانی نسخه‌ی اندروید گوشی است و اگر نسخه‌ی جدید برای اندروید شما منتشر نشود، راه چاره‌ای برای بروزرسانی منطقه‌های زمانی به جز روت کردن گوشی نیست.

البته می‌توانید تنظیمات تنظیم خودکار ساعت براساس اینترنت و منطقه‌ی زمانی را غیر فعال کنید و به شکل دستی، ساعت خود را تغییر دهید.

اما اگر گوشی شما روت‌شده باشد، می‌توان با ابزاری مثل ریپازیتوری https://github.com/meefik/tzupdater فایل‌های tzdata را بروزرسانی کرد. البته ما این نرم‌افزار را تست نکردیم و اطلاعی از عواقب استفاده از آن (مانند بوت نشدن گوشی بعد از استفاده!) را نمی‌دانیم.

Languages / Frameworks

Python

طبق داکیومنت پایتون، اطلاعات مربوط به منطقه‌های زمانی از سیستم گرفته می‌شود و اگر این دیتا موجود نباشد، از پکیج tzdata گرفته می‌شود. در نتیجه، در قدم اول، بروزرسانی اطلاعات تایم‌زون‌ها رو سیستم عامل‌ها را ببینید و برای بروزرسانی پکیج tzdata از pypi، از دستور زیر استفاده کنید:

pip install -U tzdata

برای تست اینکه بروزرسانی به دسترسی انجام شده، مثلا بررسی اینکه عدم تغییر ساعت سال ۱۴۰۲ شمسی اعمال شده، می‌توانید با کد زیر امتحان کنید:

from datetime import datetime
from zoneinfo import ZoneInfo

print(datetime(2023, 3, 23, 16, 30, tzinfo=ZoneInfo('UTC')).astimezone(ZoneInfo('Asia/Tehran')).isoformat())
# outputs: 2023-03-23T20:00:00+03:30

Django

از جنگوی نسخه‌ی ۳.۲ به قبل، جنگو از پکیج pytz برای اطلاعات منطقه‌ی زمانی استفاده می‌کرد. در جنگوی ۳.۲، امکان استفاده از پیاده‌سازی‌های دیگر مثل zoneinfo اضافه شد و از جنگوی ۴.۰، استفاده از zoneinfo که پیش‌فرض پایتون است به عنوان پیاده‌سازی پیش‌فرض مورد استفاده قرار گرفت.

با توجه به توضیح بند قبل، اگر از لایبرری pytz استفاده می‌کنید، با دستور زیر باید آن را بروزرسانی کنید:

pip install -U pytz

Java

در زبان جاوا، JRE تایم‌زون پیش‌فرض را از سیستم عامل می‌گیرد، با این حال، خودش نیز یک پایگاه داده از منطقه‌های زمانی را نگهداری می‌کند که در آن مشخصات و تنظیمات مربوط به DST موجود است. پایگاه داده‌ی منطقه‌های زمانی جاوا در <install_dir>/jre/lib/zi ذخیره شده است و ابزاری به نام tzupdater توسط oracle برای بروزرسانی آن نوشته شده است. دستورهای راهنمای بعد برای لینوکس نوشته شده است، در دیگر سیستم عامل‌ها دستورات معادل را برای دانلود فایل و اجرای جاوا استفاده کنید.

این ابزار، متن باز نیست، اما شرکت Azul یک نسخه‌ی معادل متن‌باز برای آن منتشر کرده است. این ابزار، با ورودی گرفتن دیتابیس منطقه‌های زمانی، آن را در جاوا بروزرسانی می‌کند. در ادامه، آموزش دانلود tzupdater و استفاده از آن برای بروزرسانی منطقه‌ی زمانی در جاوا را آورده‌ایم:

ابتدا ابزار tzupdater را دانلود کنید، اطلاعات بیشتر درباره‌ی آن در این لینک آمده است.

wget https://cdn.azul.com/tools/ziupdater1.1.1.1-jse8+7-any_jvm.tar.gz
tar -xzf ziupdater1.1.1.1-jse8+7-any_jvm.tar.gz

سپس، آخرین نسخه از دیتابیس منطقه‌های زمانی را دانلود کنید. وب‌سایت iana.org یکی از مراجع نگهداری اطلاعات zoneinfo است.

wget https://www.iana.org/time-zones/repository/tzdata-latest.tar.gz

و سپس، ابزار tzupdater را با دستور زیر اجرا کنید.

java -jar ziupdater-1.1.1.1.jar -l file://$(pwd)/tzdata-latest.tar.gz

برای بررسی اینکه دیتابیس تایم‌زون‌ها برای سال ۱۴۰۲ شمسی بروز شده باشد، می‌توانید با کد جاوایی زیر زمان را تست کنید:

import java.util.*;

public class TestTimeZone {
    public static void main(String[] args) {
        Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("Asia/Tehran"));
        calendar.setTimeInMillis(1679589000000L);
        System.out.println(String.format("%tFT%<tR", calendar));
        // output: 2023-03-23T20:00
    }
}

Softwares

Databases

Mysql

Postgresql

در پستگره، اطلاعات مربوط به منطقه‌های زمانی، به همراه باینری پستگره است و با جستجو روشی جز بروزرسانی خود پستگره برای آپدیت آن پیدا نکردیم. پستگره به شکل مداوم، در نسخه‌های minorش، آپدیت برای tzdata هم ارائه می‌دهد. می‌توانید release note‌های پستگره را در این رابطه بخوانید.

اگر از نسخه‌های قدیمی پستگره که بروزرسانی‌ای برای آن ارائه نمی‌شود استفاده می‌کنید، یک راه‌کار بیلد دستی نسخه‌ی جدید با تایم‌زون‌های آپدیت شده است. در سورس کد پستگره، یک فایل tzdata.zi وجود است که اطلاعات منطقه‌های زمانی در آن ذخیره شده است. مثلا در نسخه‌ی ۱۵.۲، این فایل در اینجا قرار دارد: https://github.com/postgres/postgres/blob/REL_15_2/src/timezone/data/tzdata.zi

آخرین نسخه‌ی فایل tzdata.zi را از دیتابیس iana می‌توانید از اینجا دانلود کنید: https://data.iana.org/time-zones/tzdb/tzdata.zi

آموزش نصب پستگره از سورس کد نیز در این لینک قرار دارد: https://www.postgresql.org/docs/15/installation.html

SEO

این بخش برای بهبود سئوی این صفحه درست شده است. آموزش حل تغییر نکردن، بروز نشدن ساعت در سال جدید، چگونی حل کردن مشکل عوض نشدن ساعت، یک ساعت جلو بودن یا عقب بودن در این صفحه نوشته شده است.