From 5442dcbedaf9e0b9ff05363f098396eba2907eba Mon Sep 17 00:00:00 2001 From: huang Date: Thu, 23 Apr 2026 14:20:02 +0800 Subject: [PATCH] =?UTF-8?q?=E6=97=B6=E9=97=B4=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cmd/api/main.go | 59 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/cmd/api/main.go b/cmd/api/main.go index 0593001..67a2985 100644 --- a/cmd/api/main.go +++ b/cmd/api/main.go @@ -1,9 +1,12 @@ package main import ( + stdErrors "errors" "os" "os/signal" + "reflect" "strconv" + "strings" "syscall" "time" @@ -197,6 +200,8 @@ func closeQueue(queueClient *queue.Client, appLogger *zap.Logger) { // createFiberApp 创建 Fiber 应用 func createFiberApp(cfg *config.Config, appLogger *zap.Logger) *fiber.App { + registerTimeParserCompat() + return fiber.New(fiber.Config{ AppName: "君鸿卡管系统 v1.0.0", StrictRouting: true, @@ -210,6 +215,60 @@ func createFiberApp(cfg *config.Config, appLogger *zap.Logger) *fiber.App { }) } +// registerTimeParserCompat 注册时间参数解析兼容器 +// 兼容格式:RFC3339、2006-01-02、2006-01-02 15:04:05、2006-01-02T15:04:05 +func registerTimeParserCompat() { + fiber.SetParserDecoder(fiber.ParserConfig{ + IgnoreUnknownKeys: true, + ZeroEmpty: true, + ParserType: []fiber.ParserType{ + { + Customtype: time.Time{}, + Converter: func(value string) reflect.Value { + parsedTime, err := parseFlexibleTime(value) + if err != nil { + return reflect.Value{} + } + return reflect.ValueOf(parsedTime) + }, + }, + }, + }) +} + +// parseFlexibleTime 解析多种常见时间格式 +func parseFlexibleTime(value string) (time.Time, error) { + trimmed := strings.TrimSpace(value) + if trimmed == "" { + return time.Time{}, nil + } + + // 优先支持带时区的标准时间格式。 + if parsed, err := time.Parse(time.RFC3339, trimmed); err == nil { + return parsed, nil + } + + // 兼容无时区格式,按服务器本地时区解析。 + layouts := []string{ + "2006-01-02 15:04:05", + "2006-01-02T15:04:05", + "2006-01-02", + } + var parseErr error + for _, layout := range layouts { + if parsed, err := time.ParseInLocation(layout, trimmed, time.Local); err == nil { + return parsed, nil + } else { + parseErr = err + } + } + + if parseErr == nil { + parseErr = stdErrors.New("时间格式不支持") + } + return time.Time{}, parseErr +} + // initMiddleware 注册中间件 func initMiddleware(app *fiber.App, cfg *config.Config, appLogger *zap.Logger) { // 1. Recover - 必须第一个,捕获所有 panic