Whiz Tools

Penukar Timestamp Unix

Unix tidsstempel er antallet af sekunder siden 1. januar 1970 (UTC)

Tarikh & Waktu yang Ditukar

Penukar Timestamp Unix

Pengenalan

Timestamp Unix (juga dikenali sebagai masa POSIX atau masa Epoch) adalah sistem untuk menerangkan satu titik dalam masa. Ia adalah bilangan saat yang telah berlalu sejak 1 Januari 1970 (tengah malam UTC/GMT), tidak mengira saat lompat. Timestamp Unix digunakan secara meluas dalam sistem komputer dan bahasa pengaturcaraan kerana ia menyediakan representasi yang padat dan bebas bahasa bagi satu momen tertentu dalam masa.

Penukar ini membolehkan anda menukar timestamp Unix kepada format tarikh dan masa yang boleh dibaca manusia. Ia menyokong kedua-dua format masa 12-jam (AM/PM) dan 24-jam untuk memenuhi pelbagai pilihan serantau dan peribadi.

Cara Kerja Timestamp Unix

Timestamp Unix dikira sebagai bilangan saat sejak Epoch Unix (1 Januari 1970, 00:00:00 UTC). Ini menjadikannya sangat berguna untuk mengira perbezaan masa dan untuk menyimpan tarikh dalam format yang padat.

Penukaran matematik dari timestamp Unix kepada tarikh kalendar melibatkan beberapa langkah:

  1. Mulakan dengan Epoch Unix (1 Januari 1970, 00:00:00 UTC)
  2. Tambah bilangan saat dalam timestamp
  3. Ambil kira tahun lompat, panjang bulan yang berbeza, dan kompleksiti kalendar lain
  4. Terapkan penyesuaian zon waktu jika perlu

Sebagai contoh, timestamp Unix 1609459200 mewakili Jumaat, 1 Januari 2021, 00:00:00 UTC.

Formula penukaran boleh dinyatakan sebagai:

Tarikh=Epoch Unix+Timestamp (dalam saat)\text{Tarikh} = \text{Epoch Unix} + \text{Timestamp (dalam saat)}

Kebanyakan bahasa pengaturcaraan dan sistem operasi menyediakan fungsi terbina dalam untuk mengendalikan penukaran ini, menyembunyikan pengiraan kalendar yang kompleks.

Pilihan Format Masa

Penukar ini menawarkan dua pilihan format masa:

  1. Format 24-jam (kadang-kadang dipanggil "masa tentera"): Jam berkisar dari 0 hingga 23, dan tiada penetapan AM/PM. Sebagai contoh, 3:00 PM diwakili sebagai 15:00.

  2. Format 12-jam: Jam berkisar dari 1 hingga 12, dengan AM (ante meridiem) untuk masa dari tengah malam hingga tengah hari, dan PM (post meridiem) untuk masa dari tengah hari hingga tengah malam. Sebagai contoh, 15:00 dalam format 24-jam diwakili sebagai 3:00 PM.

Pilihan antara format-format ini adalah sebahagian besar bergantung kepada konvensyen serantau dan pilihan peribadi:

  • Format 24-jam digunakan secara umum di kebanyakan Eropah, Amerika Latin, dan Asia, serta dalam konteks saintifik, tentera, dan perubatan di seluruh dunia.
  • Format 12-jam adalah lazim di Amerika Syarikat, Kanada, Australia, dan beberapa negara berbahasa Inggeris yang lain untuk penggunaan sehari-hari.

Kes Khas dan Had

Apabila bekerja dengan timestamp Unix, adalah penting untuk menyedari beberapa kes khas dan had:

  1. Timestamp negatif: Ini mewakili tarikh sebelum Epoch Unix (1 Januari 1970). Walaupun secara matematik sah, beberapa sistem mungkin tidak mengendalikan timestamp negatif dengan betul.

  2. Masalah Tahun 2038: Timestamp Unix sering disimpan sebagai integer bertanda 32-bit, yang akan melimpah pada 19 Januari 2038. Selepas titik ini, sistem 32-bit tidak akan dapat mewakili masa dengan betul melainkan diubah untuk menggunakan jenis integer yang lebih besar.

  3. Timestamp yang sangat besar: Tarikh masa depan yang sangat jauh mungkin tidak dapat diwakili dalam beberapa sistem, atau mungkin ditangani secara tidak konsisten.

  4. Saat lompat: Masa Unix tidak mengambil kira saat lompat, yang kadang-kadang ditambah kepada UTC untuk mengimbangi putaran Bumi yang tidak teratur. Ini bermakna masa Unix tidak diselaraskan dengan tepat dengan masa astronomi.

  5. Pertimbangan zon waktu: Timestamp Unix mewakili momen dalam UTC. Menukar kepada waktu tempatan memerlukan maklumat zon waktu tambahan.

  6. Waktu Penjimatan Siang: Apabila menukar timestamp kepada waktu tempatan, kompleksiti transisi Waktu Penjimatan Siang mesti dipertimbangkan.

