Whiz Tools

ממיר חותמת זמן של יוניקס

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

תאריך ושעה מומרות

ממיר חותמת זמן של יוניקס

מבוא

חותמת זמן של יוניקס (המכונה גם זמן POSIX או זמן אפוק) היא מערכת לתיאור נקודת זמן. היא מספר השניות שחלפו מאז 1 בינואר 1970 (חצות UTC/GMT), מבלי לספור שניות מעוברות. חותמות זמן של יוניקס משמשות באופן נרחב במערכות מחשב ובשפות תכנות מכיוון שהן מספקות ייצוג קומפקטי, בלתי תלוי בשפה של רגע מסוים בזמן.

הממיר הזה מאפשר לך להמיר חותמת זמן של יוניקס לפורמט תאריך ושעה קריא לאדם. הוא תומך בשני פורמטים של זמן: 12 שעות (AM/PM) ו-24 שעות כדי להתאים להעדפות אזוריות ואישיות שונות.

כיצד פועלות חותמות זמן של יוניקס

חותמות זמן של יוניקס מחושבות כמספר השניות מאז אפוק יוניקס (1 בינואר 1970, 00:00:00 UTC). זה הופך אותן לשימושיות במיוחד לחישוב הבדלי זמן ולשמירת תאריכים בפורמט קומפקטי.

ההמרה המתמטית מחותמת זמן של יוניקס לתאריך קלנדרי כוללת מספר שלבים:

  1. להתחיל עם אפוק יוניקס (1 בינואר 1970, 00:00:00 UTC)
  2. להוסיף את מספר השניות בחותמת הזמן
  3. לקחת בחשבון שנים מעוברות, אורכי חודשים משתנים, וסיבוכים קלנדריים אחרים
  4. להחיל התאמות אזוריות אם יש צורך

למשל, חותמת הזמן של יוניקס 1609459200 מייצגת יום שישי, 1 בינואר 2021, 00:00:00 UTC.

הנוסחה להמרה יכולה להיות מבוטאת כ:

תאריך=אפוק יוניקס+חותמת זמן (בשניות)\text{תאריך} = \text{אפוק יוניקס} + \text{חותמת זמן (בשניות)}

רוב שפות התכנות ומערכות ההפעלה מספקות פונקציות מובנות לטיפול בהמרה זו, ומסתירות את החישובים הקלנדריים המורכבים.

אפשרויות פורמט זמן

הממיר הזה מציע שתי אפשרויות פורמט זמן:

  1. פורמט 24 שעות (המכונה לפעמים "זמן צבאי"): השעות נעות בין 0 ל-23, ואין סימון AM/PM. למשל, 15:00 מייצגת את השעה 3:00 PM.

  2. פורמט 12 שעות: השעות נעות בין 1 ל-12, עם AM (ante meridiem) לזמנים מחצות עד צהריים, ו-PM (post meridiem) לזמנים מצהריים ועד חצות. למשל, 15:00 בפורמט 24 שעות מייצגת את השעה 3:00 PM.

הבחירה בין הפורמטים הללו היא בעיקר עניין של מסורת אזורית והעדפה אישית:

  • פורמט 24 שעות בשימוש נפוץ ברוב אירופה, אמריקה הלטינית ואסיה, כמו גם בהקשרים מדעיים, צבאיים ורפואיים ברחבי העולם.
  • פורמט 12 שעות נפוץ בארצות הברית, קנדה, אוסטרליה ובכמה מדינות דוברות אנגלית אחרות לשימוש יומיומי.

מקרים קצה ומגבלות

כאשר עובדים עם חותמות זמן של יוניקס, חשוב להיות מודעים למספר מקרים קצה ומגבלות:

  1. חותמות זמן שליליות: מייצגות תאריכים לפני אפוק יוניקס (1 בינואר 1970). בעוד שהן תקפות מתמטית, חלק מהמערכות עשויות לא לטפל בחותמות זמן שליליות בצורה נכונה.

  2. בעיית שנת 2038: חותמות זמן של יוניקס נשמרות לעיתים קרובות כמספרים שלמים בני 32 סיביות, שיתמוטטו ב-19 בינואר 2038. לאחר תאריך זה, מערכות של 32 סיביות לא יוכלו לייצג זמנים בצורה נכונה אלא אם ישונו להשתמש בסוג מספר שלם גדול יותר.

  3. חותמות זמן גדולות מאוד: תאריכים עתידיים מאוד עשויים שלא להיות ניתנים לייצוג בכמה מערכות, או עשויים להיות מטופלים בצורה לא עקבית.

  4. שניות מעוברות: זמן יוניקס אינו לוקח בחשבון שניות מעוברות, המתווספות מדי פעם ל-UTC כדי לפצות על סיבוב לא סדיר של כדור הארץ. משמעות הדבר היא שזמן יוניקס אינו מסונכרן בדיוק עם הזמן האסטרונומי.

  5. שיקולים של אזור זמן: חותמות זמן של יוניקס מייצגות רגעים ב-UTC. המרה לזמן מקומי דורשת מידע נוסף על אזור הזמן.

  6. שעת חיסכון: כאשר ממירים חותמות זמן לזמן מקומי, יש לקחת בחשבון את המורכבויות של המעברים בשעת חיסכון.

