Whiz Tools

Unix Zaman Damgası Dönüştürücü

Unixové časové razítko je počet sekund od 1. ledna 1970 (UTC)

Dönüştürülmüş Tarih & Saat

Unix Zaman Damgası Dönüştürücü

Giriş

Unix zaman damgası (POSIX zamanı veya Epoch zamanı olarak da bilinir), bir zaman noktasını tanımlamak için bir sistemdir. 1 Ocak 1970'ten (orta gece UTC/GMT) itibaren geçen saniye sayısını ifade eder; artık artık sıçrama saniyeleri sayılmaz. Unix zaman damgaları, belirli bir zaman anını dil bağımsız bir temsil ile sağladıkları için bilgisayar sistemlerinde ve programlama dillerinde yaygın olarak kullanılmaktadır.

Bu dönüştürücü, bir Unix zaman damgasını insan tarafından okunabilir bir tarih ve saat formatına dönüştürmenizi sağlar. Farklı bölgesel ve kişisel tercihlere uyum sağlamak için hem 12 saatlik (AM/PM) hem de 24 saatlik zaman formatlarını destekler.

Unix Zaman Damgalarının Çalışma Şekli

Unix zaman damgaları, Unix Epoch'undan (1 Ocak 1970, 00:00:00 UTC) itibaren geçen saniye sayısı olarak hesaplanır. Bu, zaman farklarını hesaplamak ve tarihleri kompakt bir formatta saklamak için özellikle yararlıdır.

Bir Unix zaman damgasından takvim tarihine dönüşüm matematiksel olarak birkaç adım içerir:

  1. Unix Epoch'u (1 Ocak 1970, 00:00:00 UTC) ile başlayın
  2. Zaman damgasındaki saniye sayısını ekleyin
  3. Sıçrama yılları, değişken ay uzunlukları ve diğer takvim karmaşıklıklarını hesaba katın
  4. Gerekirse saat dilimi ayarlamalarını uygulayın

Örneğin, 1609459200 Unix zaman damgası, 1 Ocak 2021 Cuma, 00:00:00 UTC'yi temsil eder.

Dönüşüm formülü şu şekilde ifade edilebilir:

Tarih=Unix Epoch+Zaman Damgası (saniye cinsinden)\text{Tarih} = \text{Unix Epoch} + \text{Zaman Damgası (saniye cinsinden)}

Çoğu programlama dili ve işletim sistemi, bu dönüşümü gerçekleştirmek için yerleşik işlevler sağlar ve karmaşık takvim hesaplamalarını soyutlar.

Zaman Formatı Seçenekleri

Bu dönüştürücü, iki zaman formatı seçeneği sunar:

  1. 24 saat formatı (bazen "askeri zaman" olarak adlandırılır): Saatler 0'dan 23'e kadar değişir ve AM/PM tanımı yoktur. Örneğin, 15:00, 3:00 PM olarak temsil edilir.

  2. 12 saat formatı: Saatler 1'den 12'ye kadar değişir, gece yarısından öğlene kadar olan zamanlar için AM (ante meridiem) ve öğleden sonra olan zamanlar için PM (post meridiem) kullanılır. Örneğin, 24 saat formatındaki 15:00, 12 saat formatında 3:00 PM olarak temsil edilir.

Bu formatlar arasındaki seçim büyük ölçüde bölgesel gelenek ve kişisel tercihlere bağlıdır:

  • 24 saat formatı, Avrupa'nın çoğunda, Latin Amerika'da ve Asya'da, ayrıca dünya genelinde bilimsel, askeri ve tıbbi bağlamlarda yaygın olarak kullanılmaktadır.
  • 12 saat formatı, Amerika Birleşik Devletleri, Kanada, Avustralya ve bazı diğer İngilizce konuşan ülkelerde günlük kullanımda yaygındır.

Kenar Durumları ve Sınırlamalar

