Whiz Tools

Unix タイムスタンプコンバータ

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

変換された日付と時刻

Unix タイムスタンプコンバーター

はじめに

Unix タイムスタンプ(POSIX 時間またはエポック時間とも呼ばれます)は、時点を記述するためのシステムです。これは、1970年1月1日(真夜中 UTC/GMT)から経過した秒数です。うるう秒は考慮されません。Unix タイムスタンプは、特定の瞬間をコンパクトで言語に依存しない形式で表現するため、コンピュータシステムやプログラミング言語で広く使用されています。

このコンバーターを使用すると、Unix タイムスタンプを人間が読みやすい日付と時刻の形式に変換できます。12 時間(AM/PM)形式と 24 時間形式の両方をサポートしており、地域や個人の好みに応じた形式を選択できます。

Unix タイムスタンプの仕組み

Unix タイムスタンプは、Unix エポック(1970年1月1日、00:00:00 UTC)からの秒数として計算されます。これにより、時間の差を計算したり、コンパクトな形式で日付を保存したりするのに特に便利です。

Unix タイムスタンプからカレンダー日付への数学的な変換は、いくつかのステップを含みます。

  1. Unix エポック(1970年1月1日、00:00:00 UTC)から始めます。
  2. タイムスタンプの秒数を加えます。
  3. うるう年、月の長さの変動、その他のカレンダーの複雑さを考慮します。
  4. 必要に応じてタイムゾーンの調整を行います。

例えば、Unix タイムスタンプ 1609459200 は、2021年1月1日金曜日、00:00:00 UTC を表します。

変換の公式は次のように表現できます。

日付=Unix エポック+タイムスタンプ(秒単位)\text{日付} = \text{Unix エポック} + \text{タイムスタンプ(秒単位)}

ほとんどのプログラミング言語やオペレーティングシステムは、この変換を処理するための組み込み関数を提供しており、複雑なカレンダー計算を抽象化しています。

時間形式のオプション

このコンバーターは、2つの時間形式オプションを提供します。

  1. 24 時間形式(「軍事時間」とも呼ばれます):時間は 0 から 23 の範囲で、AM/PM の指定はありません。例えば、午後 3 時は 15:00 と表されます。

  2. 12 時間形式:時間は 1 から 12 の範囲で、午前中は AM(ante meridiem)、午後は PM(post meridiem)で表されます。例えば、24 時間形式の 15:00 は午後 3 時として表されます。

これらの形式の選択は、主に地域の慣習や個人の好みに依存します。

  • 24 時間形式は、ほとんどのヨーロッパ、ラテンアメリカ、アジア、ならびに科学、軍事、医療の文脈で世界中で一般的に使用されています。
  • 12 時間形式は、アメリカ、カナダ、オーストラリア、その他の英語圏の国々で日常的に使用されています。

エッジケースと制限

Unix タイムスタンプを扱う際には、いくつかのエッジケースや制限に注意することが重要です。

  1. 負のタイムスタンプ:これらは Unix エポック(1970年1月1日)以前の日付を表します。数学的には有効ですが、一部のシステムでは負のタイムスタンプを正しく処理できない場合があります。

  2. 2038年問題:Unix タイムスタンプは、しばしば 32 ビット符号付き整数として保存され、2038年1月19日にオーバーフローします。この時点以降、32 ビットシステムは正しく時間を表現できなくなります。

  3. 非常に大きなタイムスタンプ:非常に遠い未来の日付は、一部のシステムでは表現できない場合があるか、または一貫性のない方法で処理されることがあります。

  4. うるう秒:Unix 時間は、地球の不規則な回転を補うために UTC に追加されることがあるうるう秒を考慮していません。これにより、Unix 時間は天文時間と正確に同期していません。

  5. タイムゾーンの考慮:Unix タイムスタンプは、UTC の瞬間を表します。ローカル時間に変換するには、追加のタイムゾーン情報が必要です。

  6. 夏時間:タイムスタンプをローカル時間に変換する際には、夏時間の移行の複雑さを考慮する必要があります。

