timespec

Unix time

[23] Unix time は、 Unix 系システムを中心に多くの計算機システムで用いられている日時の内部表現形式 (整数時刻系) です。 計算機システム用の時刻系としては最も著名なものです。

意味

[25] Unix time は、 元期 (Unix epochThe Epoch) から経過した単位の時間として表したものです。

[7] の値 (1969年以前) は、環境や文脈によっては扱えないことがあります。 最近は多くの環境がの値も扱えるようになっているようです。

特殊値

[72] mktimetime は算出不能時に値 -1 を返します。

[70] を扱う必要がない場合に、値 0 が「日時指定なし」など特別な意味を割り当てられることがあります。

秒未満

[37] time_t整数とするのが普通ですが、 それ以外では拡張して秒未満も含めた小数のUnix time を使うことがよくあります。

閏秒

[15] 閏秒は考えません。 閏秒のない時刻系

[67] POSIX は1数を固定長としつつ、 実際の時刻との対応は未定義実装定義とし >>10閏秒の処置は曖昧にしています。 実装leap smear などにより閏秒が存在しないものとして扱っています。

[38] tm閏秒を表現できることになっていますが、 Unix time で表現できないため有名無実となっています。

[69] right/ のような Unix システムで閏秒を扱う試みもありましたが、 Unix time との整合性を維持できず失敗しました。

時間帯

[83] Unix timeUTC での Unix epoch からの経過時間を表しています。

[84] どこのどんな地方時 (標準時サマータイム) を使っていて、それが UTC どどれだけの時差があるのであっても、 その時差情報Unix time に含めることはできません。 Unix time はどの瞬間であるかだけを表します。

[86] 時差に意味がある場合は、 Unix time とは別の方法で保持しなければなりません。

各言語・プロトコルの Unix time

C と POSIX

[6] C言語データ型 (typedef) time_t を有しています >>65ISO C はその値の精度や値域を定めていません >>65 が、 現在では実質すべての実装が POSIX の定める Epoch すなわち >>18 からの経過数 (Seconds Since the Epoch) >>10整数としています。 1970年未満については未定義としています >>10。 伝統的には32ビット符号なし整数でしたが、 2038年問題があり64ビット符号なし整数への移行が進んでいます >>66

[68] C言語は更に構造体 timespec を定めています。 timespec非負time_t の値を持つ tv_sec と、 [ 0, 999999999 ] の long 値を持つ tv_nsec の組で構成されます。ナノ秒精度の時刻の表現に使われます。 >>65

これらを使う他の関数は time.t


[11] Perlにおける日時プラットフォーム依存ですが、 ほとんどすべての場合 Unix time です。 場合によって小数Unix time も使われます。 Perlにおける日時

[71] RubyTimeUnix time を使っています。値域プラットフォーム依存です。 Time

gzip

[55] gzipMTIME は、 Unix time小エンディアンの 4バイト符号無し整数で表したものです。

[56] ただし、0タイムスタンプなしを表します。

ext ファイルシステムのタイムスタンプ

extの日時形式

PGP の時刻

[5] RFC 4880 - OpenPGP Message Format ( 版) https://tools.ietf.org/html/rfc4880#section-3.5

A time field is an unsigned four-octet number containing the number of seconds elapsed since midnight, 1 January 1970 UTC.

DKIM の時刻

[13] RFC 4871 が定義する DKIM-Signature: 頭欄t= タグの値は、 1970年1月1日0時0分0秒 (UTC) からの数とされています。 ただし、閏秒は数えません。 RFC 4871 は、 実装に対して最低 1012 (≒ 紀元後20万年、≒ 40ビット符号無し整数) までの値を扱えることを推奨 (SHOULD) しています。 更に、サービス拒否攻撃防止のために、 12桁以上の値は無限大とみなして構わない (MAY) ともしています。

SQL

[31] SQL では時間帯を持たない日時データ型が使われることも多いですが、 その場合でも Unix time が使われることがあります。ここでの Unix time は、本来の からの秒数ではなく、 地方時からの秒数とされています。

