{"record":{"id":"9ac35f1ffa39181a","repo":"sansan0/TrendRadar","slug":"date-strftime-y-m-d","errorCode":null,"errorMessage":"不能查询未来的日期: {date.strftime('%Y-%m-%d')}","messagePattern":"不能查询未来的日期: (.+?)","errorType":"validation","errorClass":"InvalidParameterError","httpStatus":null,"severity":"error","filePath":"mcp_server/utils/date_parser.py","lineNumber":306,"sourceCode":"        Examples:\n            >>> DateParser.format_date_folder(datetime(2025, 10, 11))\n            '2025-10-11'\n        \"\"\"\n        return date.strftime(\"%Y-%m-%d\")\n\n    @staticmethod\n    def validate_date_not_future(date: datetime) -> None:\n        \"\"\"\n        验证日期不在未来\n\n        Args:\n            date: 待验证的日期\n\n        Raises:\n            InvalidParameterError: 日期在未来\n        \"\"\"\n        if date.date() > datetime.now().date():\n            raise InvalidParameterError(\n                f\"不能查询未来的日期: {date.strftime('%Y-%m-%d')}\",\n                suggestion=\"请使用今天或过去的日期\"\n            )\n\n    @staticmethod\n    def validate_date_not_too_old(date: datetime, max_days: int = 365) -> None:\n        \"\"\"\n        验证日期不太久远\n\n        Args:\n            date: 待验证的日期\n            max_days: 最大天数\n\n        Raises:\n            InvalidParameterError: 日期太久远\n        \"\"\"\n        days_ago = (datetime.now().date() - date.date()).days\n        if days_ago > max_days:","sourceCodeStart":288,"sourceCodeEnd":324,"githubUrl":"https://github.com/sansan0/TrendRadar/blob/8ee26026ba6c11dec41a95fb3895a7162876caa1/mcp_server/utils/date_parser.py#L288-L324","documentation":"Thrown by DateParser.validate_date_not_future when the parsed date's calendar day is strictly after today. The underlying dataset is historical news, so future dates can never return data and are rejected up front.","triggerScenarios":"Any flow that parses a date then calls validate_date_not_future with tomorrow-or-later: explicit future ISO dates, or relative math that overshoots (none built in, but caller-computed datetimes do); note equality with today is allowed.","commonSituations":"Timezone skew — a client ahead of server-local time passing 'today' that lands tomorrow server-side; typos in the year (2026 vs 2025); scheduled/future-dated content being queried against a historical index.","solutions":["Use today or a past date","Fix timezone handling: derive dates in the server's local timezone or pass explicit absolute dates","Clamp parsed dates: if date > today, use today"],"exampleFix":"# before\nDateParser.validate_date_not_future(datetime(2026, 1, 1))  # raises\n\n# after\nq = min(datetime.now(), datetime(2026, 1, 1))\nDateParser.validate_date_not_future(q)","handlingStrategy":"validation","validationCode":"from datetime import datetime\n\ndef clamp_to_present(d: datetime) -> datetime:\n    return min(d, datetime.now())","typeGuard":"def is_not_future(d) -> bool:\n    from datetime import datetime\n    return d.date() <= datetime.now().date()","tryCatchPattern":"try:\n    DateParser.validate_date_not_future(d)\nexcept InvalidParameterError as e:\n    if \"未来的日期\" in str(e):\n        d = datetime.now()  # clamp to today and continue\n    else:\n        raise","preventionTips":["Generate all query dates in the server's timezone","Clamp caller-supplied dates to today before validation","Watch year typos (off-by-one in the year component)"],"tags":["date","validation","timezone"],"backgroundTag":null,"analyzedSha":"8ee26026ba6c11dec41a95fb3895a7162876caa1","analyzedAt":"2026-08-15T01:42:18.084Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}