使用例

Unix タイムスタンプは、コンピュータおよびデータ管理のさまざまなアプリケーションで使用されています。

  1. データベースレコード:タイムスタンプは、エントリが作成または変更された日時を記録するために一般的に使用されます。

  2. ウェブ開発:HTTP ヘッダー、クッキー、キャッシングメカニズムは、しばしば Unix タイムスタンプを使用します。

  3. ログファイル:システムログは、通常、イベントを正確に時系列で記録するために Unix タイムスタンプを使用します。

  4. バージョン管理システム:Git やその他の VCS は、コミットが行われた日時を記録するためにタイムスタンプを使用します。

  5. API レスポンス:多くのウェブ API は、データが生成された日時やリソースが最後に変更された日時を示すためにタイムスタンプを含めます。

  6. ファイルシステム:ファイルの作成および変更時刻は、通常 Unix タイムスタンプとして保存されます。

  7. セッション管理:ウェブアプリケーションは、ユーザーセッションがいつ期限切れになるべきかを判断するためにタイムスタンプを使用します。

  8. データ分析:タイムスタンプは、分析アプリケーションでの時間データを扱うための標準化された方法を提供します。

代替手段

Unix タイムスタンプは広く使用されていますが、特定のコンテキストではより適切な時間表現形式が存在します。

  1. ISO 8601:標準化された文字列形式(例: "2021-01-01T00:00:00Z")で、人間が読みやすく、並べ替え可能です。データのやり取りやユーザー向けアプリケーションにおいて好まれることが多いです。

  2. RFC 3339:インターネットプロトコルで使用される ISO 8601 のプロファイルで、厳密なフォーマット要件があります。

  3. 人間が読みやすい形式:ローカライズされた日付文字列(例: "2021年1月1日")は、直接的なユーザーインタラクションにはより適していますが、計算にはあまり適していません。

  4. Microsoft FILETIME:Windows システムで使用される、1601年1月1日からの 100 ナノ秒間隔の 64 ビット値です。

  5. ユリウス日数:天文学や一部の科学アプリケーションで使用され、紀元前4713年1月1日からの日数をカウントします。

時間形式の選択は、次のような要因によって異なります:

  • 必要な精度
  • 人間の可読性のニーズ
  • ストレージ制約
  • 既存システムとの互換性
  • 表現する必要がある日付の範囲

歴史

Unix 時間の概念は、1960年代後半から1970年代初頭にかけて、ベル研究所で Unix オペレーティングシステムの開発とともに生まれました。エポックとして1970年1月1日を使用することに決定したのは、やや任意でしたが、当時の実用的な選択でした。関心のある日付のストレージ要件を最小限に抑えるためには最近のものであり、歴史的データにとっては十分に過去のものでした。

元の実装では、経過した秒数を保存するために 32 ビット符号付き整数が使用されており、当時の Unix システムの予想される寿命には十分でした。しかし、この決定は2038年問題(時に「Y2K38」や「Unix ミレニアムバグ」と呼ばれる)につながりました。32 ビット符号付き整数は、1970年1月1日からの秒数を表現できる最大値を持ち、2038年1月19日(03:14:07 UTC)までしか表現できません。

Unix および Unix 系のオペレーティングシステムが人気を博するにつれて、Unix タイムスタンプはコンピューティングにおける事実上の標準となりました。これは、数多くのプログラミング言語、データベース、アプリケーションに採用され、元の Unix 環境を超えて広がりました。

現代のシステムでは、タイムスタンプに 64 ビット整数を使用することが増えており、エポックから約 292 億年の範囲を表現できるようになり、2038年問題を効果的に解決しています。しかし、レガシーシステムやアプリケーションは依然として脆弱な場合があります。

