87 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Go
		
	
	
			
		
		
	
	
			87 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Go
		
	
	
| package main
 | |
| 
 | |
| import (
 | |
| 	"flag"
 | |
| 	"fmt"
 | |
| 	"os"
 | |
| 	"os/signal"
 | |
| 	"syscall"
 | |
| 	"time"
 | |
| 
 | |
| 	"github.com/mattn/go-isatty"
 | |
| )
 | |
| 
 | |
| var (
 | |
| 	Version = "0.0.0"
 | |
| 	Build   = "alpha"
 | |
| 
 | |
| 	local    string
 | |
| 	flagTick string
 | |
| 	flagVer  bool
 | |
| )
 | |
| 
 | |
| func main() {
 | |
| 
 | |
| 	flag.StringVar(&local, "local", fmt.Sprint(time.Local), "set local manually")
 | |
| 	flag.StringVar(&flagTick, "tick", "1s", "ticking interval")
 | |
| 	flag.BoolVar(&flagVer, "v", false, "show version")
 | |
| 	flag.Usage = func() {
 | |
| 		fmt.Fprintf(os.Stderr, "Usage: kclock [options]\n")
 | |
| 		flag.PrintDefaults()
 | |
| 	}
 | |
| 
 | |
| 	flag.Parse()
 | |
| 
 | |
| 	if flagVer {
 | |
| 		fmt.Printf("%v - %v\n", Version, Build)
 | |
| 		return
 | |
| 	}
 | |
| 
 | |
| 	l, err := time.LoadLocation(local)
 | |
| 	if err != nil {
 | |
| 		panic(err)
 | |
| 	}
 | |
| 	time.Local = l
 | |
| 
 | |
| 	watch()
 | |
| 
 | |
| }
 | |
| 
 | |
| func watch() {
 | |
| 	interval, err := time.ParseDuration(flagTick)
 | |
| 	if err != nil {
 | |
| 		panic(err)
 | |
| 	}
 | |
| 	color := isatty.IsTerminal(os.Stdout.Fd())
 | |
| 	if !color {
 | |
| 		color = isatty.IsCygwinTerminal(os.Stdout.Fd())
 | |
| 	}
 | |
| 	quit := make(chan os.Signal, 1)
 | |
| 	signal.Notify(quit, os.Interrupt, syscall.SIGINT, syscall.SIGTERM)
 | |
| 
 | |
| 	start := time.Now()
 | |
| 	<-time.After(time.Until(time.Now().Truncate(time.Second).Add(time.Second)))
 | |
| 	tick := time.Tick(interval)
 | |
| 	if color {
 | |
| 		fmt.Printf("\n")
 | |
| 	}
 | |
| 	for {
 | |
| 		if color {
 | |
| 			fmt.Printf("\r\033[1A\033[0K\033[32m%v\033[0m\n", time.Now().Truncate(time.Second))
 | |
| 		} else {
 | |
| 			fmt.Printf("%v\n", time.Now().Truncate(time.Second))
 | |
| 		}
 | |
| 		select {
 | |
| 		case <-tick:
 | |
| 		case <-quit:
 | |
| 			if color {
 | |
| 				fmt.Printf("\r\033[0Ktime elapsed: \033[34m%v\033[0m\n", time.Since(start))
 | |
| 			} else {
 | |
| 				fmt.Printf("time elapsed: %v\n", time.Since(start))
 | |
| 			}
 | |
| 			return
 | |
| 		}
 | |
| 
 | |
| 	}
 | |
| }
 |