Today we are mainly going to take a look at the time application method of golang time package.
When it comes to computer processing clocks, there are two main ways:
Wall clock (wall time) -
Monotonic clocks
The general rule between the two is that "wall time" is used for telling time
, while "monotonic clock" is used forMeasure time
; In addition, there are other clock processing methods.
If you still don’t understand the concepts of the above two clocks, then I recommend that you visit: Do you really understand the computer time? [1]This article details the origins of these two clocks.
Before reading the following, I will assume that you already know what a Wall Clock
and a Monotone Clock
are.
I will next look at an introduction to time.Time
(translated by machine):
Time represents a time instant with nanosecond precision.
Programs that use times should generally store and pass them as values rather than pointers. In other words, the type of time variables and structure fields should be time.Time, not *time.Time.
A Time value can be used by multiple goroutines at the same time, except GobDecode, UnmarshalBinary, The UnmarshalJSON and UnmarshalText methods are not concurrency safe.
Time instants can be compared using the Before, After, and Equal methods. The Sub method subtracts two instants, producing a duration. The Add method adds a duration to a time, producing a time.
The zero value of type Time is January 1, Year 1, 00:00:00.000000000 UTC. Since this time is unlikely to occur in practice, the IsZero method provides a simple way to detect times that have not been explicitly initialized.
Each Time is associated with a Location, which is referenced when calculating the representation of the time. For example in the Format, Hour and Year methods. The Local, UTC, and In methods return the time at a specific location. Changing the position in this way only changes the presentation; it does not change the moment of representation and therefore does not affect the calculations described in the previous paragraph.
The time value saved by the GobEncode, MarshalBinary, MarshalJSON, and MarshalText methods represents the offset at which the Time.Location is stored, but not the location name. Therefore, they lose information about daylight saving time.
In addition to the required "wall clock" reading, the time can also contain an optional reading of the current process's monotonic clock to provide additional comparison or subtraction precision. See the "Monotonic Clocks" section in the package documentation for details.
Note that the Go ==
operator compares not only time instants, but also positions and monotonic clock readings. Therefore, time values should not be used as map or database keys without first ensuring that the same position has been set for all values, this can be achieved by using UTC or native methods, and that the monotonic clock reading has been stripped out setting t = t.Round(0). In general, prefer t.Equal(u) to t == u because t.Equal uses the most accurate comparison available and correctly handles the case where only one parameter has a monotonic clock reading.
This is the official introduction of time.TIme. Let's take a look at what the structure of Time looks like:
type Time struct { wall uint64 ext int64 loc *Location }
wall
Its highest bit contains a 1-bit flag. Represents hasMonotonic
, followed by 33 bits to track seconds; and finally 30 bits to track nanoseconds in the range [0, 999999999].
If the hasMonotonic bit is 0, the 33-bit field is zero, and ext
stores the full signed 64-bit wall## since January 1, 2020 #Seconds.
如果该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) Time {...} func Unix(sec int64, nsec int64) Time {...} func UnixMilli(sec int64, nsec int64) Time {...} func UnixMicro(sec int64, nsec int64) Time {...} func (t Time) AddDate(years int, months int, days int) Time { ...}
I hope that after reading these concepts and knowledge, you will become more proficient in using the time package.
The above is the detailed content of Monotonic clock processing of time package. For more information, please follow other related articles on the PHP Chinese website!

C is more suitable for scenarios where direct control of hardware resources and high performance optimization is required, while Golang is more suitable for scenarios where rapid development and high concurrency processing are required. 1.C's advantage lies in its close to hardware characteristics and high optimization capabilities, which are suitable for high-performance needs such as game development. 2.Golang's advantage lies in its concise syntax and natural concurrency support, which is suitable for high concurrency service development.

Golang excels in practical applications and is known for its simplicity, efficiency and concurrency. 1) Concurrent programming is implemented through Goroutines and Channels, 2) Flexible code is written using interfaces and polymorphisms, 3) Simplify network programming with net/http packages, 4) Build efficient concurrent crawlers, 5) Debugging and optimizing through tools and best practices.

The core features of Go include garbage collection, static linking and concurrency support. 1. The concurrency model of Go language realizes efficient concurrent programming through goroutine and channel. 2. Interfaces and polymorphisms are implemented through interface methods, so that different types can be processed in a unified manner. 3. The basic usage demonstrates the efficiency of function definition and call. 4. In advanced usage, slices provide powerful functions of dynamic resizing. 5. Common errors such as race conditions can be detected and resolved through getest-race. 6. Performance optimization Reuse objects through sync.Pool to reduce garbage collection pressure.

Go language performs well in building efficient and scalable systems. Its advantages include: 1. High performance: compiled into machine code, fast running speed; 2. Concurrent programming: simplify multitasking through goroutines and channels; 3. Simplicity: concise syntax, reducing learning and maintenance costs; 4. Cross-platform: supports cross-platform compilation, easy deployment.

Confused about the sorting of SQL query results. In the process of learning SQL, you often encounter some confusing problems. Recently, the author is reading "MICK-SQL Basics"...

The relationship between technology stack convergence and technology selection In software development, the selection and management of technology stacks are a very critical issue. Recently, some readers have proposed...

Golang ...

How to compare and handle three structures in Go language. In Go programming, it is sometimes necessary to compare the differences between two structures and apply these differences to the...


Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

AI Hentai Generator
Generate AI Hentai for free.

Hot Article

Hot Tools

Zend Studio 13.0.1
Powerful PHP integrated development environment

SublimeText3 Linux new version
SublimeText3 Linux latest version

DVWA
Damn Vulnerable Web App (DVWA) is a PHP/MySQL web application that is very vulnerable. Its main goals are to be an aid for security professionals to test their skills and tools in a legal environment, to help web developers better understand the process of securing web applications, and to help teachers/students teach/learn in a classroom environment Web application security. The goal of DVWA is to practice some of the most common web vulnerabilities through a simple and straightforward interface, with varying degrees of difficulty. Please note that this software

Notepad++7.3.1
Easy-to-use and free code editor

MantisBT
Mantis is an easy-to-deploy web-based defect tracking tool designed to aid in product defect tracking. It requires PHP, MySQL and a web server. Check out our demo and hosting services.