Unix-vaxt — sadəcə vaxtı bir ədəd kimi, yəni 1 yanvar 1970-ci il UTC-dən keçən saniyələrin (bəzən millisaniyələrin) sayı kimi yazmaq üsuludur. Bu format dev-lər arasında çox populyardır: saxlamaq, ötürmək və müqayisə etmək asandır, çünki bu sadəcə bir ədəddir.
Sadə dillə desək, Unix-vaxt elə bir taymerdir ki, 1970-ci ildən bəri işləyir və heç dayanmır. 1697222400 kimi qəribə bir ədəd gördün? Qorxma — bu sadəcə başlanğıcdan neçə saniyə keçdiyini göstərir. Hansı tarix olduğunu bilmək istəyirsən? Tezliklə bunu necə hesablamaq lazım olduğunu öyrənəcəyik!
Bu format tez-tez sistemlər arasında məlumat sinxronizasiyası, timestamp-lərin saxlanması və nə vaxt nə baş verdiyini tez müqayisə etmək üçün istifadə olunur.
Unix-vaxta çevirmək
PostgreSQL-də EXTRACT(EPOCH FROM ...) adlı xüsusi bir funksiya var, bununla tarixi və ya timestamp-ı Unix-vaxta çevirə bilərsən.
Gəlin indiki tarixi bu formata çevirək:
SELECT EXTRACT(EPOCH FROM NOW());
Nəticə təxminən belə olacaq:
1697222400
Bu nəticə — sadəcə indiki tarix və vaxtın 1970-ci ildən bəri saniyə ilə ifadəsidir.
Fiks bir tarixi necə çevirmək olar:
SELECT EXTRACT(EPOCH FROM TIMESTAMP '2023-10-01 12:00:00');
Nəticə:
1696152000
İndi bilirik ki, 1 oktyabr 2023, saat 12:00 UTC bu dəyərə uyğundur.
Unix-vaxtdan çevirmək
Təbii ki, əksinə çevirmək üçün də funksiya var. Əgər səndə Unix-vaxtı varsa və onu insan üçün oxunaqlı formata çevirmək istəyirsənsə, TO_TIMESTAMP() funksiyası kömək edəcək.
Unix-vaxtı tarix və vaxta çevirək:
SELECT TO_TIMESTAMP(1697222400);
Nəticə:
2023-10-13 00:00:00+00
İndi görürük ki, bu 13 oktyabr 2023, saat 00:00 UTC-dir.
Unix-vaxtın praktik tətbiqi
Tutaq ki, bizdə events adlı bir cədvəl var və burada hadisələr haqqında məlumatları, o cümlədən onların Unix-vaxt formatında timestamp-lərini saxlayırıq.
CREATE TABLE events (
id SERIAL PRIMARY KEY,
event_name TEXT,
event_time BIGINT -- Unix-vaxtı saxlamaq üçün
);
Bu cədvələ Unix-vaxt formatında timestamp-lərlə məlumat əlavə edə bilərik:
INSERT INTO events (event_name, event_time)
VALUES
('Serverin işə salınması', 1697222400),
('Verilənlər bazasının yenilənməsi', 1697308800);
Bu məlumatı oxunaqlı formata çevirmək üçün TO_TIMESTAMP istifadə etmək kifayətdir:
SELECT event_name, TO_TIMESTAMP(event_time) AS readable_time
FROM events;
Nəticə:
| event_name | readable_time |
|---|---|
| Serverin işə salınması | 2023-10-13 00:00:00+00 |
| Verilənlər bazasının yenilənməsi | 2023-10-14 00:00:00+00 |
Məsləhətlər və tipik səhvlər
- Dəqiqliyin səhv seçilməsi
Əgər Unix-vaxt formatın millisaniyə ilədirsə (məsələn, 1697222400000), onu birbaşa TO_TIMESTAMP funksiyasına vermək və ya EXTRACT ilə istifadə etmək olmaz. Belə hallarda dəyəri 1000-ə bölmək lazımdır:
SELECT TO_TIMESTAMP(1697222400000 / 1000);
Nəticə:
2023-10-13 00:00:00+00
- Zaman zonalarını nəzərə almamaq
Unix-vaxt UTC-də göstərilir, ona görə nəticələr həmişə saat qurşağını nəzərə almadan olacaq, əgər xüsusi olaraq vaxtı çevirməsən. Məsələn:
SELECT TO_TIMESTAMP(1697222400) AT TIME ZONE 'Europe/Moscow';
Nəticə:
2023-10-13 03:00:00
- Çox böyük ədədlərlə problemlər
Bəzən dev-lər təsadüfən Unix-vaxtı üçün çox böyük dəyər (məsələn, millisaniyə əvəzinə saniyə) göndərirlər. Bu, səhv nəticələrə gətirib çıxarır:
SELECT TO_TIMESTAMP(1697222400000); -- Səhv olacaq!
Bunu düzəltmək üçün ədədi düzgün şəkildə 1000-ə bölmək lazımdır.
Nümunə: tapşırığın yerinə yetirilmə vaxtının hesablanması
Real həyatdan bir nümunə: bizdə tasks adlı tapşırıqlar cədvəli var və hər tapşırığın yaradılmasından nə qədər vaxt keçdiyini hesablamaq istəyirik.
Cədvəli yaradırıq:
CREATE TABLE tasks (
id SERIAL PRIMARY KEY,
task_name TEXT,
created_at TIMESTAMP DEFAULT NOW()
);
Bəzi tapşırıqlar əlavə edirik:
INSERT INTO tasks (task_name)
VALUES
('Tapşırıq 1'),
('Tapşırıq 2'),
('Tapşırıq 3');
İndi Unix-vaxtı olan sütun əlavə edə bilərik:
SELECT id, task_name, EXTRACT(EPOCH FROM created_at) AS created_epoch
FROM tasks;
Nəticə:
| id | task_name | created_epoch |
|---|---|---|
| 1 | Tapşırıq 1 | 1697222400 |
| 2 | Tapşırıq 2 | 1697233200 |
Və yaradılma anından neçə saniyə keçdiyini hesablayaq:
SELECT id, task_name, EXTRACT(EPOCH FROM NOW()) - EXTRACT(EPOCH FROM created_at) AS elapsed_seconds
FROM tasks;
Nəticə:
| id | task_name | elapsed_seconds |
|---|---|---|
| 1 | Tapşırıq 1 | 3600 |
| 2 | Tapşırıq 2 | 7200 |
Unix-vaxtı nə vaxt və niyə istifadə etməli?
Unix-vaxt, sistemlər arasında dəyərlərin ötürülməsi, timestamp-lərin müqayisəsi və prosessor yükünü minimuma endirmək lazım olan digər hallarda vaxt məlumatlarını saxlamaq üçün idealdır. O, API-lərdə, web-dev-də, analitikada və server-klient tətbiqlərinin sinxronizasiyasında aktiv istifadə olunur. Amma həmişə onun xüsusiyyətlərini nəzərə almaq lazımdır: UTC-yə yönəlik olması, müxtəlif ölçü vahidləri (saniyə və ya millisaniyə) və saxlama formatı.
Əgər xarici sistemlərlə inteqrasiya zamanı "Unix-vaxt dilində danışan" bir şeylə qarşılaşsan, artıq PostgreSQL-də bununla necə işləmək lazım olduğunu bilirsən. TO_TIMESTAMP və EXTRACT(EPOCH) funksiyalarını rahatlıqla istifadə et, çevirmə işlərini həll et və vaxtla bağlı bütün məsələlərin asanlıqla həll olunacaq!
GO TO FULL VERSION