Unix zaman damgaları ile çalışırken, birkaç kenar durumu ve sınırlamanın farkında olmak önemlidir:

  1. Negatif zaman damgaları: Bu, Unix Epoch'tan (1 Ocak 1970) önceki tarihleri temsil eder. Matematiksel olarak geçerli olsalar da, bazı sistemler negatif zaman damgalarını doğru bir şekilde işleyemeyebilir.

  2. 2038 Yılı Problemi: Unix zaman damgaları genellikle 32 bit işaretli tam sayılar olarak saklanır ve bu, 19 Ocak 2038'de taşma yapacaktır. Bu noktadan sonra, 32 bit sistemler zamanları doğru bir şekilde temsil edemeyecektir, eğer daha büyük bir tam sayı türü kullanılarak değiştirilmezse.

  3. Son derece büyük zaman damgaları: Çok uzak gelecekteki tarihler bazı sistemlerde temsil edilemeyebilir veya tutarsız bir şekilde işlenebilir.

  4. Sıçrama saniyeleri: Unix zamanı, UTC'ye eklenen sıçrama saniyelerini hesaba katmaz. Bu, Unix zamanının astronomik zaman ile tam olarak senkronize olmadığı anlamına gelir.

  5. Saat dilimi dikkate alımları: Unix zaman damgaları, anları UTC olarak temsil eder. Yerel zamana dönüştürmek, ek saat dilimi bilgisi gerektirir.

  6. Yaz Saati Uygulaması: Zaman damgalarını yerel zamana dönüştürürken, Yaz Saati Uygulaması geçişlerinin karmaşıklıkları dikkate alınmalıdır.

Kullanım Durumları

Unix zaman damgaları, bilgisayar ve veri yönetimi uygulamalarında birçok alanda kullanılmaktadır:

  1. Veritabanı Kayıtları: Zaman damgaları, genellikle girişlerin ne zaman oluşturulduğunu veya değiştirildiğini kaydetmek için kullanılır.

  2. Web Geliştirme: HTTP başlıkları, çerezler ve önbellekleme mekanizmaları genellikle Unix zaman damgalarını kullanır.

  3. Günlük Dosyaları: Sistem günlükleri, olayları kesin kronolojik sıralama ile kaydetmek için genellikle Unix zaman damgaları ile kayıt tutar.

  4. Versiyon Kontrol Sistemleri: Git ve diğer VCS, zaman damgalarını, yapılan taahhütlerin ne zaman yapıldığını kaydetmek için kullanır.

  5. API Yanıtları: Birçok web API'si, verilerin ne zaman oluşturulduğunu veya kaynakların ne zaman son değiştirildiğini belirtmek için zaman damgaları içerir.

  6. Dosya Sistemleri: Dosya oluşturma ve değiştirme zamanları genellikle Unix zaman damgaları olarak saklanır.

  7. Oturum Yönetimi: Web uygulamaları, kullanıcı oturumlarının ne zaman sona ereceğini belirlemek için zaman damgalarını kullanır.

  8. Veri Analizi: Zaman damgaları, analitik uygulamalarda zamansal verilerle çalışmanın standart bir yolunu sağlar.

Alternatifler

Unix zaman damgaları yaygın olarak kullanılsa da, belirli bağlamlarda daha uygun olabilecek alternatif zaman temsil formatları vardır:

  1. ISO 8601: İnsanlar tarafından okunabilirken sıralanabilirliği koruyan standart bir dize formatı (örneğin, "2021-01-01T00:00:00Z"). Veri alışverişi ve kullanıcıya yönelik uygulamalar için genellikle tercih edilir.

  2. RFC 3339: İnternet protokollerinde kullanılan ISO 8601'in bir profili, daha katı biçimlendirme gereksinimlerine sahiptir.

  3. İnsan tarafından okunabilir formatlar: Yerelleştirilmiş tarih dizeleri (örneğin, "1 Ocak 2021") doğrudan kullanıcı etkileşimi için daha uygunken, hesaplama için daha az uygundur.

  4. Microsoft FILETIME: Windows sistemlerinde kullanılan, 1601-01-01'den itibaren geçen 100-nanosecond aralıklarını temsil eden 64-bit bir değer.

  5. Julian Gün Sayısı: Astronomi ve bazı bilimsel uygulamalarda kullanılan, M.Ö. 4713'ten itibaren günleri sayan bir sistem.

