/* go.cypherpunks.ru/tai64n -- Pure Go TAI64/TAI64N implementation Copyright (C) 2020-2022 Sergey Matveev This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3 of the License. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ package main import ( "bufio" "flag" "fmt" "io/ioutil" "log" "os" "strings" "time" "go.cypherpunks.ru/tai64n/v2" ) func main() { log.SetFlags(0) flag.Usage = func() { fmt.Fprintf( flag.CommandLine.Output(), "Replace \"@HEX(TAI64)\"-prefixed line with human readable UTC.\n", ) flag.PrintDefaults() } leapsecs := flag.Bool("leapsecs", false, "Take leap seconds into account: honest TAI->UTC") db := flag.String("leapsecsdb", "", "Use that leapsecs.dat leap seconds database") flag.Parse() if *db != "" { buf, err := ioutil.ReadFile(*db) if err != nil { log.Fatalln(err) } tai64n.LeapsecsDBLoad(buf) } scanner := bufio.NewScanner(os.Stdin) var err error var s string var sep int var t time.Time for { if !scanner.Scan() { if err = scanner.Err(); err != nil { log.Fatalln(err) } break } s = scanner.Text() if s[0] != '@' { os.Stdout.WriteString(s + "\n") continue } sep = strings.IndexByte(s, byte(' ')) if sep == -1 { os.Stdout.WriteString(s + "\n") continue } t, err = tai64n.Decode(s[1:sep]) if err != nil { log.Fatalln(err) } if *leapsecs { t = tai64n.LeapsecsSub(t) } os.Stdout.WriteString(t.Format(tai64n.LocalFmt) + s[sep:] + "\n") } }