שימושים

חותמות זמן של יוניקס משמשות במספר יישומים ברחבי המחשוב וניהול הנתונים:

  1. רשומות מסד נתונים: חותמות זמן משמשות לעיתים קרובות לרישום מתי נוצרו או שונו רשומות.

  2. פיתוח אתרים: כותרות HTTP, עוגיות ומנגנוני מטמון משתמשים לעיתים קרובות בחותמות זמן של יוניקס.

  3. קבצי יומן: יומני מערכת רושמים בדרך כלל אירועים עם חותמות זמן של יוניקס לצורך סדר כרונולוגי מדויק.

  4. מערכות ניהול גרסאות: Git ומערכות ניהול גרסאות אחרות משתמשות בחותמות זמן כדי לרשום מתי נעשו מחויבויות.

  5. תגובות API: רבים מה-APIs של האינטרנט כוללים חותמות זמן בתגובותיהם כדי לציין מתי נוצרו נתונים או מתי משאבים שונו לאחרונה.

  6. מערכות קבצים: זמני יצירה ושינוי של קבצים נשמרים לעיתים קרובות כחלק מחותמות זמן של יוניקס.

  7. ניהול מושבים: יישומי אינטרנט משתמשים בחותמות זמן כדי לקבוע מתי מושבי משתמשים צריכים לפוג.

  8. ניתוח נתונים: חותמות זמן מספקות דרך סטנדרטית לעבוד עם נתונים זמניים ביישומי ניתוח.

חלופות

בעוד שחלקות זמן של יוניקס בשימוש נרחב, ישנם פורמטים חלופיים לייצוג זמן שעשויים להיות מתאימים יותר בהקשרים מסוימים:

  1. ISO 8601: פורמט מחרוזת סטנדרטי (למשל, "2021-01-01T00:00:00Z") שהוא קריא לאדם תוך שמירה על יכולת מיון. הוא מועדף לעיתים קרובות להחלפת נתונים וליישומים המיועדים למשתמש.

  2. RFC 3339: פרופיל של ISO 8601 בשימוש בפרוטוקולי אינטרנט, עם דרישות עיצוב מחמירות יותר.

  3. פורמטים קריאים לאדם: מחרוזות תאריך מקומיות (למשל, "1 בינואר 2021") מתאימות יותר לאינטראקציה ישירה עם המשתמש, אך פחות מתאימות לחישוב.

  4. Microsoft FILETIME: ערך בן 64 סיביות המייצג את מספר האינטרוולים של 100 ננו-שניות מאז 1 בינואר 1601, בשימוש במערכות Windows.

  5. מספר יום יוליאני: בשימוש באסטרונומיה ובחלק מהיישומים המדעיים, סופר ימים מאז 1 בינואר 4713 לפני הספירה.

הבחירה של פורמט הזמן תלויה בגורמים כגון:

  • דיוק נדרש
  • צרכי קריאות אנושית
  • מגבלות אחסון
  • תאימות עם מערכות קיימות
  • טווח התאריכים שצריך להיות מיוצג

היסטוריה

הרעיון של זמן יוניקס נבע מהפיתוח של מערכת ההפעלה יוניקס במעבדות בל בשנות ה-60 וה-70. ההחלטה להשתמש ב-1 בינואר 1970 כאפוק הייתה במידה מסוימת שרירותית אך מעשית באותה תקופה - היא הייתה קרובה מספיק כדי למזער את דרישות האחסון עבור תאריכים של עניין אך רחוקה מספיק מהעבר כדי להיות שימושית עבור נתונים היסטוריים.

היישום המקורי השתמש במספר שלם בן 32 סיביות כדי לשמור את מספר השניות, מה שהיה מספק עבור אורך החיים הצפוי של מערכות יוניקס באותה תקופה. עם זאת, החלטה זו הובילה לבעיית שנת 2038 (המכונה לעיתים "Y2K38" או "באג המילניום של יוניקס"), מכיוון שמספרים שלמים בני 32 סיביות יכולים לייצג רק תאריכים עד 19 בינואר 2038 (03:14:07 UTC).

כשהיוניקס ומערכות דומות ליוניקס הפכו פופולריות, חותמת הזמן של יוניקס הפכה לסטנדרט דה פקטו לייצוג זמן במחשוב. היא אומצה על ידי שפות תכנות רבות, מסדי נתונים ויישומים, והתרחבה הרבה מעבר לסביבת יוניקס המקורית.