Zaman formatının seçimi, aşağıdaki faktörlere bağlıdır:

  • Gerekli hassasiyet
  • İnsan okunabilirlik ihtiyaçları
  • Depolama kısıtlamaları
  • Mevcut sistemlerle uyumluluk
  • Temsil edilmesi gereken tarih aralığı

Tarihçe

Unix zamanının kavramı, 1960'ların sonları ve 1970'lerin başlarında Bell Labs'ta Unix işletim sisteminin geliştirilmesiyle ortaya çıktı. Epoch olarak 1 Ocak 1970'i kullanma kararı, zamanında depolama gereksinimlerini en aza indirmek için pratikti; ilgi alanındaki tarihler için yeterince yakın ama tarihi veriler için yararlı olacak kadar uzaktı.

Orijinal uygulama, geçen saniye sayısını saklamak için 32 bit işaretli tam sayılar kullandı; bu, o zaman için Unix sistemlerinin beklenen ömrü için yeterliydi. Ancak, bu karar 2038 Yılı Problemi'ne (bazen "Y2K38" veya "Unix Milenyum Hatası" olarak adlandırılır) yol açtı, çünkü 32 bit işaretli tam sayılar, 1 Ocak 1970'ten itibaren geçen zamanları yalnızca 19 Ocak 2038'e kadar temsil edebilir.

Unix ve Unix benzeri işletim sistemleri popülerlik kazandıkça, Unix zaman damgası, bilgisayarlardaki zaman temsilinde geçerli bir standart haline geldi. Birçok programlama dili, veritabanı ve uygulama, Unix ortamının ötesine geçerek bu sistemi benimsedi.

Modern sistemler giderek 64 bit tam sayılar kullanarak zaman damgalarını saklamaktadır; bu, temsil edilebilir aralığı yaklaşık 292 milyar yıl ileri ve geri uzatarak 2038 Yılı Problemi'ni etkili bir şekilde çözmektedir. Ancak, eski sistemler ve uygulamalar hala savunmasız olabilir.

Unix zaman damgasının basitliği ve faydası, daha karmaşık zaman temsil formatlarının gelişmesine rağmen, devam eden geçerliliğini sağlamıştır. Hala dijital altyapımızın temel bir kavramı olmaya devam etmektedir.

Kod Örnekleri

İşte Unix zaman damgalarını çeşitli programlama dillerinde insan tarafından okunabilir tarihlere dönüştürme örnekleri:

// JavaScript zaman damgası dönüşümü
function convertUnixTimestamp(timestamp, use12Hour = false) {
  // Yeni bir Date nesnesi oluşturun (JavaScript milisaniye kullanır)
  const date = new Date(timestamp * 1000);
  
  // Biçim seçenekleri
  const options = {
    year: 'numeric',
    month: 'long',
    day: 'numeric',
    weekday: 'long',
    hour: use12Hour ? 'numeric' : '2-digit',
    minute: '2-digit',
    second: '2-digit',
    hour12: use12Hour
  };
  
  // Yerel biçimlendirme kullanarak dizeye dönüştürün
  return date.toLocaleString(undefined, options);
}

// Örnek kullanım
const timestamp = 1609459200; // 1 Ocak 2021 00:00:00 UTC
console.log(convertUnixTimestamp(timestamp, false)); // 24 saat formatı
console.log(convertUnixTimestamp(timestamp, true));  // 12 saat formatı
# Python zaman damgası dönüşümü
import datetime

def convert_unix_timestamp(timestamp, use_12hour=False):
    # Unix zaman damgasını datetime nesnesine dönüştür
    date = datetime.datetime.fromtimestamp(timestamp)
    
    # Tarih dizesini biçimlendir
    if use_12hour:
        format_string = "%A, %B %d, %Y %I:%M:%S %p"  # 12 saat formatı AM/PM ile
    else:
        format_string = "%A, %B %d, %Y %H:%M:%S"     # 24 saat formatı
    
    return date.strftime(format_string)