Kes Penggunaan

Timestamp Unix digunakan dalam pelbagai aplikasi di seluruh pengkomputeran dan pengurusan data:

  1. Rekod Pangkalan Data: Timestamp biasanya digunakan untuk merekod apabila entri dibuat atau diubah.

  2. Pembangunan Web: Header HTTP, kuki, dan mekanisme caching sering menggunakan timestamp Unix.

  3. Fail Log: Log sistem biasanya merekodkan peristiwa dengan timestamp Unix untuk urutan kronologi yang tepat.

  4. Sistem Kawalan Versi: Git dan sistem VCS lain menggunakan timestamp untuk merekodkan bila komit dibuat.

  5. Respons API: Banyak API web menyertakan timestamp dalam respons mereka untuk menunjukkan bila data dihasilkan atau bila sumber terakhir diubah.

  6. Sistem Fail: Masa penciptaan dan pengubahsuaian fail sering disimpan sebagai timestamp Unix.

  7. Pengurusan Sesi: Aplikasi web menggunakan timestamp untuk menentukan bila sesi pengguna harus tamat.

  8. Analisis Data: Timestamp menyediakan cara yang standard untuk bekerja dengan data temporal dalam aplikasi analitik.

Alternatif

Walaupun timestamp Unix digunakan secara meluas, terdapat format representasi masa alternatif yang mungkin lebih sesuai dalam konteks tertentu:

  1. ISO 8601: Format string standard (contohnya, "2021-01-01T00:00:00Z") yang boleh dibaca manusia sambil mengekalkan kebolehsortiran. Ia sering lebih disukai untuk pertukaran data dan aplikasi yang menghadapi pengguna.

  2. RFC 3339: Profil ISO 8601 yang digunakan dalam protokol internet, dengan keperluan format yang lebih ketat.

  3. Format yang boleh dibaca manusia: Rentetan tarikh yang dilokalisasi (contohnya, "1 Januari 2021") lebih sesuai untuk interaksi langsung dengan pengguna tetapi kurang sesuai untuk pengiraan.

  4. Microsoft FILETIME: Nilai 64-bit yang mewakili bilangan interval 100-nanodetik sejak 1 Januari 1601, digunakan dalam sistem Windows.

  5. Nombor Hari Julian: Digunakan dalam astronomi dan beberapa aplikasi saintifik, mengira hari sejak 1 Januari 4713 SM.

Pilihan format masa bergantung kepada faktor seperti:

  • Ketepatan yang diperlukan
  • Keperluan kebolehbaca manusia
  • Kekangan penyimpanan
  • Keserasian dengan sistem sedia ada
  • Julat tarikh yang perlu diwakili

Sejarah

Konsep masa Unix berasal dari pembangunan sistem operasi Unix di Bell Labs pada akhir 1960-an dan awal 1970-an. Keputusan untuk menggunakan 1 Januari 1970 sebagai epoch adalah agak arbitrari tetapi praktikal pada masa itu—ia cukup baru untuk meminimumkan keperluan penyimpanan untuk tarikh yang menarik tetapi cukup jauh ke masa lalu untuk berguna bagi data sejarah.

Pelaksanaan asal menggunakan integer bertanda 32-bit untuk menyimpan bilangan saat, yang mencukupi untuk jangka hayat sistem Unix yang dijangkakan pada masa itu. Walau bagaimanapun, keputusan ini membawa kepada Masalah Tahun 2038 (kadang-kadang dipanggil "Y2K38" atau "Bug Milenium Unix"), kerana integer bertanda 32-bit hanya boleh mewakili tarikh sehingga 1 Januari 2038 (03:14:07 UTC).

