タイムパッケージの単調クロック処理
今日は主に golang time パッケージの時刻適用方法を見ていきます。
コンピュータのクロック処理には、主に 2 つの方法があります:
壁掛け時計 (実時間) -
単調時計
この 2 つの間の一般的なルールは、「経過時間」は 時間を伝えるために使用されますが、「単調時計」は
測定に使用されます。 time; さらに、他のクロック処理方法もあります。
コンピュータの時間を本当に理解していますか? [1]この記事では、これら 2 つの時計の起源について詳しく説明します。
以下を読む前に、Wall Clock と
Monotone Clock が何であるかをすでに知っていることを前提とします。
time.Time (機械翻訳) の概要を見ていきます。
Time 型のゼロ値は、1 年 1 月 1 日、00:00:00.000000000 UTC です。この時間が実際には発生する可能性は低いため、IsZero メソッドは、明示的に初期化されていない時間を検出する簡単な方法を提供します。
各時間は場所に関連付けられており、時間の表現を計算するときに参照されます。 たとえば、Format、Hour、および Year メソッドです。 Local、UTC、および In メソッドは、特定の場所の時刻を返します。この方法で位置を変更すると、表示が変更されるだけで、表示の瞬間は変更されないため、前の段落で説明した計算には影響しません。
GobEncode、MarshalBinary、MarshalJSON、および MarshalText メソッドによって保存された時間値は、Time.Location が保存されているオフセットを表しますが、場所の名前は表しません。したがって、夏時間に関する情報が失われます。
必要な「壁時計」の読み取り値に加えて、時間には、比較または減算の精度を高めるために、現在のプロセスの単調クロックのオプションの読み取り値を含めることもできます。詳細については、パッケージのドキュメントの「モノトニック クロック」セクションを参照してください。
Go ==
演算子は時刻だけでなく、位置や単調クロックの読み取り値も比較することに注意してください。したがって、すべての値に同じ位置が設定されていることを最初に確認することなく、時間値をマップまたはデータベースのキーとして使用しないでください。これは、UTC またはネイティブ メソッドを使用することで実現でき、単調な時計の読み取り値が取り除かれていることを確認する必要があります。 t = t.Round(0) を設定します。一般に、t == u よりも t.Equal(u) を優先します。これは、 t.Equal は利用可能な最も正確な比較を使用し、1 つのパラメーターのみが単調クロック読み取り値を持つ場合を正しく処理するためです。
これは time.TIME の公式紹介です。 Time の構造がどのようなものかを見てみましょう:
type Time struct { wall uint64 ext int64 loc *Location }
wall
その最上位ビットには 1 ビットのフラグが含まれています。 hasMonotonic
を表し、その後に秒を追跡する 33 ビットが続き、最後に範囲 [0, 999999999] のナノ秒を追跡する 30 ビットが続きます。
hasMonotonic ビットが 0 の場合、33 ビット フィールドは 0 で、ext
には 2020 年 1 月 1 日 #秒以降の完全な符号付き 64 ビット wall## が格納されます。
如果该hasMonotonic
位为1,则33位字段存储自1885年1月1日以来的无符号的wall
秒数,而ext保留有符号的64位单调时钟读数,距离进程开始的时间为纳秒。这是大多数代码中通常发生的情况。
我们来通过 time.now() 函数来查看其中的区别:
// Now returns the current local time. func Now() Time { sec, nsec, mono := now() // 返回对应的秒数,纳秒数,单调时钟数 mono -= startNano sec += unixToInternal - minWall if uint64(sec)>>33 != 0 { // 判断如果秒数右移33位后大于0,说明不能采用单调时钟。 return Time{uint64(nsec), sec + minWall, Local} // 按照 `wall` 时钟返回 } // 返回 `wall` 时钟和 `monotonic` 时钟信息 return Time{hasMonotonic | uint64(sec)<<nsecShift | uint64(nsec), mono, Local} }
通过这个例子我们可以看到在time包中对于时间差的计算基本都会采用单调时钟
和墙上时钟
的兼容。
func (t Time) After(u Time) bool {...} func (t Time) Before(u Time) bool {...} func (t Time) Equal(u Time) bool {...} func (t Time) Add(d Duration) Time {...} func (t Time) Sub(u Time) Duration {...} func Since(t Time) Duration {...} func Until(t Time) Duration {...}
对于增加修改时间计算会清除单调时钟
,因为后面调用的是 unixTime
函数:
func unixTime(sec int64, nsec int32) Time { return Time{uint64(nsec), sec + unixToInternal, Local} }
不会计算单调时钟的秒数,如下:
func Date(year int, month Month, day,hour, min, sec, nsec int, loc *Location) 時間 {...} func Unix(sec int64, nsec int64) 時間 {...} func UnixMilli(sec int64, nsec int64) 時間 {...} func UnixMicro(sec int64, nsec int64) Time {...} func (t Time) AddDate(year int, months int, days int) Time { ...}
これらの概念と知識を読んだ後、時間パッケージの使用に習熟していただけることを願っています。
以上がタイムパッケージの単調クロック処理の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









Go Crawler Collyのキュースレッドの問題は、Go言語でColly Crawler Libraryを使用する問題を調査します。 �...

大企業または有名なオープンソースプロジェクトによって開発されたGOのどのライブラリが開発されていますか? GOでプログラミングするとき、開発者はしばしばいくつかの一般的なニーズに遭遇します...

GO言語で構造を定義する2つの方法:VARとタイプのキーワードの違い。構造を定義するとき、GO言語はしばしば2つの異なる執筆方法を見ます:最初...

Go言語での文字列印刷の違い:printlnとstring()関数を使用する効果の違いはGOにあります...

Golandのカスタム構造ラベルが表示されない場合はどうすればよいですか?ゴーランドを使用するためにGolandを使用する場合、多くの開発者はカスタム構造タグに遭遇します...

redisstreamを使用してGo言語でメッセージキューを実装する問題は、GO言語とRedisを使用することです...

ポインター構文とviperライブラリの使用における問題への取り組みGO言語でプログラミングするとき、特にポインターの構文と使用を理解することが重要です...