# Örnek kullanım
timestamp = 1609459200  # 1 Ocak 2021 00:00:00 UTC
print(convert_unix_timestamp(timestamp, False))  # 24 saat formatı
print(convert_unix_timestamp(timestamp, True))   # 12 saat formatı
<?php
// PHP zaman damgası dönüşümü
function convertUnixTimestamp($timestamp, $use12Hour = false) {
    // Biçim dizesi
    $formatString = $use12Hour 
        ? 'l, F j, Y g:i:s A'  // 12 saat formatı AM/PM ile
        : 'l, F j, Y H:i:s';   // 24 saat formatı
    
    // Dönüştür ve tarihi biçimlendir
    return date($formatString, $timestamp);
}

// Örnek kullanım
$timestamp = 1609459200; // 1 Ocak 2021 00:00:00 UTC
echo convertUnixTimestamp($timestamp, false) . "\n"; // 24 saat formatı
echo convertUnixTimestamp($timestamp, true) . "\n";  // 12 saat formatı
?>
// Java zaman damgası dönüşümü
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;

public class UnixTimestampConverter {
    public static String convertUnixTimestamp(long timestamp, boolean use12Hour) {
        // Unix zaman damgasını Instant'a, sonra LocalDateTime'a dönüştür
        Instant instant = Instant.ofEpochSecond(timestamp);
        LocalDateTime dateTime = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
        
        // İstenilen biçime göre biçimlendirici oluştur
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(
            use12Hour ? "EEEE, MMMM d, yyyy h:mm:ss a" : "EEEE, MMMM d, yyyy HH:mm:ss"
        );
        
        // Tarihi biçimlendir
        return dateTime.format(formatter);
    }
    
    public static void main(String[] args) {
        long timestamp = 1609459200; // 1 Ocak 2021 00:00:00 UTC
        System.out.println(convertUnixTimestamp(timestamp, false)); // 24 saat formatı
        System.out.println(convertUnixTimestamp(timestamp, true));  // 12 saat formatı
    }
}
// C# zaman damgası dönüşümü
using System;

class UnixTimestampConverter
{
    public static string ConvertUnixTimestamp(long timestamp, bool use12Hour)
    {
        // Unix zaman damgasını DateTime'a dönüştür
        // Unix zaman damgası, 1970-01-01'den itibaren geçen saniyedir
        DateTime dateTime = DateTimeOffset.FromUnixTimeSeconds(timestamp).DateTime;
        
        // 12 saatlik veya 24 saatlik tercihe göre biçim dizesi
        string formatString = use12Hour 
            ? "dddd, MMMM d, yyyy h:mm:ss tt"  // 12 saat formatı AM/PM ile
            : "dddd, MMMM d, yyyy HH:mm:ss";   // 24 saat formatı
        
        // Biçimlendirilmiş tarih dizesini döndür
        return dateTime.ToString(formatString);
    }
    
    static void Main()
    {
        long timestamp = 1609459200; // 1 Ocak 2021 00:00:00 UTC
        Console.WriteLine(ConvertUnixTimestamp(timestamp, false)); // 24 saat formatı
        Console.WriteLine(ConvertUnixTimestamp(timestamp, true));  // 12 saat formatı
    }
}
# Ruby zaman damgası dönüşümü
require 'time'

def convert_unix_timestamp(timestamp, use_12hour = false)
  # Unix zaman damgasını Time nesnesine dönüştür
  time = Time.at(timestamp)
  
  # 12 saatlik veya 24 saatlik tercihe göre biçim
  if use_12hour
    time.strftime("%A, %B %d, %Y %I:%M:%S %p")  # 12 saat formatı AM/PM ile
  else
    time.strftime("%A, %B %d, %Y %H:%M:%S")     # 24 saat formatı
  end
end

# Örnek kullanım
timestamp = 1609459200  # 1 Ocak 2021 00:00:00 UTC
puts convert_unix_timestamp(timestamp, false)  # 24 saat formatı
puts convert_unix_timestamp(timestamp, true)   # 12 saat formatı
// Go zaman damgası dönüşümü
package main

import (
    "fmt"
    "time"
)