מערכות מודרניות משתמשות יותר ויותר במספרים שלמים בני 64 סיביות עבור חותמות זמן, מה שמאריך את טווח הייצוג לכ-292 מיליארד שנים בכל הכיוונים מהאפוק, ובכך פותר את בעיית שנת 2038. עם זאת, מערכות ויישומים ישנים עשויים עדיין להיות פגיעים.

הפשטות והיכולת של חותמת הזמן של יוניקס הבטיחו את המשך הרלוונטיות שלה למרות הפיתוח של פורמטים יותר מתקדמים לייצוג זמן. היא נשארה מושג בסיסי במחשוב, המהווה בסיס למרבית התשתית הדיגיטלית שלנו.

דוגמאות קוד

הנה דוגמאות כיצד להמיר חותמות זמן של יוניקס לתאריכים קריאים לאדם בשפות תכנות שונות:

// המרת חותמת זמן ב-JavaScript
function convertUnixTimestamp(timestamp, use12Hour = false) {
  // צור אובייקט תאריך חדש (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; // 1 בינואר 2021 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):
    # המרת חותמת זמן של יוניקס לאובייקט 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  # 1 בינואר 2021 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; // 1 בינואר 2021 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) {
        // המרת חותמת זמן של יוניקס ל- 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; // 1 בינואר 2021 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)
    {
        // המרת חותמת זמן של יוניקס ל-DateTime
        // חותמת זמן של יוניקס היא שניות מאז 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; // 1 בינואר 2021 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)
  # המרת חותמת זמן של יוניקס לאובייקט זמן
  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  # 1 בינואר 2021 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 {
    // המרת חותמת זמן של יוניקס ל-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) // 1 בינואר 2021 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 {
    // צור תאריך מחותמת זמן של יוניקס
    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 // 1 בינואר 2021 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) {
  # המרת חותמת זמן של יוניקס ל-POSIXct datetime
  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  # 1 בינואר 2021 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)
    % המרת חותמת זמן של יוניקס ל-datetime MATLAB
    % תאריכי MATLAB הם ימים מאז 1900-01-01, כאשר 1 = 1900-01-01
    % חותמות זמן של יוניקס הן שניות מאז 1970-01-01
    
    % ראשית המרה לפורמט תאריך של MATLAB
    % 25569 הוא מספר הימים בין 1900-01-01 ל-1970-01-01
    excelDate = (timestamp / 86400) + 25569;
    
    % עיצוב התאריך בהתאם להעדפה של 12 שעות או 24 שעות
    if use12Hour
        formattedDate = datestr(excelDate, 'dddd, mmmm dd, yyyy h:mm:ss AM/PM');
    else
        formattedDate = datestr(excelDate, 'dddd, mmmm dd, yyyy hh:mm:ss');
    end
end

% דוגמת שימוש
timestamp = 1609459200;  % 1 בינואר 2021 00:00:00 UTC
disp(convertUnixTimestamp(timestamp, false))  % פורמט 24 שעות
disp(convertUnixTimestamp(timestamp, true))   % פורמט 12 שעות
' המרת חותמת זמן ב-VBA של Excel
Function ConvertUnixTimestamp(timestamp As Long, Optional use12Hour As Boolean = False) As String
    ' המרת חותמת זמן של יוניקס לתאריך/שעה של Excel
    ' חותמות זמן של Excel הן ימים מאז 1900-01-01, כאשר 1 = 1900-01-01
    ' חותמות זמן של יוניקס הן שניות מאז 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 שעות

טיפול במקרים קצה

כאשר עובדים עם חותמות זמן של יוניקס, חשוב לטפל במקרים קצה בצורה נכונה. הנה דוגמאות לטיפול בכמה מקרים קצה נפוצים:

// טיפול במקרים קצה ב-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) {
    // שקול להשתמש ב-BigInt עבור חותמות זמן גדולות מאוד ב-JavaScript מודרני
    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. "זמן יוניקס." ויקיפדיה, קרן ויקימדיה, https://he.wikipedia.org/wiki/Unix_time

  2. "בעיית שנת 2038." ויקיפדיה, קרן ויקימדיה, https://he.wikipedia.org/wiki/Year_2038_problem

  3. אולסון, ארתור דיויד. "המורכבות של זמן קלנדרי." הקבוצה הפתוחה, https://www.usenix.org/legacy/events/usenix01/full_papers/olson/olson.pdf

  4. "ISO 8601." ויקיפדיה, קרן ויקימדיה, https://he.wikipedia.org/wiki/ISO_8601

  5. "RFC 3339: תאריך ושעה באינטרנט: חותמות זמן." קבוצת מהנדסי האינטרנט (IETF), https://tools.ietf.org/html/rfc3339

  6. קרניגן, בריאן וו., ודניס מ. ריצ'י. "שפת התכנות C." פרנטיס הול, 1988.

Feedback