Apabila Unix dan sistem yang serupa Unix semakin popular, timestamp Unix menjadi standard de facto untuk mewakili masa dalam pengkomputeran. Ia diterima pakai oleh banyak bahasa pengaturcaraan, pangkalan data, dan aplikasi, melampaui persekitaran Unix asalnya.

Sistem moden semakin menggunakan integer 64-bit untuk timestamp, yang memperluaskan julat yang boleh diwakili kepada kira-kira 292 bilion tahun ke kedua-dua arah dari epoch, secara efektif menyelesaikan Masalah Tahun 2038. Walau bagaimanapun, sistem dan aplikasi warisan mungkin masih terdedah.

Kesederhanaan dan utiliti timestamp Unix telah memastikan relevansinya yang berterusan walaupun dengan perkembangan format representasi masa yang lebih canggih. Ia kekal sebagai konsep asas dalam pengkomputeran, menyokong banyak infrastruktur digital kita.

Contoh Kod

Berikut adalah contoh cara menukar timestamp Unix kepada tarikh yang boleh dibaca manusia dalam pelbagai bahasa pengaturcaraan:

// Penukaran timestamp JavaScript
function convertUnixTimestamp(timestamp, use12Hour = false) {
  // Buat objek Date baru (JavaScript menggunakan milisaat)
  const date = new Date(timestamp * 1000);
  
  // Pilihan format
  const options = {
    year: 'numeric',
    month: 'long',
    day: 'numeric',
    weekday: 'long',
    hour: use12Hour ? 'numeric' : '2-digit',
    minute: '2-digit',
    second: '2-digit',
    hour12: use12Hour
  };
  
  // Tukar kepada string menggunakan format lokal
  return date.toLocaleString(undefined, options);
}

// Contoh penggunaan
const timestamp = 1609459200; // 1 Januari 2021 00:00:00 UTC
console.log(convertUnixTimestamp(timestamp, false)); // Format 24-jam
console.log(convertUnixTimestamp(timestamp, true));  // Format 12-jam
# Penukaran timestamp Python
import datetime

def convert_unix_timestamp(timestamp, use_12hour=False):
    # Tukar timestamp Unix kepada objek datetime
    date = datetime.datetime.fromtimestamp(timestamp)
    
    # Format string
    if use_12hour:
        format_string = "%A, %B %d, %Y %I:%M:%S %p"  # Format 12-jam dengan AM/PM
    else:
        format_string = "%A, %B %d, %Y %H:%M:%S"     # Format 24-jam
    
    return date.strftime(format_string)

# Contoh penggunaan
timestamp = 1609459200  # 1 Januari 2021 00:00:00 UTC
print(convert_unix_timestamp(timestamp, False))  # Format 24-jam
print(convert_unix_timestamp(timestamp, True))   # Format 12-jam
<?php
// Penukaran timestamp PHP
function convertUnixTimestamp($timestamp, $use12Hour = false) {
    // Format string
    $formatString = $use12Hour 
        ? 'l, F j, Y g:i:s A'  // Format 12-jam dengan AM/PM
        : 'l, F j, Y H:i:s';   // Format 24-jam
    
    // Tukar dan format tarikh
    return date($formatString, $timestamp);
}

// Contoh penggunaan
$timestamp = 1609459200; // 1 Januari 2021 00:00:00 UTC
echo convertUnixTimestamp($timestamp, false) . "\n"; // Format 24-jam
echo convertUnixTimestamp($timestamp, true) . "\n";  // Format 12-jam
?>
// Penukaran timestamp Java
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) {
        // Tukar timestamp Unix kepada Instant, kemudian kepada LocalDateTime
        Instant instant = Instant.ofEpochSecond(timestamp);
        LocalDateTime dateTime = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
        
        // Buat formatter berdasarkan format yang dikehendaki
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(
            use12Hour ? "EEEE, MMMM d, yyyy h:mm:ss a" : "EEEE, MMMM d, yyyy HH:mm:ss"
        );
        
        // Format tarikh
        return dateTime.format(formatter);
    }
    
    public static void main(String[] args) {
        long timestamp = 1609459200; // 1 Januari 2021 00:00:00 UTC
        System.out.println(convertUnixTimestamp(timestamp, false)); // Format 24-jam
        System.out.println(convertUnixTimestamp(timestamp, true));  // Format 12-jam
    }
}
// Penukaran timestamp C#
using System;

