-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathunixtime.go
120 lines (98 loc) · 1.92 KB
/
unixtime.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
package main
import (
"flag"
"fmt"
"os"
"strconv"
"strings"
"time"
)
var (
isVerbose = false
)
func main() {
var d = flag.String("date", "", "date string")
var v = flag.Bool("v", false, "verbose")
flag.Parse()
isVerbose = *v
switch {
case *d != "":
if *d == "now" {
printNow()
} else {
convertDateString(*d)
}
case len(flag.Args()) > 0:
convertUnixTimestamp(flag.Arg(0))
default:
// read from stdin
readFromStdin()
}
}
func convertUnixTimestamp(str string) {
const NANO = 1e9
var secondStr, nanoStr string
if strings.Contains(str, ".") {
str = strings.ReplaceAll(str, ".", "")
}
secondStr = str
if len(str) > 10 {
secondStr = str[0:10]
nanoStr = str[10:]
}
if isVerbose {
fmt.Printf("secondStr: %v\n", secondStr)
fmt.Printf("nanoStr: %v\n", nanoStr)
}
second, err := strconv.ParseInt(secondStr, 10, 64)
if err != nil {
panic(err)
}
var nano int64 = 0
if nanoStr != "" {
nanoFloat, err := strconv.ParseFloat("0."+nanoStr, 64)
if err != nil {
panic(err)
}
nano = int64(nanoFloat * NANO)
}
tm := time.Unix(second, nano)
fmt.Printf("date: %v\tnano: %v\n", tm, nano)
}
func convertDateString(dateStr string) {
loc, err := time.LoadLocation("Asia/Shanghai")
if err != nil {
fmt.Printf("LoadLocation failed, %s\n", err)
return
}
t, err := time.ParseInLocation("2006-01-02 15:04:05", dateStr, loc)
if err != nil {
fmt.Printf("parse time failed, %s\n", err)
return
}
fmt.Printf("time:\n\t%s\n", t)
fmt.Printf("unix:\n\t%d\n", t.Unix())
}
func printNow() {
ts := time.Now()
fmt.Printf("\nnow:\n%s\nts: %d\n", ts, ts.Unix())
}
func readFromStdin() {
buf := make([]byte, 1024)
for {
n, err := os.Stdin.Read(buf)
if err != nil {
fmt.Printf("read from stdin failed, %s\n", err)
return
}
if n == 0 {
break
}
for i := 0; i < n; i++ {
if buf[i] == '\n' || buf[i] == '\r' {
line := string(buf[0:i])
convertUnixTimestamp(line)
}
}
}
}