بیشتر سرورها با منطقه زمانی UTC تحویل داده میشوند و این برای خیلی از کاربردها کاملا درست است. اما وقتی گزارش ها را با ساعت محلی مقایسه میکنید یا کرون جابی دارید که باید ساعت مشخصی از شب اجرا شود، این اختلاف دردسر میسازد. تنظیم آن یک دستور بیشتر نیست، ولی چند نکته دارد که اگر ندانید بعدا سردرگم میشوید.
چرا ساعت درست بیشتر از یک جزئیات است
زمان نادرست روی بخش های بیشتری از سیستم اثر میگذارد که معمولا به آنها فکر نمیکنیم. اگر ساعت سرور چند دقیقه جلو یا عقب باشد، اعتبارسنجی گواهی ها و توکن های زماندار ممکن است شکست بخورد و علت آن هم به سادگی پیدا نمیشود.
- لاگ ها با زمان اشتباه ثبت میشوند و بررسی حادثه ها سخت میشود.
- کرون جاب ها در ساعتی غیر از آنچه انتظار دارید اجرا میشوند.
- اعتبارسنجی گواهی SSL و توکن های زماندار ممکن است خطا بدهد.
- همبستگی لاگ بین چند سرور عملا از بین میرود.
بررسی وضعیت فعلی
قبل از تغییر، وضعیت فعلی را ببینید. خروجی این دستور هم منطقه زمانی و هم وضعیت همگام سازی خودکار را نشان میدهد.
timedatectlتغییر منطقه زمانی
برای پیدا کردن نام دقیق منطقه زمانی میتوانید در فهرست جستجو کنید. نام ها حساس به حروف بزرگ و کوچک هستند.
روی سیستم های قدیمی تر که systemd ندارند، ابزار گرافیکی dpkg-reconfigure همین کار را انجام میدهد.
timedatectl list-timezones | grep -i tehransudo timedatectl set-timezone Asia/Tehransudo dpkg-reconfigure tzdataهمگام سازی خودکار ساعت
تنظیم منطقه زمانی به تنهایی کافی نیست؛ ساعت سیستم هم باید دقیق بماند. ساعت سرورهای مجازی به مرور دچار انحراف میشود و بدون همگام سازی، بعد از چند هفته اختلاف محسوسی پیدا میکند.
اگر به دقت بالاتر نیاز دارید یا سرور شما حساس به زمان است، chrony گزینه بهتری نسبت به سرویس پیشفرض است.
sudo timedatectl set-ntp truetimedatectl show-timesync --allsudo apt install chrony
chronyc tracking
chronyc sourcesنکته مربوط به ایران: ساعت تابستانی حذف شده است
از سال ۱۴۰۱ تغییر ساعت تابستانی در ایران لغو شده و اختلاف زمانی در تمام سال ثابت است. اگر سرور شما قدیمی است و مدت هاست به روز رسانی نشده، ممکن است بسته اطلاعات مناطق زمانی هنوز قانون قدیمی را داشته باشد و در بازه هایی ساعت را نیم ساعت جابجا کند.
برای اطمینان، این بسته را به روز نگه دارید.
sudo apt update
sudo apt install --only-upgrade tzdataساعت برنامه ها جدا از ساعت سیستم است
این موردی است که وقت زیادی از افراد میگیرد. تغییر منطقه زمانی سیستم، لزوما روی پایگاه داده یا زبان برنامه نویسی شما اثر نمیگذارد. هر کدام تنظیم زمانی مستقل خودشان را دارند و باید جداگانه بررسی شوند.
کانتینرهای داکر هم منطقه زمانی خودشان را دارند و به صورت پیشفرض روی UTC هستند، حتی اگر سرور میزبان روی تهران تنظیم شده باشد.
SELECT @@global.time_zone, @@session.time_zone;docker run -e TZ=Asia/Tehran ...- در پی اچ پی مقدار date.timezone را در فایل php.ini بررسی کنید.
- برای برنامه های نود جی اس متغیر محیطی TZ را تنظیم کنید.
- ذخیره زمان در پایگاه داده را ترجیحا به صورت UTC انجام دهید و تبدیل را در لایه نمایش انجام دهید.
پرسش های پرتکرار
چرا با وجود تغییر منطقه زمانی سرور، زمان در برنامه من اشتباه است؟
پایگاه داده و زبان های برنامه نویسی تنظیم زمانی مستقل خودشان را دارند. مقدار time_zone در مای اس کیو ال و date.timezone در پی اچ پی را جداگانه بررسی کنید.
آیا ایران هنوز ساعت تابستانی دارد؟
خیر. از سال ۱۴۰۱ تغییر ساعت تابستانی لغو شده و اختلاف زمانی در تمام سال ثابت است. اگر سرور شما هنوز ساعت را جابجا میکند، بسته tzdata را به روز کنید.
چرا ساعت سرور مجازی به مرور جلو یا عقب میرود؟
انحراف ساعت در ماشین های مجازی طبیعی است. با فعال کردن همگام سازی خودکار یا نصب chrony این مشکل برطرف میشود.
به راهنمای بیشتری نیاز دارید؟
تیم پشتیبانی هایوهاست برای انتخاب و مدیریت سرویس کنار شماست.