[20] MySQL では、 UNIX_TIMESTAMP日時Unix time に、 FROM_UNIXTIMEUnix time日時に変換できます。

OAuth の時刻

[2] oauth_timestampUnix time 同等の定義となっています。

OpenID の時刻

[3] Final: OpenID Connect Core 1.0 incorporating errata set 1 ( 版) http://openid.net/specs/openid-connect-core-1_0.html#rfc.section.2

Its value is a JSON number representing the number of seconds from 1970-01-01T0:0:0Z as measured in UTC until the date/time.

CDNI の時刻

[21] RFC 8006 - Content Delivery Network Interconnection (CDNI) Metadata () https://tools.ietf.org/html/rfc8006#section-4.3.4

A time value expressed in seconds since the UNIX epoch (i.e., zero hours, zero minutes, zero seconds, on January 1, 1970) Coordinated Universal Time (UTC) [POSIX].

Type: Integer

Example time representing 09:00:00 01/01/2000 UTC: 946717200

[22] RFC 8007 - Content Delivery Network Interconnection (CDNI) Control Interface / Triggers () https://tools.ietf.org/html/rfc8007#section-5.2.5

A JSON number, seconds since the UNIX epoch (00:00:00 UTC on 1 January 1970).

TLS の時刻

[4] RFC 5246 - The Transport Layer Security (TLS) Protocol Version 1.2 ( 版) http://tools.ietf.org/html/rfc5246#section-7.4.1.2
gmt_unix_time
The current time and date in standard UNIX 32-bit format (seconds since the midnight starting Jan 1, 1970, UTC, ignoring leap seconds) according to the sender's internal clock. Clocks are not required to be set correctly by the basic TLS protocol; higher-level or application protocols may define additional requirements. Note that, for historical reasons, the data element is named using GMT, the predecessor of the current worldwide time base, UTC.

VMS の時刻

VMSの日時形式

Java時刻JavaScript時刻

[14] JavaCalendar >>27JavaScriptDate の値も Unix time と同じ元期ですが、ミリ秒単位となっています。 (こちらも閏秒は考えません。)

[24] DOM日時を扱う API (DOMTimeStamp) も、 ミリ秒単位の千倍 Unix time を用いています。

[46] DateTime Wire Format でも使われています。

[97] Push API, https://w3c.github.io/push-api/#dfn-subscription-expiration-time

time, in milliseconds since 00:00:00 UTC on 1 January 1970

購読満期時刻

[27] Calendar (Java Platform SE 7 ) () http://docs.oracle.com/javase/jp/7/api/java/util/Calendar.html

特定の時点は、1970 年 1 月 1 日 00:00:00.000 GMT (グレゴリオ暦) を元期とするミリ秒単位のオフセットで表現できます。

Go時刻

[34] GoTime は、ナノ秒単位の Unix time を用いています。

[33] time - The Go Programming Language () https://golang.org/pkg/time/#Time

The zero value of type Time is January 1, year 1, 00:00:00.000000000 UTC.

epoch days

[100] tantek短縮URLUnix epoch からの経過数を New Base 60 で記述し、 epoch days と呼んでいます。 >>101

[102] 4432を表します。 >>101

[101] tantek / Whistle, http://tantek.pbworks.com/w/page/21743973/Whistle

After that I use a 3 digit sexagesimal (Base60) number to represent the date in a manner deliberately limited to human individuals. Why Base60? Lots of reasons, including print-safety (as mentioned above). Want to read the entire derivation and reasons why? See NewBase60 (includes open source CASSIS implementation).

Why 3 sexagesimal digits to represent the date? It turns out that 3 sexagesimal digits are capable of representing over 500 years of days - plenty overengineered for any human lifetime. And if anyone does figure out how to live more than 500 years I have a feeling that person will not only not resemble human as we know it very much, but will either have bigger problems to deal with than URL shortener limitations, or will be so smart that they will come up with a better solution.

