Programlama Dillerinde Unix Zaman Damgaları ile Çalışma
Programlamada Neden Unix Zaman Damgaları?
Unix zaman damgaları, yazılım dünyasında zamanın evrensel para birimidir. Tarih aritmetiğini önemsiz hale getirir (sadece saniye ekleyin veya çıkarın), saat dilimi karışıklığını ortadan kaldırır ve JSON'a temiz bir şekilde serileştirilir. Her programlama dili, bunlarla çalışmak için basit işlevler sağlar, ancak API'ler arasında ince farklar vardır. Bu kılavuz, en yaygın dilleri ve en iyi uygulamalarını kapsar.
JavaScript (Tarayıcı ve Node.js)
JavaScript, Date nesnesi için milisaniye kullanırken, diğer birçok sistem saniye kullanır. Bu, en yaygın hata kaynağıdır.
Mevcut Zaman Damgasını Alma
// Epoch'tan bu yana milisaniye (standart JavaScript)
const nowMs = Date.now(); // 1785292800000
// Epoch'tan bu yana saniye (uyumluluk için)
const nowSec = Math.floor(Date.now() / 1000); // 1785292800
// Node.js yüksek çözünürlüklü zamanlayıcı (mikrosaniye)
const hrTime = process.hrtime.bigint();
Zaman Damgasını Tarihe Dönüştürme
// Saniyeden (çoğu API ve veritabanı)
const timestamp = 1785292800;
const date = new Date(timestamp * 1000); // 1000 ile çarpın!
// Milisaniyeden (JavaScript yerel)
const dateFromMs = new Date(1785292800000);
// Sonucu biçimlendirme
console.log(date.toISOString());
// Çıktı: 2026-07-19T00:00:00.000Z
console.log(date.toLocaleString("en-US", { timeZone: "America/New_York" }));
// Çıktı: 7/18/2026, 8:00:00 PM
Tarih Dizesini Zaman Damgasına Ayrıştırma
// Date.parse() kullanarak (milisaniye döndürür)
const ms = Date.parse("2026-07-19T00:00:00Z");
const sec = ms / 1000; // 1785292800
// Date yapıcısını kullanarak
const ts = Math.floor(new Date("2026-07-19 UTC").getTime() / 1000);
Uyarı: Date.parse() davranışı, standart olmayan tarih dizeleri için tarayıcılar arasında farklılık gösterir. Saat dilimi belirteci içeren ISO 8601 biçimini (UTC için Z) kullanmak en güvenlisidir.
JavaScript'te Saat Dilimleri ile Çalışma
// Belirli bir saat diliminde biçimlendirme
const date = new Date(1785292800 * 1000);
const options = {
timeZone: "Asia/Tokyo",
year: "numeric", month: "2-digit", day: "2-digit",
hour: "2-digit", minute: "2-digit", second: "2-digit",
};
console.log(date.toLocaleString("ja-JP", options));
// Çıktı: 07/19/2026 09:00:00
Gelişmiş saat dilimi işlemleri için Intl.DateTimeFormat API'si veya date-fns-tz ve Luxon gibi kütüphaneler önerilir.
Python
Python, zaman damgaları ile çalışmak için hem düşük seviyeli (time) hem de yüksek seviyeli (datetime) modüller sağlar.
Mevcut Zaman Damgasını Alma
import time
# Kesirli milisaniyeler dahil float olarak saniye
current = time.time()
# Örnek: 1785292800.123456
# Tamsayı olarak
current_int = int(time.time())
Zaman Damgasını Datetime'a Dönüştürme
from datetime import datetime
# UTC datetime (Python 3.x)
dt_utc = datetime.utcfromtimestamp(1785292800)
# Saat dilimi duyarlı datetime (Python 3.9+ zoneinfo ile)
from zoneinfo import ZoneInfo
dt_tokyo = datetime.fromtimestamp(1785292800, tz=ZoneInfo("Asia/Tokyo"))
# Biçimlendirilmiş dize
print(dt_utc.strftime("%Y-%m-%d %H:%M:%S"))
# Çıktı: 2026-07-19 00:00:00
Tarih Dizesini Zaman Damgasına Ayrıştırma
import time
from datetime import datetime
# Tarih dizesinden
dt = datetime.strptime("2026-07-19 00:00:00", "%Y-%m-%d %H:%M:%S")
timestamp = time.mktime(dt.timetuple()) # Yerel saat olarak değerlendirir
# UTC giriş için
from datetime import timezone
timestamp_utc = dt.replace(tzinfo=timezone.utc).timestamp()
Pandas ile Çalışma (Veri Analizi)
import pandas as pd
# Bir Unix zaman damgaları sütununu datetime'a dönüştürme
df["timestamp"] = pd.to_datetime(df["unix_seconds"], unit="s")
# Farklı birimlere dönüştürme
df["datetime_ms"] = pd.to_datetime(df["unix_milliseconds"], unit="ms")
# Saat dilimi ayarlama
df["timestamp_ny"] = df["timestamp"].dt.tz_localize("UTC").dt.tz_convert("America/New_York")
PHP
PHP, zaman damgası işlemleri için en basit API'ye sahiptir.
Mevcut Zaman Damgasını Alma
<?php
$now = time(); // Tamsayı: 1785292800
$nowMicro = microtime(); // Dize: "0.12345600 1785292800"
$nowFloat = microtime(true); // Float: 1785292800.1235
Zaman Damgasını Tarihe Dönüştürme
<?php
echo date("Y-m-d H:i:s", 1785292800);
// Çıktı: 2026-07-19 00:00:00
// Saat dilimi ile
$tz = new DateTimeZone("Europe/London");
$dt = new DateTime("@1785292800");
$dt->setTimezone($tz);
echo $dt->format("Y-m-d H:i:s");
Go
Go'nun time paketi iyi tasarlanmıştır ancak ilgili türlerin açıkça anlaşılmasını gerektirir.
Mevcut Zaman Damgasını Alma
package main
import (
"fmt"
"time"
)
func main() {
now := time.Now()
sec := now.Unix() // int64 saniye
milli := now.UnixMilli() // int64 milisaniye
nano := now.UnixNano() // int64 nanosaniye
fmt.Printf("Seconds: %d\n", sec)
}
Zaman Damgasını Tarihe Dönüştürme
t := time.Unix(1785292800, 0)
fmt.Println(t.UTC())
// Çıktı: 2026-07-19 00:00:00 +0000 UTC
// Dize olarak biçimlendirme
fmt.Println(t.Format("2006-01-02 15:04:05"))
// Çıktı: 2026-07-19 00:00:00
// Saat dilimi ile
loc, _ := time.LoadLocation("America/Chicago")
fmt.Println(t.In(loc))
Rust
use std::time::{SystemTime, UNIX_EPOCH};
// Mevcut zaman damgası
let now = SystemTime::now()
.duration_since(UNIX_EPOCH)
.expect("Time went backwards");
println!("Seconds: {}", now.as_secs());
// Zaman damgasından tarihe
let dt = chrono::NaiveDateTime::from_timestamp_opt(1785292800, 0).unwrap();
println!("{}", dt.format("%Y-%m-%d %H:%M:%S"));
Veritabanı Depolama: En İyi Uygulamalar
Doğru Sütun Türünü Seçme
| Veritabanı | Önerilen Tür | Notlar |
|----------|-----------------|-------|
| PostgreSQL | TIMESTAMP WITH TIME ZONE veya BIGINT | Yerel zaman damgası türü tercih edilir |
| MySQL / MariaDB | INT UNSIGNED (2106'ya kadar olan tarihler için) veya BIGINT | TIMESTAMP türünden kaçının (aralık 2038'de sona erer) |
| SQLite | INTEGER | SQLite'ın yerel zaman damgası türü yoktur |
| MongoDB | Date nesnesi veya int64 | BSON Date dahili olarak 64 bit zaman damgasıdır |
PostgreSQL Örneği
-- Yerel zaman damgası olarak saklama
CREATE TABLE events (
id SERIAL PRIMARY KEY,
occurred_at TIMESTAMP WITH TIME ZONE NOT NULL,
payload JSONB
);
-- Mevcut zaman ile ekleme
INSERT INTO events (occurred_at) VALUES (NOW());
-- Unix zaman damgası olarak sorgulama
SELECT EXTRACT(EPOCH FROM occurred_at) AS unix_ts FROM events;
MySQL Örneği
-- Geleceğe dönük depolama için BIGINT kullanma
CREATE TABLE logs (
id INT AUTO_INCREMENT PRIMARY KEY,
event_time BIGINT NOT NULL,
message TEXT
);
-- Mevcut zaman damgasını ekleme
INSERT INTO logs (event_time, message) VALUES (UNIX_TIMESTAMP(), 'Server started');
-- Sorgulama ve dönüştürme
SELECT FROM_UNIXTIME(event_time) AS readable_time FROM logs;
Dil Karşılaştırma Tablosu
| Dil | Mevcut Zaman Damgası | Zaman Damgasından Tarihe | Tarihten Zaman Damgasına | Çözünürlük |
|----------|-------------------|-------------------|-------------------|------------|
| JavaScript | Date.now() | new Date(ts * 1000) | Date.parse(str) / 1000 | Milisaniye |
| Python | time.time() | datetime.fromtimestamp(ts) | datetime.strptime(str).timestamp() | Float saniye |
| PHP | time() | date("Y-m-d", ts) | strtotime(str) | Saniye |
| Go | time.Now().Unix() | time.Unix(ts, 0) | time.Parse(layout, str).Unix() | Saniye |
| Rust | SystemTime::now() | NaiveDateTime::from_timestamp_opt() | — | Çeşitli |
Hangi dili kullanırsanız kullanın, Unix Zaman Damgası Dönüştürücümüz hızlı kontroller ve hata ayıklama için güvenilir bir yardımcıdır.