func convertUnixTimestamp(timestamp int64, use12Hour bool) string {
    // Unix zaman damgasını Time'a dönüştür
    t := time.Unix(timestamp, 0)
    
    // 12 saatlik veya 24 saatlik tercihe göre biçim dizesi
    formatString := "Monday, January 2, 2006 "
    if use12Hour {
        formatString += "3:04:05 PM"  // 12 saat formatı AM/PM ile
    } else {
        formatString += "15:04:05"    // 24 saat formatı
    }
    
    // Biçimlendirilmiş zamanı döndür
    return t.Format(formatString)
}

func main() {
    timestamp := int64(1609459200) // 1 Ocak 2021 00:00:00 UTC
    fmt.Println(convertUnixTimestamp(timestamp, false)) // 24 saat formatı
    fmt.Println(convertUnixTimestamp(timestamp, true))  // 12 saat formatı
}
// Swift zaman damgası dönüşümü
import Foundation

func convertUnixTimestamp(_ timestamp: Int, use12Hour: Bool) -> String {
    // Unix zaman damgasından Date oluştur
    let date = Date(timeIntervalSince1970: TimeInterval(timestamp))
    
    // DateFormatter oluştur
    let formatter = DateFormatter()
    formatter.dateStyle = .full
    
    // 12 saatlik veya 24 saatlik tercihe göre saat stilini ayarla
    if use12Hour {
        formatter.timeStyle = .medium
        formatter.amSymbol = "AM"
        formatter.pmSymbol = "PM"
    } else {
        formatter.timeStyle = .medium
        formatter.dateFormat = formatter.dateFormat?.replacingOccurrences(of: "h:mm:ss a", with: "HH:mm:ss")
    }
    
    // Biçimlendirilmiş tarihi döndür
    return formatter.string(from: date)
}

// Örnek kullanım
let timestamp = 1609459200 // 1 Ocak 2021 00:00:00 UTC
print(convertUnixTimestamp(timestamp, use12Hour: false)) // 24 saat formatı
print(convertUnixTimestamp(timestamp, use12Hour: true))  // 12 saat formatı
# R zaman damgası dönüşümü
convert_unix_timestamp <- function(timestamp, use_12hour = FALSE) {
  # Unix zaman damgasını POSIXct tarih/zamanına dönüştür
  date_time <- as.POSIXct(timestamp, origin = "1970-01-01", tz = "UTC")
  
  # 12 saatlik veya 24 saatlik tercihe göre biçim
  if (use_12hour) {
    format_string <- "%A, %B %d, %Y %I:%M:%S %p"  # 12 saat formatı AM/PM ile
  } else {
    format_string <- "%A, %B %d, %Y %H:%M:%S"     # 24 saat formatı
  }
  
  # Biçimlendirilmiş tarih dizesini döndür
  format(date_time, format_string)
}

# Örnek kullanım
timestamp <- 1609459200  # 1 Ocak 2021 00:00:00 UTC
cat(convert_unix_timestamp(timestamp, FALSE), "\n")  # 24 saat formatı
cat(convert_unix_timestamp(timestamp, TRUE), "\n")   # 12 saat formatı
% MATLAB zaman damgası dönüşümü
function formattedDate = convertUnixTimestamp(timestamp, use12Hour)
    % Unix zaman damgasını MATLAB datetime'a dönüştür
    % MATLAB tarihler 1900-01-01'den itibaren geçen günlerdir, 1 = 1900-01-01
    % Unix zaman damgası 1970-01-01'den itibaren geçen saniyedir
    
    % Önce Excel tarih formatına dönüştür
    % 25569, 1900-01-01 ile 1970-01-01 arasındaki gün sayısıdır
    excelDate = (timestamp / 86400) + 25569;
    
    % 12 saatlik veya 24 saatlik tercihe göre biçim
    if use12Hour
        formattedDate = datestr(excelDate, 'dddd, mmmm d, yyyy h:mm:ss AM/PM');
    else
        formattedDate = datestr(excelDate, 'dddd, mmmm d, yyyy hh:mm:ss');
    end
end