But for now, for our feeble less than 200 year lifetimes, this is good enough. In addition we can even agree on a day zero that computes well with existing platforms. Unix Epoch start: 1970-01-01. Given that no-one published anything to the web before 1990, I think we're ok with that. What happens in a few hundred years? Perhaps people can pick their own day zeroes as they see fit.

Thus the 3 characters after the "t" represent the number of days since 1970-01-01 in sexagesimal - what I'm calling "epoch days".

桁溢れ問題

[59] 2038年問題は、 Unix time桁溢れ問題です。

[75] 名無しさん: スラッシュドット ジャパン | 2038年問題、早くも顕在化 http://slashdot.jp/article.pl?sid=04/02/03/031211&topic=80

[76] [tz] DST ends 2040 in Oracle database () https://mm.icann.org/pipermail/tz/2019-January/027438.html

[77] Y2038ProofnessDesign - glibc wiki () https://sourceware.org/glibc/wiki/Y2038ProofnessDesign

[99] John Feminella 🌠さんはTwitterを使っています 「⏲️ As of today, we have about eighteen years to go until the Y2038 problem occurs. But the Y2038 problem will be giving us headaches long, long before 2038 arrives. I'd like to tell you a story about this.」 / Twitter, https://twitter.com/jxxf/status/1219009308438024200

関連

[47] PTP元期も同じくですが、 TAI を使っているので Unix time とは少しずれています。

メモ

[1] スラッシュドット ジャパン | 明日でepochから2^30秒 http://slashdot.jp/article.pl?sid=04/01/08/172200&mode=flat&commentsort=4&threshold=-1

[16] time_t - Wikipedia ( ( 版)) http://ja.wikipedia.org/wiki/Time_t

[17] Unix time - Wikipedia, the free encyclopedia ( ( 版)) http://en.wikipedia.org/wiki/Unix_time

[8] iPhoneを「1970年1月1日」に設定すると利用不能になる問題、Appleがソフト更新で解消へ - ITmedia ニュース ( 版) http://www.itmedia.co.jp/news/articles/1602/16/news132.html

[9] iPhoneで「1970年1月1日」に設定すると使用不能に? 実際に試してみた - ITmedia Mobile ( 版) http://www.itmedia.co.jp/mobile/articles/1602/12/news125.html

[19] WebDriver () https://w3c.github.io/webdriver/webdriver-spec.html#dfn-unix-epoch

[26] 電子機器の時刻 () http://www.ffortune.net/calen/calen/etime.htm

2001年9月9日1時46分40秒にこの数字が十進数で9桁から10桁に変わりました。2chなどではこの数字を掲示板のidに使用しているため、この前後での掲示板の並べ替えがうまく行きません。

[28] () http://cr.yp.to/proto/utctai.html

What is the epoch? Originally it was defined as the beginning of 1970 GMT. GMT, Greenwich Mean Time, is a traditional term for the time zone in England. Unfortunately, it is ambiguous; it can refer to a variety of astronomical time scales.

Arthur David Olson's popular time library uses an epoch of 1970-01-01 00:00:10 TAI.

[29] perlvms - search.cpan.org () http://search.cpan.org/dist/perl/pod/perlvms.pod#time