Unix タイムスタンプのシンプルさと有用性は、より洗練された時間表現形式の開発にもかかわらず、その関連性を維持しています。デジタルインフラストラクチャの多くを支える基本的な概念として残っています。

コード例

以下は、さまざまなプログラミング言語で Unix タイムスタンプを人間が読みやすい日付に変換する方法の例です。

// JavaScript タイムスタンプ変換
function convertUnixTimestamp(timestamp, use12Hour = false) {
  // 新しい Date オブジェクトを作成(JavaScript はミリ秒を使用)
  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);
}

// 使用例
const timestamp = 1609459200; // 2021年1月1日 00:00:00 UTC
console.log(convertUnixTimestamp(timestamp, false)); // 24 時間形式
console.log(convertUnixTimestamp(timestamp, true));  // 12 時間形式
# Python タイムスタンプ変換
import datetime

def convert_unix_timestamp(timestamp, use_12hour=False):
    # Unix タイムスタンプを datetime オブジェクトに変換
    date = datetime.datetime.fromtimestamp(timestamp)
    
    # 日付文字列のフォーマット
    if use_12hour:
        format_string = "%A, %B %d, %Y %I:%M:%S %p"  # 12 時間形式(AM/PM)
    else:
        format_string = "%A, %B %d, %Y %H:%M:%S"     # 24 時間形式
    
    return date.strftime(format_string)

# 使用例
timestamp = 1609459200  # 2021年1月1日 00:00:00 UTC
print(convert_unix_timestamp(timestamp, False))  # 24 時間形式
print(convert_unix_timestamp(timestamp, True))   # 12 時間形式
<?php
// PHP タイムスタンプ変換
function convertUnixTimestamp($timestamp, $use12Hour = false) {
    // フォーマット文字列
    $formatString = $use12Hour 
        ? 'l, F j, Y g:i:s A'  // 12 時間形式(AM/PM)
        : 'l, F j, Y H:i:s';   // 24 時間形式
    
    // 日付を変換してフォーマット
    return date($formatString, $timestamp);
}

// 使用例
$timestamp = 1609459200; // 2021年1月1日 00:00:00 UTC
echo convertUnixTimestamp($timestamp, false) . "\n"; // 24 時間形式
echo convertUnixTimestamp($timestamp, true) . "\n";  // 12 時間形式
?>
// 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) {
        // Unix タイムスタンプを Instant に変換し、次に LocalDateTime に変換
        Instant instant = Instant.ofEpochSecond(timestamp);
        LocalDateTime dateTime = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
        
        // 必要に応じてフォーマッタを作成
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(
            use12Hour ? "EEEE, MMMM d, yyyy h:mm:ss a" : "EEEE, MMMM d, yyyy HH:mm:ss"
        );
        
        // 日付をフォーマット
        return dateTime.format(formatter);
    }
    
    public static void main(String[] args) {
        long timestamp = 1609459200; // 2021年1月1日 00:00:00 UTC
        System.out.println(convertUnixTimestamp(timestamp, false)); // 24 時間形式
        System.out.println(convertUnixTimestamp(timestamp, true));  // 12 時間形式
    }
}
// C# タイムスタンプ変換
using System;

class UnixTimestampConverter
{
    public static string ConvertUnixTimestamp(long timestamp, bool use12Hour)
    {
        // Unix タイムスタンプを DateTime に変換
        // Unix タイムスタンプは 1970-01-01 からの秒数
        DateTime dateTime = DateTimeOffset.FromUnixTimeSeconds(timestamp).DateTime;
        
        // 12 時間形式または 24 時間形式に基づいてフォーマット文字列を設定
        string formatString = use12Hour 
            ? "dddd, MMMM d, yyyy h:mm:ss tt"  // 12 時間形式(AM/PM)
            : "dddd, MMMM d, yyyy HH:mm:ss";   // 24 時間形式
        
        // フォーマットされた日付文字列を返す
        return dateTime.ToString(formatString);
    }
    