% Örnek kullanım
timestamp = 1609459200;  % 1 Ocak 2021 00:00:00 UTC
disp(convertUnixTimestamp(timestamp, false))  % 24 saat formatı
disp(convertUnixTimestamp(timestamp, true))   % 12 saat formatı
' Excel VBA zaman damgası dönüşümü
Function ConvertUnixTimestamp(timestamp As Long, Optional use12Hour As Boolean = False) As String
    ' Unix zaman damgasını Excel tarih/zamanına dönüştür
    ' Excel tarihleri 1900-01-01'den itibaren geçen günlerdir, 1 = 1900-01-01
    ' Unix zaman damgası 1970-01-01'den itibaren geçen saniyedir
    
    ' Önce Excel tarih formatına dönüştür
    ' 25569, 1900-01-01 ile 1970-01-01 arasındaki gün sayısıdır
    Dim excelDate As Double
    excelDate = (timestamp / 86400) + 25569
    
    ' 12 saatlik veya 24 saatlik tercihe göre biçim dizesi
    If use12Hour Then
        ConvertUnixTimestamp = Format(excelDate, "dddd, mmmm d, yyyy h:mm:ss AM/PM")
    Else
        ConvertUnixTimestamp = Format(excelDate, "dddd, mmmm d, yyyy hh:mm:ss")
    End If
End Function

' Bir çalışma sayfasında kullanım:
' =ConvertUnixTimestamp(1609459200, TRUE)  ' 12 saat formatı
' =ConvertUnixTimestamp(1609459200, FALSE) ' 24 saat formatı

Kenar Durumlarını Yönetme

Unix zaman damgaları ile çalışırken, kenar durumlarını doğru bir şekilde yönetmek önemlidir. İşte bazı yaygın kenar durumlarını ele almanın örnekleri:

// JavaScript kenar durumu yönetimi
function safeConvertTimestamp(timestamp, use12Hour = false) {
  // Zaman damgasının geçerli olup olmadığını kontrol edin
  if (timestamp === undefined || timestamp === null || isNaN(timestamp)) {
    return "Geçersiz zaman damgası";
  }
  
  // Negatif zaman damgalarını kontrol edin (1970'ten önceki tarihler)
  if (timestamp < 0) {
    // Bazı tarayıcılar negatif zaman damgalarını doğru bir şekilde işleyemeyebilir
    // 1970'ten önceki tarihler için daha sağlam bir yaklaşım kullanın
    const date = new Date(timestamp * 1000);
    if (isNaN(date.getTime())) {
      return "Geçersiz tarih (1970'ten önce)";
    }
  }
  
  // Y2K38 problemi için (32 bit sistemler için)
  const maxInt32 = 2147483647; // 32 bit işaretli tam sayının maksimum değeri
  if (timestamp > maxInt32) {
    // Modern JavaScript'te çok büyük zaman damgaları için BigInt kullanmayı düşünün
    console.warn("Zaman damgası 32 bit tam sayı sınırını aşıyor (Y2K38 sorunu)");
  }
  
  // Normal dönüşüm ile devam edin
  try {
    const date = new Date(timestamp * 1000);
    const options = {
      year: 'numeric',
      month: 'long',
      day: 'numeric',
      weekday: 'long',
      hour: use12Hour ? 'numeric' : '2-digit',
      minute: '2-digit',
      second: '2-digit',
      hour12: use12Hour
    };
    return date.toLocaleString(undefined, options);
  } catch (error) {
    return "Zaman damgasını dönüştürürken hata: " + error.message;
  }
}

Kaynaklar

  1. "Unix Zamanı." Vikipedi, Wikimedia Vakfı, https://en.wikipedia.org/wiki/Unix_time

  2. "2038 Yılı Problemi." Vikipedi, Wikimedia Vakfı, https://en.wikipedia.org/wiki/Year_2038_problem

  3. Olson, Arthur David. "Takvimsel Zamanın Karmaşıklıkları." The Open Group, https://www.usenix.org/legacy/events/usenix01/full_papers/olson/olson.pdf

  4. "ISO 8601." Vikipedi, Wikimedia Vakfı, https://en.wikipedia.org/wiki/ISO_8601

  5. "RFC 3339: İnternette Tarih ve Zaman: Zaman Damgaları." İnternet Mühendisliği Görev Gücü (IETF), https://tools.ietf.org/html/rfc3339

  6. Kernighan, Brian W., ve Dennis M. Ritchie. "C Programlama Dili." Prentice Hall, 1988.

Feedback