package main
import (
"fmt"
"strconv"
"time"
"os"
"sync"
)
var count int//300000~999999 everyday
var mutex sync.Mutex
var tracefile *os.File
var fmutex sync.Mutex
var ltime time.Time
var tmutex sync.Mutex
func setTraceNo(trace int){
mutex.Lock()
defer mutex.Unlock()
count = trace
}
func flushTraceNo() int{
mutex.Lock()
defer mutex.Unlock()
count++
flushTraceFile(count)
return count
}
func setLocalTime(){
tmutex.Lock()
defer tmutex.Unlock()
ltime = time.Now()
}
func flushLocalTime(){
for{
tormorrow := ltime.AddDate(0,0,1)
t := time.Date(tormorrow.Year(),tormorrow.Month(),tormorrow.Day(),0,0,0,0,time.Local)
//du := time.Duration(t.UnixNano()-ltime.UnixNano())*time.Nanosecond
du := t.Sub(ltime)
/*
tormorrow := ltime.Add(time.Minute)
t := time.Date(tormorrow.Year(),tormorrow.Month(),tormorrow.Day(),tormorrow.Hour(),tormorrow.Minute(),tormorrow.Second(),0,time.Local)
du := time.Duration(t.Unix()-ltime.Unix())*time.Second
*/
fmt.Println("du",du)
//tc := time.After(du)//有机会出现空的管道...
//<-tc
time.Sleep(du)
setLocalTime()
setTraceFile()
}
}
func setTraceFile(){
fmutex.Lock()
defer fmutex.Unlock()
//tracepath := fmt.Sprintf("./trace.%04d%02d%02d%02d%02d%02d",ltime.Year(),ltime.Month(),ltime.Day(),ltime.Hour(),ltime.Minute(),ltime.Second())
tracepath := fmt.Sprintf("./trace.%04d%02d%02d",ltime.Year(),ltime.Month(),ltime.Day())
var err error
if tracefile != nil{
tracefile.Close()
}
tracefile,err = os.OpenFile(tracepath,os.O_RDWR,0664)
if err!= nil{
tracefile,err = os.OpenFile(tracepath,os.O_RDWR|os.O_CREATE|os.O_TRUNC,0664)
tracefile.Write([]byte("299999"))
setTraceNo(299999)
}else{
var b [6]byte
_,_ = tracefile.Read(b[:])
trace,_ := strconv.Atoi(string(b[:]))
setTraceNo(trace)
}
}
func flushTraceFile(trace int){
fmutex.Lock()
defer fmutex.Unlock()
tracefile.Seek(0,os.SEEK_SET)
tracefile.Write([]byte(strconv.FormatInt(int64(trace),10)))
}
func main(){
setLocalTime()
go flushLocalTime()
setTraceFile()
for{
fmt.Println(flushTraceNo())
time.Sleep(time.Second)
}
}
实现的是,每天00:00,重置计数;重启程序不会重置计数,通过读文件得到上一次计数的值。