class UnixTimestampConverter
{
    public static string ConvertUnixTimestamp(long timestamp, bool use12Hour)
    {
        // Tukar timestamp Unix kepada DateTime
        // Timestamp Unix adalah saat sejak 1970-01-01
        DateTime dateTime = DateTimeOffset.FromUnixTimeSeconds(timestamp).DateTime;
        
        // Format string berdasarkan pilihan 12-jam atau 24-jam
        string formatString = use12Hour 
            ? "dddd, MMMM d, yyyy h:mm:ss tt"  // Format 12-jam dengan AM/PM
            : "dddd, MMMM d, yyyy HH:mm:ss";   // Format 24-jam
        
        // Kembalikan string tarikh yang diformat
        return dateTime.ToString(formatString);
    }
    
    static void Main()
    {
        long timestamp = 1609459200; // 1 Januari 2021 00:00:00 UTC
        Console.WriteLine(ConvertUnixTimestamp(timestamp, false)); // Format 24-jam
        Console.WriteLine(ConvertUnixTimestamp(timestamp, true));  // Format 12-jam
    }
}
# Penukaran timestamp Ruby
require 'time'

def convert_unix_timestamp(timestamp, use_12hour = false)
  # Tukar timestamp Unix kepada objek Time
  time = Time.at(timestamp)
  
  # Format berdasarkan pilihan 12-jam atau 24-jam
  if use_12hour
    time.strftime("%A, %B %d, %Y %I:%M:%S %p")  # Format 12-jam dengan AM/PM
  else
    time.strftime("%A, %B %d, %Y %H:%M:%S")     # Format 24-jam
  end
end

# Contoh penggunaan
timestamp = 1609459200  # 1 Januari 2021 00:00:00 UTC
puts convert_unix_timestamp(timestamp, false)  # Format 24-jam
puts convert_unix_timestamp(timestamp, true)   # Format 12-jam
// Penukaran timestamp Go
package main

import (
    "fmt"
    "time"
)

func convertUnixTimestamp(timestamp int64, use12Hour bool) string {
    // Tukar timestamp Unix kepada Time
    t := time.Unix(timestamp, 0)
    
    // Format string berdasarkan pilihan 12-jam atau 24-jam
    formatString := "Monday, January 2, 2006 "
    if use12Hour {
        formatString += "3:04:05 PM"  // Format 12-jam dengan AM/PM
    } else {
        formatString += "15:04:05"    // Format 24-jam
    }
    
    // Kembalikan waktu yang diformat
    return t.Format(formatString)
}

func main() {
    timestamp := int64(1609459200) // 1 Januari 2021 00:00:00 UTC
    fmt.Println(convertUnixTimestamp(timestamp, false)) // Format 24-jam
    fmt.Println(convertUnixTimestamp(timestamp, true))  // Format 12-jam
}
// Penukaran timestamp Swift
import Foundation

func convertUnixTimestamp(_ timestamp: Int, use12Hour: Bool) -> String {
    // Buat Date dari timestamp Unix
    let date = Date(timeIntervalSince1970: TimeInterval(timestamp))
    
    // Buat DateFormatter
    let formatter = DateFormatter()
    formatter.dateStyle = .full
    
    // Tetapkan gaya masa berdasarkan pilihan 12-jam atau 24-jam
    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")
    }
    
    // Kembalikan tarikh yang diformat
    return formatter.string(from: date)
}

// Contoh penggunaan
let timestamp = 1609459200 // 1 Januari 2021 00:00:00 UTC
print(convertUnixTimestamp(timestamp, use12Hour: false)) // Format 24-jam
print(convertUnixTimestamp(timestamp, use12Hour: true))  // Format 12-jam
# Penukaran timestamp R
convert_unix_timestamp <- function(timestamp, use_12hour = FALSE) {
  # Tukar timestamp Unix kepada datetime POSIXct
  date_time <- as.POSIXct(timestamp, origin = "1970-01-01", tz = "UTC")
  
  # Format berdasarkan pilihan 12-jam atau 24-jam
  if (use_12hour) {
    format_string <- "%A, %B %d, %Y %I:%M:%S %p"  # Format 12-jam dengan AM/PM
  } else {
    format_string <- "%A, %B %d, %Y %H:%M:%S"     # Format 24-jam
  }
  
  # Kembalikan string tarikh yang diformat
  format(date_time, format_string)
}

