در سال ۱۴۰۲ شمسی، دولت ایران تصمیم گرفت که دیگر ساعت تابستانی یک ساعت به جلو نرود. به همین دلیل، در سیستم عاملها و نرمافزارهای مختلف، نیاز به بروزرسانی پایگاه دادهی منطقهی زمانی است. در این ریپازیتوری، در تلاشیم که نحوهی بروزرسانی پایگاه دادهی منطقهی زمانی برای زبانها و سیستمعاملهای مختلف را در کنار هم جمعآوری کنیم.
این ریپازیتوری متنباز است و کاملا از اصلاحات و pull requestهای شما برای تکمیل آن استقبال میشود.
در لینوکس، عموما بستهی 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
البته میتوانید تنظیمات تنظیم خودکار ساعت براساس اینترنت و منطقهی زمانی را غیر فعال کنید و به شکل دستی، ساعت خود را تغییر دهید.
اما اگر گوشی شما روتشده باشد، میتوان با ابزاری مثل ریپازیتوری https://github.com/meefik/tzupdater فایلهای tzdata را بروزرسانی کرد. البته ما این نرمافزار را تست نکردیم و اطلاعی از عواقب استفاده از آن (مانند بوت نشدن گوشی بعد از استفاده!) را نمیدانیم.
طبق
داکیومنت پایتون، اطلاعات مربوط به منطقههای زمانی از سیستم گرفته میشود و اگر این دیتا موجود نباشد، از پکیج 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
از جنگوی نسخهی ۳.۲ به قبل، جنگو از پکیج pytz
برای اطلاعات منطقهی زمانی استفاده میکرد. در جنگوی ۳.۲، امکان استفاده از پیادهسازیهای دیگر مثل zoneinfo اضافه شد و از جنگوی ۴.۰، استفاده از zoneinfo که پیشفرض پایتون است به عنوان پیادهسازی پیشفرض مورد استفاده قرار گرفت.
با توجه به توضیح بند قبل، اگر از لایبرری pytz استفاده میکنید، با دستور زیر باید آن را بروزرسانی کنید:
pip install -U pytz
در زبان جاوا، 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
}
}
در پستگره، اطلاعات مربوط به منطقههای زمانی، به همراه باینری پستگره است و با جستجو روشی جز بروزرسانی خود پستگره برای آپدیت آن پیدا نکردیم. پستگره به شکل مداوم، در نسخههای 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