mirror of
https://github.com/ChronosX88/go-gun.git
synced 2024-11-08 20:21:01 +00:00
47 lines
1.0 KiB
Go
47 lines
1.0 KiB
Go
package gun
|
|
|
|
import (
|
|
"sync/atomic"
|
|
"time"
|
|
)
|
|
|
|
// TimeFromUnixMs returns zero'd time if ms is 0
|
|
func TimeFromUnixMs(ms int64) time.Time {
|
|
if ms == 0 {
|
|
return time.Time{}
|
|
}
|
|
return time.Unix(0, ms*int64(time.Millisecond))
|
|
}
|
|
|
|
// TimeToUnixMs returns 0 if t.IsZero
|
|
func TimeToUnixMs(t time.Time) int64 {
|
|
if t.IsZero() {
|
|
return 0
|
|
}
|
|
return t.UnixNano() / int64(time.Millisecond)
|
|
}
|
|
|
|
func TimeNowUnixMs() int64 {
|
|
return TimeToUnixMs(time.Now())
|
|
}
|
|
|
|
var lastNano int64
|
|
|
|
// uniqueNano is 0 if ms is first time seen, otherwise a unique num in combination with ms
|
|
func TimeNowUniqueUnix() (ms int64, uniqueNum int64) {
|
|
now := time.Now()
|
|
newNano := now.UnixNano()
|
|
for {
|
|
prevLastNano := lastNano
|
|
if prevLastNano < newNano && atomic.CompareAndSwapInt64(&lastNano, prevLastNano, newNano) {
|
|
ms = newNano / int64(time.Millisecond)
|
|
// If was same ms as seen before, set uniqueNum to the nano part
|
|
if prevLastNano/int64(time.Millisecond) == ms {
|
|
uniqueNum = newNano%int64(time.Millisecond) + 1
|
|
}
|
|
return
|
|
}
|
|
newNano = prevLastNano + 1
|
|
}
|
|
}
|