The value returned by time is the offset in seconds from 01-JAN-1970 00:00:00 (just like the CRTL's times() routine), in order to make life easier for code coming in from the POSIX/Unix world.

[30] File API () https://w3c.github.io/FileAPI/#UnixEpoch

[35] time - The Go Programming Language () https://golang.org/pkg/time/#Time.UnixNano

UnixNano returns t as a Unix time, the number of nanoseconds elapsed since January 1, 1970 UTC.

[36] SANS Digital Forensics and Incident Response Blog | Understanding EXT4 (Part 2): Timestamps | SANS Institute () https://digital-forensics.sans.org/blog/2011/03/14/digital-forensics-understanding-ext4-part-2-timestamps

[39] Add PushSubscription.expirationTime (#248) (beverloo著, ) https://github.com/w3c/push-api/commit/73da6411aac80de7de9bf5e65ee8eb4cc6a9aa24

[40] Epoch (astronomy) - Wikipedia () https://en.wikipedia.org/wiki/Epoch_(astronomy)

[41] General Concepts () http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap04.html#tag_04_16

[42] RFC 7519 - JSON Web Token (JWT) () https://tools.ietf.org/html/rfc7519#section-2

NumericDate

A JSON numeric value representing the number of seconds from

1970-01-01T00:00:00Z UTC until the specified UTC date/time,

ignoring leap seconds. This is equivalent to the IEEE Std 1003.1,

2013 Edition [POSIX.1] definition "Seconds Since the Epoch", in

which each day is accounted for by exactly 86400 seconds, other

than that non-integer values can be represented.

[43] RFC 7049 - Concise Binary Object Representation (CBOR) () https://tools.ietf.org/html/rfc7049#section-2.4.1

Tag value 1 is for numerical representation of seconds relative to

1970-01-01T00:00Z in UTC time. (For the non-negative values that the

Portable Operating System Interface (POSIX) defines, the number of

seconds is counted in the same way as for POSIX "seconds since the

epoch" [TIME_T].) The tagged item can be a positive or negative

integer (major types 0 and 1), or a floating-point number (major type

7 with additional information 25, 26, or 27). Note that the number

can be negative (time before 1970-01-01T00:00Z) and, if a floating-

point number, indicate fractional seconds.

[81] MessagePackフォーマット仕様にTimestamp型を追加 - Blog by Sadayuki Furuhashi () http://frsyuki.hatenablog.com/entry/2017/08/10/144310

[82] msgpack/spec.md at master · msgpack/msgpack () https://github.com/msgpack/msgpack/blob/master/spec.md#timestamp-extension-type

[44] レシートのフィールド () https://developer.apple.com/jp/documentation/General/ValidateAppStoreReceipt/Chapters/ReceiptFields.html

定期購読の有効期限が、1970年1月1日 00:00:00 GMTからのミリ秒単位で表されています。

ASN.1フィールドタイプ:1708

ASN.1フィールド値: IA5STRING(RFC 3339の日付として解釈されます)

JSONフィールド名:expires_date

JSONフィールド値:数値

[48] プログラマーの常識をJavaで身につける(4):OSとプログラミングの「時間」に関する常識 (1/3) - @IT () http://www.atmarkit.co.jp/ait/articles/0703/28/news135.html

具体的には、1970年1月1日 00:00:00 GMTからのミリ秒数を表すlong値として表現されています。この原稿では、これを便宜的に「エポックからのミリ秒」と呼ぶことにします。なお、1970年1月1日 00:00:00 GMTについてJava言語APIでは、「エポック」と呼んでいます。

[49] 日付関数またはタイムスタンプ関数の日付部分 - Amazon Redshift () http://docs.aws.amazon.com/ja_jp/redshift/latest/dg/r_Dateparts_for_datetime_functions.html

Amazon Redshift の EPOCH の実装は、サーバーのあるタイムゾーンから独立した 1970-01-01 00:00:00.000000 に関連します。

[50] タイムスタンプ型 | CQL for Cassandra 2.x () https://docs.datastax.com/ja/cql-jajp/3.1/cql/cql_reference/timestamp_type_r.html

タイムスタンプ型の値は64ビットの符号付き整数としてエンコードされ、エポックとして知られる標準基準時間(1970年1月1日、GMT時間0時0分0秒)からのミリ秒数を表します。

[51] GitHub API v3 | GitHub Developer Guide () https://developer.github.com/v3/#rate-limiting

The time at which the current rate limit window resets in UTC epoch seconds.

[52] docker service logs | Docker Documentation () https://docs.docker.com/engine/reference/commandline/service_logs/#extended-description

When providing Unix timestamps enter seconds[.nanoseconds], where seconds is the number of seconds that have elapsed since January 1, 1970 (midnight UTC/GMT), not counting leap seconds (aka Unix epoch or Unix time), and the optional .nanoseconds field is a fraction of a second no more than nine digits long.

[53] 取引所APIドキュメント | Coincheck(コインチェック) () https://coincheck.com/ja/documents/exchange/api

ACCESS-NONCE 毎リクエストごとに増加する必要のある正の整数。通常はUNIXタイムスタンプを用います。最大値は 9223372036854775807 です。APIキーごとに管理されます。

[54] Make Event's timeStamp use DOMHighResTimeStamp (majido著, ) https://github.com/whatwg/dom/commit/912d58746bc4c67c2fd210124639f7c34991fce5

[57] Git - git-commit Documentation () https://git-scm.com/docs/git-commit#_date_formats

Git internal format

It is <unix timestamp> <time zone offset>, where <unix timestamp> is the number of seconds since the UNIX epoch. <time zone offset> is a positive or negative offset from UTC. For example CET (which is 1 hour ahead of UTC) is +0100.

[58] Concise Binary Object Representation (CBOR) () https://cbor-wg.github.io/CBORbis/#datetimesect

Tag value 1 is for numerical representation of seconds relative to 1970-01-01T00:00Z in UTC time. (For the non-negative values that the Portable Operating System Interface (POSIX) defines, the number of seconds is counted in the same way as for POSIX “seconds since the epoch” [TIME_T].) The tagged item can be a positive or negative integer (major types 0 and 1), or a floating-point number (major type 7 with additional information 25, 26, or 27). Note that the number can be negative (time before 1970-01-01T00:00Z) and, if a floating-point number, indicate fractional seconds.

[60] Unix time - Wikipedia () https://en.wikipedia.org/wiki/Unix_time

[61] LHA解説書 () http://techno7.co.jp/jimuki/new2000/lha/index.htm

LHA では内部的にタイムスタンプを 1970-01-01 00:00:00 UTC からの通算秒 に変換しています。このため、実在しないスタンプ(80-00-00 など)を持った ファイルを格納した場合、タイムスタンプは不定となります。

[62] しかし保存先は MS-DOSの日時形式らしい。

[63] LHAフォーマット ‐ 通信用語の基礎知識 () https://www.wdic.org/w/TECH/LHA%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%83%E3%83%88

03h DWORD 最終更新日時 (time_t形式)

[64] gzip-1.9 released [stable] () https://lists.gnu.org/archive/html/info-gnu/2018-01/msg00004.html

When converting from system-dependent time_t format to the 32-bit

unsigned MTIME format used in gzip files, if a timestamp does not

fit gzip now substitutes zero instead of the timestamp's low-order

32 bits, as per Internet RFC 1952. When converting from MTIME to

time_t format, if a timestamp does not fit gzip now warns and

substitutes the nearest in-range value instead of crashing or

silently substituting an implementation-defined value (typically,

the timestamp's low-order bits). This affects timestamps before

1970 and after 2106, and timestamps after 2038 on platforms with

32-bit signed time_t. [bug present since the beginning]

[73] msgpack/spec.md at master · msgpack/msgpack () https://github.com/msgpack/msgpack/blob/master/spec.md#timestamp-extension-type

[74] RFC 7049 - Concise Binary Object Representation (CBOR) () https://tools.ietf.org/html/rfc7049#section-2.4.1

[78] 第25回 32ビット環境に迫る「2038年問題」 時計がおかしくなると…… (1/3) - ITmedia エンタープライズ () https://www.itmedia.co.jp/enterprise/articles/1607/13/news020.html

[79] KDDI、「2038年問題」で1346万円を過剰請求 - ITmedia NEWS () https://www.itmedia.co.jp/news/articles/0403/08/news023.html

[80] Package google.protobuf  |  Protocol Buffers  |  Google Developers () https://developers.google.com/protocol-buffers/docs/reference/google.protobuf#google.protobuf.Timestamp

[87] 9月 9日 コンピュータの9月9日問題が発生(2001年)(ブルーバックス編集部) | ブルーバックス | 講談社 () https://gendai.ismedia.jp/articles/-/66915

[88] 上原 哲太郎/Tetsu. Uehara على تويتر: "いまいち認知が広がらない2038年問題ですが、Siriは知っています。Siriに世界の終わりを聞くとこう答えることがあります。… " (午前7:57 · 2018年9月26日 ) https://twitter.com/tetsutalow/status/1044722692576829440

[89] KDDI、「2038年問題」で1346万円を過剰請求 - ITmedia NEWS (2004年03月08日 16時56分 公開 ) https://www.itmedia.co.jp/news/articles/0403/08/news023.html

2004年03月08日 16時56分 公開

[90] VRML97, ISO/IEC 14772-1:1997 -- 3 Definitions () https://www.web3d.org/documents/specifications/14772/V2.0/part1/glossary.html#Time

3.99 time

A monotonically increasing value generated by a node. Time (0.0) starts at 00:00:00 GMT January 1, 1970.

[91] VRML97, ISO/IEC 14772-1:1997 -- 4 Concepts () https://www.web3d.org/documents/specifications/14772/V2.0/part1/concepts.html#4.11

Time (0.0) is equivalent to 00:00:00 GMT January 1, 1970. Absolute times are specified in SFTime or MFTime fields as double-precision floating point numbers representing seconds. Negative absolute times are interpreted as happening before 1970.

[92] VRML97, ISO/IEC 14772-1:1997 -- 5 Field and Event Reference () https://www.web3d.org/documents/specifications/14772/V2.0/part1/fieldsRef.html#SFTime

[93] LKML: Arnd Bergmann: [GIT PULL] y2038: core, driver and file system changes () https://lkml.org/lkml/2020/1/29/355

[94] 2038年問題に対応した「OpenBSD 5.5」リリース | OSDN Magazine () https://mag.osdn.jp/14/05/02/160000

[95] OpenBSD 5.5、2038年問題に対応 | スラド オープンソース () https://opensource.srad.jp/story/14/05/06/1839242/

[96] Ink Markup Language (InkML) () https://www.w3.org/TR/2011/REC-InkML-20110920/#timestamp

time = xsd:decimal

The absolute time for this timestamp, in milliseconds since 1 January 1970 00:00:00 UTC.

Required: no, Default: none.

[98] SORACOM API 利用ガイド | SORACOM Users () https://dev.soracom.io/jp/docs/api_guide/#datetime

API パラメータでは、UNIX Time(1970年1月1日からの経過秒数)を指定する箇所と、YYYYMMDD のようなフォーマットの文字列形式で指定する箇所がありますが、いずれも UTC で指定します。

[103] [GIT PULL] xfs: new code for 5.10, part 1 - Darrick J. Wong () https://lore.kernel.org/lkml/20201014205059.GD9837@magnolia/

- New feature: Widen inode timestamps and quota grace expiration

timestamps to support dates through the year 2486.

xfs: widen ondisk inode timestamps to deal with y2038+

xfs: widen ondisk quota expiration timestamps to handle y2038+

xfs: trace timestamp limits

xfs: enable big timestamps

[104] Linux 5.10 to make Year 2038 problem the Year 2486 problem • The Register () https://www.theregister.com/2020/10/19/linux_5_10_y2k38_fixes/

[105] XFS File-System With Linux 5.10 Punts Year 2038 Problem To The Year 2486 - Phoronix () https://www.phoronix.com/scan.php?page=news_item&px=XFS-Linux-5.10

[106] Linuxカーネル5.6、32ビット版で2038年問題への対応が行われる | スラド Linux () https://linux.srad.jp/story/20/02/05/1249244/

[107] Pondering 2038 [LWN.net] (, ) https://lwn.net/Articles/563285/

[108] Linux 5.6 Is The First Kernel For 32-Bit Systems Ready To Run Past Year 2038 - Phoronix () https://www.phoronix.com/scan.php?page=news_item&px=Linux-5.6-32-bit-Past-Y2038

[109] Linuxカーネル5.10、XFSファイルシステムの2038年問題に対処 | スラド Linux () https://linux.srad.jp/story/20/10/19/194204/

[110] GNU Coreutils: 28.9 Unix 紀元 (the Epoch) からの秒数 (, ) https://linuxjm.osdn.jp/info/GNU_coreutils/coreutils-ja_207.html