मुझे मिलीसेकंड में गो में यूनिक्स समय कैसे मिल सकता है?
मेरा निम्नलिखित कार्य है:
func makeTimestamp() int64 {
return time.Now().UnixNano() % 1e6 / 1e3
}
मुझे कम सटीकता की आवश्यकता है और केवल मिलीसेकंड चाहिए।
मुझे मिलीसेकंड में गो में यूनिक्स समय कैसे मिल सकता है?
मेरा निम्नलिखित कार्य है:
func makeTimestamp() int64 {
return time.Now().UnixNano() % 1e6 / 1e3
}
मुझे कम सटीकता की आवश्यकता है और केवल मिलीसेकंड चाहिए।
जवाबों:
बस इसे विभाजित करें:
func makeTimestamp() int64 {
return time.Now().UnixNano() / int64(time.Millisecond)
}
यहाँ एक उदाहरण है जिसे आप आउटपुट को देखने के लिए संकलित और चला सकते हैं
package main
import (
"time"
"fmt"
)
func main() {
a := makeTimestamp()
fmt.Printf("%d \n", a)
}
func makeTimestamp() int64 {
return time.Now().UnixNano() / int64(time.Millisecond)
}
जैसा कि @Jono @ OneOfOne के उत्तर में बताता है, सही उत्तर को नैनोसेकंड की अवधि को ध्यान में रखना चाहिए। जैसे:
func makeTimestamp() int64 {
return time.Now().UnixNano() / (int64(time.Millisecond)/int64(time.Nanosecond))
}
OneOfOne का जवाब काम करता है क्योंकि time.Nanosecond
ऐसा होता है 1
, और 1 से विभाजित होने का कोई प्रभाव नहीं पड़ता है। मैं यह जानने के लिए पर्याप्त नहीं हूं कि यह भविष्य में बदलने की कितनी संभावना है, लेकिन सख्ती से सही जवाब के लिए मैं इस फ़ंक्शन का उपयोग करूंगा, न कि वनऑफऑन के जवाब का। मुझे संदेह है कि कोई प्रदर्शन नुकसान है क्योंकि कंपाइलर को इसे पूरी तरह से अच्छी तरह से अनुकूलित करने में सक्षम होना चाहिए।
Https://en.wikipedia.org/wiki/Dimunning_analysis देखें
इस को देखने का एक और तरीका है कि दोनों है time.Now().UnixNano()
और time.Millisecond
एक ही इकाइयों (नैनोसेकंड) का उपयोग करें। जब तक यह सच है, OneOfOne का जवाब पूरी तरह से अच्छी तरह से काम करना चाहिए।
.UnixNano()
इच्छा हमेशा नैनोसेकंड में समय हो, time.Millisecond
होगा हमेशा , मान हो के लिए अच्छी तरह से, आप इसे, एक millisecond अनुमान लगाया तो भी जो कुछ मूर्खतापूर्ण कारण निरंतर मूल्य बदलता है, मिलीसेकंड से UnixNano विभाजित होगा के लिए करता है, तो हमेशा मिलीसेकंड में मान।
(int64(time.Now().UnixNano() / int64(time.Nanosecond))/int64(time.Millisecond)
? आयामी विश्लेषण ns/(ms/ns)
रिटर्न ns^2/ms
। आपका उत्तर इसलिए भी काम करता है time.Nanosecond=1
, लेकिन इकाइयाँ बंद हैं ...
इसे सरल रखें।
func NowAsUnixMilli() int64 {
return time.Now().UnixNano() / 1e6
}
मुझे लगता है कि विभाजन से पहले मिलीसेकंड के समय को गोल करना बेहतर है।
func makeTimestamp() int64 {
return time.Now().Round(time.Millisecond).UnixNano() / (int64(time.Millisecond)/int64(time.Nanosecond))
}
यहाँ एक उदाहरण कार्यक्रम है:
package main
import (
"fmt"
"time"
)
func main() {
fmt.Println(unixMilli(time.Unix(0, 123400000)))
fmt.Println(unixMilli(time.Unix(0, 123500000)))
m := makeTimestampMilli()
fmt.Println(m)
fmt.Println(time.Unix(m/1e3, (m%1e3)*int64(time.Millisecond)/int64(time.Nanosecond)))
}
func unixMilli(t time.Time) int64 {
return t.Round(time.Millisecond).UnixNano() / (int64(time.Millisecond) / int64(time.Nanosecond))
}
func makeTimestampMilli() int64 {
return unixMilli(time.Now())
}
उपरोक्त कार्यक्रम ने मेरी मशीन पर नीचे दिए गए परिणाम को मुद्रित किया:
123
124
1472313624305
2016-08-28 01:00:24.305 +0900 JST
सरल-सरल लेकिन सटीक समाधान होगा:
func nowAsUnixMilliseconds(){
return time.Now().Round(time.Millisecond).UnixNano() / 1e6
}
यह समारोह:
PS मैंने लगातार और समग्र डिवाइडर के साथ बेंचमार्क चलाया है, उन्होंने लगभग कोई अंतर नहीं दिखाया, इसलिए अधिक पठनीय या अधिक भाषा-सख्त समाधान का उपयोग करने के लिए स्वतंत्र महसूस करें।
time.Now().UnixNano() * (time.Nanosecond / time.Millisecond)
:। हालांकि पूर्णांक विभाजन के कारण ऑर्डर को बदलना सबसे अच्छा है:time.Nanosecond * time.Now().UnixNano() / time.Millisecond