diff --git a/README.md b/README.md index 2fb92b2..d4ba202 100644 --- a/README.md +++ b/README.md @@ -29,10 +29,18 @@ gotz Show arbitrary time: ```bash -gotz 23 +gotz 15 ``` -![preview](material/screenshot/gotz-23.png) +![preview](material/screenshot/gotz-15.png) + +Show arbitrary time using different timezone (index based): + +```bash +gotz 15@1 +``` + +![preview](material/screenshot/gotz-15-1.png) Time can be one of the following formats: diff --git a/core/args.go b/core/args.go index fbb254c..f0e3d1f 100644 --- a/core/args.go +++ b/core/args.go @@ -4,6 +4,7 @@ import ( "flag" "fmt" "os" + "strconv" "strings" "time" ) @@ -65,7 +66,7 @@ func ParseFlags(startConfig Config, appVersion string) (Config, time.Time, bool, // Define direct flags var requestTime string - var t time.Time = time.Time{} + var rt time.Time = time.Time{} flag.StringVar( &requestTime, "time", @@ -87,7 +88,7 @@ func ParseFlags(startConfig Config, appVersion string) (Config, time.Time, bool, changed = true tzs, err := parseTimezones(timezones) if err != nil { - return startConfig, time.Time{}, changed, err + return startConfig, rt, changed, err } startConfig.Timezones = tzs } @@ -96,7 +97,7 @@ func ParseFlags(startConfig Config, appVersion string) (Config, time.Time, bool, startConfig.Style.Symbols = symbols symbolError := checkSymbolMode(startConfig.Style.Symbols) if symbolError != nil { - return startConfig, time.Time{}, changed, symbolError + return startConfig, rt, changed, symbolError } } if tics != "" { @@ -106,7 +107,7 @@ func ParseFlags(startConfig Config, appVersion string) (Config, time.Time, bool, } else if strings.ToLower(tics) == "false" { startConfig.Tics = false } else { - return startConfig, time.Time{}, changed, fmt.Errorf("invalid value for tics: %s", tics) + return startConfig, rt, changed, fmt.Errorf("invalid value for tics: %s", tics) } } if stretch != "" { @@ -116,7 +117,7 @@ func ParseFlags(startConfig Config, appVersion string) (Config, time.Time, bool, } else if strings.ToLower(stretch) == "false" { startConfig.Stretch = false } else { - return startConfig, time.Time{}, changed, fmt.Errorf("invalid value for stretch: %s", stretch) + return startConfig, rt, changed, fmt.Errorf("invalid value for stretch: %s", stretch) } } if colorize != "" { @@ -126,7 +127,7 @@ func ParseFlags(startConfig Config, appVersion string) (Config, time.Time, bool, } else if strings.ToLower(colorize) == "false" { startConfig.Style.Colorize = false } else { - return startConfig, time.Time{}, changed, fmt.Errorf("invalid value for colorize: %s", colorize) + return startConfig, rt, changed, fmt.Errorf("invalid value for colorize: %s", colorize) } } if hours12 != "" { @@ -136,7 +137,7 @@ func ParseFlags(startConfig Config, appVersion string) (Config, time.Time, bool, } else if strings.ToLower(hours12) == "false" { startConfig.Hours12 = false } else { - return startConfig, time.Time{}, changed, fmt.Errorf("invalid value for hours12: %s", hours12) + return startConfig, rt, changed, fmt.Errorf("invalid value for hours12: %s", hours12) } } if live != "" { @@ -146,18 +147,18 @@ func ParseFlags(startConfig Config, appVersion string) (Config, time.Time, bool, } else if strings.ToLower(live) == "false" { startConfig.Live = false } else { - return startConfig, time.Time{}, changed, fmt.Errorf("invalid value for live: %s", live) + return startConfig, rt, changed, fmt.Errorf("invalid value for live: %s", live) } } // Handle direct flags if requestTime != "" { // Parse time - rTime, err := parseTime(requestTime) + rTime, err := parseRequestTime(startConfig, requestTime) if err != nil { - return startConfig, time.Time{}, changed, err + return startConfig, rt, changed, err } - t = rTime + rt = rTime } // Handle last argument as time, if it starts with a digit @@ -167,15 +168,15 @@ func ParseFlags(startConfig Config, appVersion string) (Config, time.Time, bool, // If last argument is a time, parse it if len(lastArg) > 0 && lastArg[0] >= '0' && lastArg[0] <= '9' { // Parse time - rTime, err := parseTime(lastArg) + rTime, err := parseRequestTime(startConfig, lastArg) if err != nil { - return startConfig, time.Time{}, changed, err + return startConfig, rt, changed, err } - t = rTime + rt = rTime } } - return startConfig, t, changed, nil + return startConfig, rt, changed, nil } // parseTimezones parses a comma-separated list of timezones. @@ -230,8 +231,47 @@ type inputTimeFormat struct { TZInfo bool } -// parseTime parses a time string. -func parseTime(t string) (time.Time, error) { +// parseRequestTime parses a requested time in various formats. Furthermore, it +// reads an optional timezone index and uses its timezone instead of local. +func parseRequestTime(config Config, t string) (time.Time, error) { + tzSeparator := "@" + tz := time.Local + // Check whether a different time zone than the local one was specified. + if strings.Contains(t, tzSeparator) { + // Split time and timezone + parts := strings.Split(t, tzSeparator) + if len(parts) != 2 { + return time.Time{}, fmt.Errorf("invalid time format: %s (should be /