    static void Main()
    {
        long timestamp = 1609459200; // 2021年1月1日 00:00:00 UTC
        Console.WriteLine(ConvertUnixTimestamp(timestamp, false)); // 24 時間形式
        Console.WriteLine(ConvertUnixTimestamp(timestamp, true));  // 12 時間形式
    }
}
# Ruby タイムスタンプ変換
require 'time'

def convert_unix_timestamp(timestamp, use_12hour = false)
  # Unix タイムスタンプを Time オブジェクトに変換
  time = Time.at(timestamp)
  
  # 12 時間形式または 24 時間形式に基づいてフォーマット
  if use_12hour
    time.strftime("%A, %B %d, %Y %I:%M:%S %p")  # 12 時間形式(AM/PM)
  else
    time.strftime("%A, %B %d, %Y %H:%M:%S")     # 24 時間形式
  end
end

# 使用例
timestamp = 1609459200  # 2021年1月1日 00:00:00 UTC
puts convert_unix_timestamp(timestamp, false)  # 24 時間形式
puts convert_unix_timestamp(timestamp, true)   # 12 時間形式
// Go タイムスタンプ変換
package main

import (
    "fmt"
    "time"
)

func convertUnixTimestamp(timestamp int64, use12Hour bool) string {
    // Unix タイムスタンプを Time に変換
    t := time.Unix(timestamp, 0)
    
    // 12 時間形式または 24 時間形式に基づいてフォーマット文字列を設定
    formatString := "Monday, January 2, 2006 "
    if use12Hour {
        formatString += "3:04:05 PM"  // 12 時間形式(AM/PM)
    } else {
        formatString += "15:04:05"    // 24 時間形式
    }
    
    // フォーマットされた時間を返す
    return t.Format(formatString)
}

func main() {
    timestamp := int64(1609459200) // 2021年1月1日 00:00:00 UTC
    fmt.Println(convertUnixTimestamp(timestamp, false)) // 24 時間形式
    fmt.Println(convertUnixTimestamp(timestamp, true))  // 12 時間形式
}
// Swift タイムスタンプ変換
import Foundation

func convertUnixTimestamp(_ timestamp: Int, use12Hour: Bool) -> String {
    // Unix タイムスタンプから Date を作成
    let date = Date(timeIntervalSince1970: TimeInterval(timestamp))
    
    // DateFormatter を作成
    let formatter = DateFormatter()
    formatter.dateStyle = .full
    
    // 12 時間形式または 24 時間形式に基づいて時間スタイルを設定
    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")
    }
    
    // フォーマットされた日付を返す
    return formatter.string(from: date)
}

// 使用例
let timestamp = 1609459200 // 2021年1月1日 00:00:00 UTC
print(convertUnixTimestamp(timestamp, use12Hour: false)) // 24 時間形式
print(convertUnixTimestamp(timestamp, use12Hour: true))  // 12 時間形式
# R タイムスタンプ変換
convert_unix_timestamp <- function(timestamp, use_12hour = FALSE) {
  # Unix タイムスタンプを POSIXct 日時に変換
  date_time <- as.POSIXct(timestamp, origin = "1970-01-01", tz = "UTC")
  
  # 12 時間形式または 24 時間形式に基づいてフォーマット
  if (use_12hour) {
    format_string <- "%A, %B %d, %Y %I:%M:%S %p"  # 12 時間形式(AM/PM)
  } else {
    format_string <- "%A, %B %d, %Y %H:%M:%S"     # 24 時間形式
  }
  
  # フォーマットされた日付文字列を返す
  format(date_time, format_string)
}

