{"record":{"id":"f92cf7f115c8cd0f","repo":"fish2018/pansou","slug":"s-f92cf7","errorCode":null,"errorMessage":"无法解析日期时间: %s","messagePattern":"无法解析日期时间: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"plugin/hdr4k/hdr4k.go","lineNumber":641,"sourceCode":"}\n\n// parseDateTime 解析日期时间字符串\nfunc (p *Hdr4kAsyncPlugin) parseDateTime(dateStr string) (time.Time, error) {\n\t// 4KHDR的时间格式：2025-4-9 19:55\n\tlayouts := []string{\n\t\t\"2006-1-2 15:04\",\n\t\t\"2006-01-02 15:04:05\",\n\t\t\"2006-1-2 15:04:05\",\n\t\t\"2006-01-02 15:04\",\n\t}\n\t\n\tfor _, layout := range layouts {\n\t\tif t, err := time.Parse(layout, dateStr); err == nil {\n\t\t\treturn t, nil\n\t\t}\n\t}\n\t\n\treturn time.Time{}, fmt.Errorf(\"无法解析日期时间: %s\", dateStr)\n}\n\n// cleanHTML 清理HTML标签和特殊字符\nfunc (p *Hdr4kAsyncPlugin) cleanHTML(html string) string {\n\t// 替换常见HTML标签和实体\n\treplacements := map[string]string{\n\t\t\"<strong>\":                     \"\",\n\t\t\"</strong>\":                    \"\",\n\t\t\"<font color=\\\"#ff0000\\\">\":     \"\",\n\t\t\"</font>\":                      \"\",\n\t\t\"<em>\":                         \"\",\n\t\t\"</em>\":                        \"\",\n\t\t\"<b>\":                          \"\",\n\t\t\"</b>\":                         \"\",\n\t\t\"<br>\":                         \"\\n\",\n\t\t\"<br/>\":                        \"\\n\",\n\t\t\"<br />\":                       \"\\n\",\n\t\t\"&nbsp;\":                       \" \",","sourceCodeStart":623,"sourceCodeEnd":659,"githubUrl":"https://github.com/fish2018/pansou/blob/beaa56133755a548ebc51b090b3816e2ae044aa6/plugin/hdr4k/hdr4k.go#L623-L659","documentation":"parseDateTime tried every layout in its layouts slice against dateStr and none matched, so it returns this error with the offending string. The plugin scrapes human-formatted post dates, and any format variation breaks parsing.","triggerScenarios":"A date string extracted from a detail page does not match any of the predefined time.Parse layouts — e.g. locale-specific month names, missing timezone suffix, new format like '3 天前', or extra whitespace/HTML entities left in the string.","commonSituations":"Site changes its date rendering, relative dates ('昨天', 'x 小时前') appearing instead of absolute timestamps, Chinese-vs-English month names, or uncleaned whitespace/nbsp in the extracted text.","solutions":["Log dateStr and add the missing layout to the layouts slice (time.Parse layouts, reference 2006-01-02 15:04:05).","Clean the string first: trim whitespace, decode HTML entities (e.g. &nbsp;), collapse inner spaces.","Add fallback handling for relative dates (天前/小时前/分钟前) by converting them to absolute times.","Return a sensible zero-value fallback (e.g. time.Now()) for display-only fields instead of failing the whole detail parse."],"exampleFix":"// before\nlayouts := []string{\"2006-01-02 15:04:05\", \"2006-01-02\"}\nfor _, layout := range layouts {\n    if t, err := time.Parse(layout, dateStr); err == nil {\n        return t, nil\n    }\n}\nreturn time.Time{}, fmt.Errorf(\"无法解析日期时间: %s\", dateStr)\n// after\ndateStr = strings.TrimSpace(dateStr)\nif days, ok := matchRelativeDays(dateStr); ok { // e.g. \"3天前\"\n    return time.Now().AddDate(0, 0, -days), nil\n}\nlayouts := append(layouts, \"2006-01-02 15:04\", \"2006年01月02日 15:04\")\nfor _, layout := range layouts {\n    if t, err := time.Parse(layout, dateStr); err == nil {\n        return t, nil\n    }\n}\nreturn time.Time{}, fmt.Errorf(\"无法解析日期时间: %s\", dateStr)","handlingStrategy":"fallback","validationCode":"dateStr = strings.TrimSpace(html.UnescapeString(rawDate))\nif dateStr == \"\" {\n    // no date available; skip parse entirely\n    return\n}\nfor _, layout := range knownLayouts {\n    if _, err := time.Parse(layout, dateStr); err == nil {\n        return\n    }\n}","typeGuard":"func looksLikeDate(s string) bool {\n    s = strings.TrimSpace(s)\n    for _, layout := range knownLayouts {\n        if _, err := time.Parse(layout, s); err == nil {\n            return true\n        }\n    }\n    return false\n}","tryCatchPattern":"t, err := parseDateTime(raw)\nif err != nil {\n    log.Printf(\"date parse failed for %q, using now: %v\", raw, err)\n    t = time.Now() // degrade gracefully for display-only usage\n}","preventionTips":["Clean scraped text (trim, unescape entities) before parsing dates","Keep a broad layout list and add new site formats as soon as observed","Support relative dates (昨天/小时前) with explicit converters","Treat dates as non-critical: fall back instead of failing the whole item"],"tags":["date-parsing","scraping","format-parsing","go"],"backgroundTag":"invalid-date-format","analyzedSha":"beaa56133755a548ebc51b090b3816e2ae044aa6","analyzedAt":"2026-09-07T00:31:18.025Z","contentChangedAt":"2026-09-07T00:31:18.025Z","schemaVersion":2},"datasetVersion":"2026-09-15T23:17:13.987Z"}