# Contoh penggunaan
timestamp <- 1609459200  # 1 Januari 2021 00:00:00 UTC
cat(convert_unix_timestamp(timestamp, FALSE), "\n")  # Format 24-jam
cat(convert_unix_timestamp(timestamp, TRUE), "\n")   # Format 12-jam
% Penukaran timestamp MATLAB
function formattedDate = convertUnixTimestamp(timestamp, use12Hour)
    % Tukar timestamp Unix kepada datetime MATLAB
    % Tarikh Excel adalah hari sejak 1900-01-01, dengan 1 = 1900-01-01
    % Timestamp Unix adalah saat sejak 1970-01-01
    
    % Pertama tukar kepada format tarikh Excel
    % 25569 adalah bilangan hari antara 1900-01-01 dan 1970-01-01
    excelDate = (timestamp / 86400) + 25569;
    
    % Format berdasarkan pilihan 12-jam atau 24-jam
    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

% Contoh penggunaan
timestamp = 1609459200;  % 1 Januari 2021 00:00:00 UTC
disp(convertUnixTimestamp(timestamp, false))  % Format 24-jam
disp(convertUnixTimestamp(timestamp, true))   % Format 12-jam
' Penukaran timestamp Excel VBA
Function ConvertUnixTimestamp(timestamp As Long, Optional use12Hour As Boolean = False) As String
    ' Tukar timestamp Unix kepada tarikh/massa Excel
    ' Tarikh Excel adalah hari sejak 1900-01-01, dengan 1 = 1900-01-01
    ' Timestamp Unix adalah saat sejak 1970-01-01
    
    ' Pertama tukar kepada format tarikh Excel
    ' 25569 adalah bilangan hari antara 1900-01-01 dan 1970-01-01
    Dim excelDate As Double
    excelDate = (timestamp / 86400) + 25569
    
    ' Format tarikh berdasarkan pilihan 12-jam atau 24-jam
    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

' Penggunaan dalam lembaran kerja:
' =ConvertUnixTimestamp(1609459200, TRUE)  ' Format 12-jam
' =ConvertUnixTimestamp(1609459200, FALSE) ' Format 24-jam

Mengendalikan Kes Khas

Apabila bekerja dengan timestamp Unix, adalah penting untuk mengendalikan kes khas dengan betul. Berikut adalah contoh mengendalikan beberapa kes khas yang biasa:

// Pengendalian kes khas JavaScript
function safeConvertTimestamp(timestamp, use12Hour = false) {
  // Semak jika timestamp sah
  if (timestamp === undefined || timestamp === null || isNaN(timestamp)) {
    return "Timestamp tidak sah";
  }
  
  // Semak untuk timestamp negatif (tarikh sebelum 1970)
  if (timestamp < 0) {
    // Beberapa pelayar mungkin tidak mengendalikan timestamp negatif dengan betul
    // Gunakan pendekatan yang lebih kukuh untuk tarikh sebelum 1970
    const date = new Date(timestamp * 1000);
    if (isNaN(date.getTime())) {
      return "Tarikh tidak sah (sebelum 1970)";
    }
  }
  
  // Semak untuk masalah Y2K38 (untuk sistem 32-bit)
  const maxInt32 = 2147483647; // Nilai maksimum untuk integer bertanda 32-bit
  if (timestamp > maxInt32) {
    // Pertimbangkan untuk menggunakan BigInt untuk timestamp yang sangat besar dalam JavaScript moden
    console.warn("Timestamp melebihi had integer 32-bit (masalah Y2K38)");
  }
  
  // Teruskan dengan penukaran biasa
  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 "Ralat menukar timestamp: " + error.message;
  }
}

Rujukan

  1. "Masa Unix." Wikipedia, Yayasan Wikimedia, https://en.wikipedia.org/wiki/Unix_time

  2. "Masalah Tahun 2038." Wikipedia, Yayasan Wikimedia, https://en.wikipedia.org/wiki/Year_2038_problem

  3. Olson, Arthur David. "Kompleksiti Masa Kalendar." The Open Group, https://www.usenix.org/legacy/events/usenix01/full_papers/olson/olson.pdf

  4. "ISO 8601." Wikipedia, Yayasan Wikimedia, https://en.wikipedia.org/wiki/ISO_8601

  5. "RFC 3339: Tarikh dan Masa di Internet: Timestamp." Kumpulan Kejuruteraan Internet (IETF), https://tools.ietf.org/html/rfc3339

  6. Kernighan, Brian W., dan Dennis M. Ritchie. "Bahasa Pengaturcaraan C." Prentice Hall, 1988.

Feedback