// date_ops — 日期操作 // 支援: now, format, parse // TinyGo time 套件支援有限,只實作基本功能 // //go:build tinygo package main import ( "encoding/json" "io" "os" "time" ) type Args struct { Layout string `json:"layout"` } type Input struct { Operation string `json:"operation"` Input string `json:"input"` Args Args `json:"args"` } func main() { raw, err := io.ReadAll(os.Stdin) if err != nil { writeError("failed to read stdin: " + err.Error()) return } var input Input if err := json.Unmarshal(raw, &input); err != nil { writeError("invalid input JSON: " + err.Error()) return } if input.Operation == "" { writeError("operation 必填") return } switch input.Operation { case "now": result := time.Now().UTC().Format(time.RFC3339) writeResult("now", result) case "format": if input.Input == "" { writeError("format 需要 input 日期字串") return } t, err := time.Parse(time.RFC3339, input.Input) if err != nil { // 嘗試其他格式 t, err = time.Parse("2006-01-02", input.Input) if err != nil { writeError("無法解析日期: " + err.Error()) return } } layout := input.Args.Layout if layout == "" { layout = time.RFC3339 } writeResult("format", t.Format(layout)) case "parse": if input.Input == "" { writeError("parse 需要 input 日期字串") return } t, err := time.Parse(time.RFC3339, input.Input) if err != nil { t, err = time.Parse("2006-01-02", input.Input) if err != nil { writeError("無法解析日期: " + err.Error()) return } } writeResult("parse", map[string]interface{}{ "iso": t.UTC().Format(time.RFC3339), "year": t.Year(), "month": int(t.Month()), "day": t.Day(), "hour": t.Hour(), "min": t.Minute(), "sec": t.Second(), }) default: writeError("不支援的 operation: " + input.Operation) } } func writeResult(op string, result interface{}) { out, _ := json.Marshal(map[string]interface{}{ "success": true, "data": map[string]interface{}{"result": result, "operation": op}, }) os.Stdout.Write(out) } func writeError(msg string) { out, _ := json.Marshal(map[string]interface{}{"success": false, "error": msg}) os.Stdout.Write(out) }