我需要以毫秒为单位的时间来处理大量的事务,所以我想要一些正确且快速的东西。以下工作会做得最好吗? :
iMilli := int((time.Nanoseconds() % 1e6) / 1e3)
TIA
答案 0 :(得分:6)
编辑:由于首次编写此答案,因此已将转义分析代码添加到Go编译器中。这允许编译器在某些情况下避免不必要的分配,包括(可能)下面描述的那种情况。因此,对于最新的周期,使用更直接的time toNanoseconds()可能同样好。请进行自己的分析。
大多数时候,函数会导致堆分配(随后需要收集,导致应用程序暂停)。因此,如果你经常查看时间,听起来就像你一样,你需要直接使用syscall.Gettimeofday()(这是其他时间函数最终调用的函数)。有关详细信息,请参阅此处的讨论:
http://groups.google.com/group/golang-nuts/browse_thread/thread/f2209022f43efcca?pli=1
我正在使用的解决方案是预先分配一个tv syscall.Timeval
,每次通过我的内循环我都这样做:
syscall.Gettimeofday(&tv)
然后您可以使用以下内容获取毫秒:
(int64(tv.Sec)*1e3 + int64(tv.Usec)/1e3)
我发现这比调用time.Nanoseconds()或其他更高级别的时间函数要好得多。
答案 1 :(得分:3)
一秒钟内有1e9纳秒,一毫秒内有1e6纳秒,所以你可以这样做:
func getTimeString() string {
now := time.Nanoseconds()
localTime := time.SecondsToLocalTime(now/1e9)
miliSeconds := (now % 1e9) / 1e6
return fmt.Sprintf("%04d-%02d-%02d %02d:%02d:%02d.%03d",localTime.Year,localTime.Month,localTime.Day,localTime.Hour,localTime.Minute,localTime.Second,miliSeconds)
}
答案 2 :(得分:2)
您可以使用以下代码获取1970年6月1日之后的当前时间毫秒
time.Now().UnixNano()%1e6/1e3