# 使用例
timestamp <- 1609459200  # 2021年1月1日 00:00:00 UTC
cat(convert_unix_timestamp(timestamp, FALSE), "\n")  # 24 時間形式
cat(convert_unix_timestamp(timestamp, TRUE), "\n")   # 12 時間形式
% MATLAB タイムスタンプ変換
function formattedDate = convertUnixTimestamp(timestamp, use12Hour)
    % Unix タイムスタンプを MATLAB datetime に変換
    % MATLAB の日付は 1900-01-01 からの日数で、1 = 1900-01-01
    % Unix タイムスタンプは 1970-01-01 からの秒数
    
    % まず Excel 日付形式に変換
    % 25569 は 1900-01-01 と 1970-01-01 の間の日数です
    excelDate = (timestamp / 86400) + 25569;
    
    % 12 時間形式または 24 時間形式に基づいてフォーマット
    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

% 使用例
timestamp = 1609459200;  % 2021年1月1日 00:00:00 UTC
disp(convertUnixTimestamp(timestamp, false))  % 24 時間形式
disp(convertUnixTimestamp(timestamp, true))   % 12 時間形式
' Excel VBA タイムスタンプ変換
Function ConvertUnixTimestamp(timestamp As Long, Optional use12Hour As Boolean = False) As String
    ' Unix タイムスタンプを Excel 日付/時刻に変換
    ' Excel の日付は 1900-01-01 からの日数で、1 = 1900-01-01
    ' Unix タイムスタンプは 1970-01-01 からの秒数
    
    ' まず Excel 日付形式に変換
    ' 25569 は 1900-01-01 と 1970-01-01 の間の日数です
    Dim excelDate As Double
    excelDate = (timestamp / 86400) + 25569
    
    ' 12 時間形式または 24 時間形式に基づいてフォーマット
    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

' ワークシートでの使用:
' =ConvertUnixTimestamp(1609459200, TRUE)  ' 12 時間形式
' =ConvertUnixTimestamp(1609459200, FALSE) ' 24 時間形式

エッジケースの処理

Unix タイムスタンプを扱う際には、エッジケースを正しく処理することが重要です。以下は、一般的なエッジケースの処理例です。

// JavaScript エッジケース処理
function safeConvertTimestamp(timestamp, use12Hour = false) {
  // タイムスタンプが有効かどうかをチェック
  if (timestamp === undefined || timestamp === null || isNaN(timestamp)) {
    return "無効なタイムスタンプ";
  }
  
  // 負のタイムスタンプ(1970年以前の日付)をチェック
  if (timestamp < 0) {
    // 一部のブラウザは負のタイムスタンプを正しく処理できない場合があります
    // 1970年以前の日付をより堅牢な方法で処理します
    const date = new Date(timestamp * 1000);
    if (isNaN(date.getTime())) {
      return "無効な日付(1970年以前)";
    }
  }
  
  // Y2K38 問題をチェック(32 ビットシステムの場合)
  const maxInt32 = 2147483647; // 32 ビット符号付き整数の最大値
  if (timestamp > maxInt32) {
    // 最新の JavaScript では非常に大きなタイムスタンプに BigInt を使用することを検討します
    console.warn("タイムスタンプが 32 ビット整数の制限を超えています(Y2K38 問題)");
  }
  
  // 通常の変換を進める
  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 "タイムスタンプの変換中にエラーが発生しました: " + error.message;
  }
}

参考文献

  1. "Unix Time." Wikipedia, Wikimedia Foundation, https://en.wikipedia.org/wiki/Unix_time

  2. "Year 2038 Problem." Wikipedia, Wikimedia Foundation, https://en.wikipedia.org/wiki/Year_2038_problem

  3. Olson, Arthur David. "The Complexities of Calendrical Time." The Open Group, https://www.usenix.org/legacy/events/usenix01/full_papers/olson/olson.pdf

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

  5. "RFC 3339: Date and Time on the Internet: Timestamps." Internet Engineering Task Force (IETF), https://tools.ietf.org/html/rfc3339

  6. Kernighan, Brian W., and Dennis M. Ritchie. "The C Programming Language." Prentice Hall, 1988.

Feedback