🕐
← Rehberlere dön

Programlama Dillerinde Unix Zaman Damgaları ile Çalışma

· Etiketler: javascript, python, php, golang, programming, unix-timestamp, epoch, database

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.