Unix時間とは何ですか?Unixエポックはいつでしたか?

Unixに独自の時間の概念があるのはなぜですか?エポックとは何ですか?Y2038問題は何ですか?

Unix時間は、Linux、macOS、および他の多くの相互運用可能なシステムで使用される特定の日付と時刻を表す手段です。それは非常に普及しているので、おそらくあなたはそれを意識せずにそれを使用しています。ただし、Unix時間を理解すると、多くの状況でそれを見つけることができます。いくつかのツールは、Unix時間での作業に役立ちます。

Unix時間の目的は何ですか?

Unix時間は、固定された日時からの合計秒数です。これは、人間が読み取れる日付と時刻とは異なって見える日付/時刻(またはタイムスタンプ)形式です。これは純粋に効率上の理由によるものです。年、月、時間などの個別の値を格納するよりも、秒を表す単一の数値を格納する方がはるかに少ないスペースで済みます。

もちろん、現代的には、スペースの違いはそれほど大きくありません。しかし、Unixは、利用可能なストレージがはるかに小さかった1960年代後半に始まったと考えてください。タイムスタンプも頻繁に使用されるため、それらのストレージは合計されます。たとえば、すべてのファイルには3つのタイムスタンプが関連付けられています。

あなたが数学の天才でない限り、フォーマットを頭の中で翻訳することはほとんど不可能です。ただし、2015年10月21日水曜日07:28:00 GMTなど、より読みやすい代替手段に比べて、まだいくつかの利点があります。一目で、2つのUnixタイムスタンプを非常に簡単に注文できます。また、通常、2つのタイムスタンプの違いを計算する方が高速です。これは、隣接する日など、互いに近い日付に特に当てはまります。

エポックについて

したがって、Unix時間は、特定の時点からの合計秒数です。しかし、その時点は何ですか? 1970年1月1日UTC00:00:00です。これは、Unixエポックと呼ばれることがよくあります。プログラマーは、Unix時間を発明したときに最も近いラウンド日付であったため、便宜上この日付を選択しました。

何かがうまくいかなかったときに、この日付を見たことがあるかもしれません。明らかにバグですが、私たちの多くが生まれる前の日付になると非常に奇妙に見えます!ただし、Unix時間について知っていれば、それは完全に理解できます。システムが値を持たないタイムスタンプを表示しようとすると、多くの場合0に変換され、正確なエポック日付になります。

Unix時間データ形式

厳密に言えば、1つはありません。元のデータ型は32ビット整数でしたが、はるかに強力なシステムであっても、これが当てはまることがよくあります。

このデータ型を使用すると、値に合計2 ^ 32秒を格納できます。これは、136年強です。この値は通常、符号付きです。つまり、負または正の値になります。したがって、それは通常、エポックの両側、つまり1902-2038で68年を表します。

もちろん、これはまだ限られた期間です。ただし、タイムスタンプ形式の主な用途は、ファイルの変更などの概念でした。古代の歴史や遠い未来ではなく、現在に近い時間を表す必要がありました。カレンダーなどのアプリケーションの場合でも、数十年以上先の日付を表す必要はめったにありません。

しかし、それはこの限られた期間に問題がないという意味ではありません…

2038年問題

Y2Kバグ(歴史上最悪のプログラミングミスの1つ)は、年を2桁の値として保存するコンピューターシステムに影響を及ぼしました。 2000年になると、そのようなシステムは1900年のように扱いました。この場合、多くの人が事前に多くの時間と労力を費やして準備したため、これは恐れられたほど壊滅的なものではありませんでした。

前のセクションで注意を払っていた場合は、Unix時間に影響を与える可能性のある同様の問題を発見した可能性があります。ええと、Unix時間にはそれ自身のデータ問題があります:Y2k38問題。 (これはバグではなく問題と呼ばれることがよくあります。2000年以降、楽観的になっているかもしれません!)2038年にUnix時間が文字通りなくなると、システムは新しい日付を1902または1970として扱います。完全に失敗するだけです。

少なくとも、この問題は大晦日の真夜中のストロークで私たちを襲うことはありません。 32ビットUnix時間の最後の秒は、3月19日になります。最終的には、2038年までにほとんどのシステムをアップグレードするか、とにかくそれまでに廃止される可能性があります。

いくつかの便利なタイムスタンプリソース

エポックコンバーターサイトは、おそらく最も包括的なタイムスタンプコンバーターです。まず、現在のUnix時間をリアルタイムで表示し、その上に考えられるほぼすべての機能を追加します。その主な用途は、タイムスタンプと人間が読める日付を両方向に変換することです。

Dan's Toolsは、便利なWebアプリの膨大なコレクションであり、その1つがタイムスタンプコンバーターです。それはより基本的ですが、非常にきれいなプレゼンテーションを持ち、使いやすいです。

Time.isは、さらにミニマルな外観を提供します。 Unix時間を含む、さまざまな形式で時間を表示します。ページタイトルに現在の時刻が含まれているので便利です。

コマンドラインツールでのUnixTimeの使用

LinuxおよびmacOSでは、日付プログラムは、Unixタイムスタンプを含む日付/時刻を処理するためのコアユーティリティです。引数なしで呼び出されると、現在の日付/時刻が人間が読める形式で返されます。

 $ date
Wed Feb 10 12:28:30 GMT 2021

Unix時間の現在の日付/時刻が必要な場合は、 +%s引数を使用します。

 $ date +%s
1612960114

日付のバージョンでサポートされている場合は、 -dフラグを使用して、人間が読める形式の日付からタイムスタンプに変換できます。ほとんどのLinuxバージョンは、デフォルトで次のようになります。

 $ date -d "Jan 2 1970" +%s
82800

macOSでは、 dateは別のプログラムであり、別のフラグのセットが必要です。

 $ date -j -f "%b %d %Y %T" "Jan 02 1970 00:00:00" "+%s"
82800

反対方向に進むと、 -rフラグを使用してUnixタイムスタンプから変換できます。

 $ date -r 1600000000
Sun 13 Sep 2020 13:26:40 BST

他のいくつかのプログラムは、 %s形式を使用してUnix時間を処理します。たとえば、 Linuxバージョンのlsでファイルの変更日をUnix時間で表示する場合は、次を使用できます。

 $ ls -l --time-style=+%s index.tmp.html
-rw-r--r-- 1 ubuntu ubuntu 17862 1521649818 index.tmp.html

プログラミング言語でUnix時間を使用する方法

PHPには、現在のUnixタイムスタンプを返すtime()関数があります。そのdate()関数は、2番目の引数としてタイムスタンプを取ります。

 $ php -r 'echo date("Ymd", time());'
2021-02-11

JavaScriptは興味深い方法で物事にアプローチします。 Unixエポックからのミリ秒数を取得するDate.now()メソッドがあります。もちろん、これを1,000で割り、結果を四捨五入して、同等のUnix時間を秒単位で求めることができます。

 > Math.floor(Date.now() / 1000)
1613083012

Unix時間を理解する

Unix時間は、多くの場所で発生する単純な概念です。一度理解すれば、たとえば時差を計算するときに非常に役立つことがあります。また、特定のバグの原因である可能性がある場合も認識できます。

エポックやタイムスタンプなどの概念は、Linuxを使い始める上で重要な部分です。 lsなどの重要事項の詳細については、基本的なLinuxコマンドのガイドをご覧ください。