{"record":{"id":"d52a9fdc47be5f80","repo":"python/cpython","slug":"tzname-argument-must-be-a-datetime-instance-or-n","errorCode":null,"errorMessage":"tzname() argument must be a datetime instance or None","messagePattern":"tzname\\(\\) argument must be a datetime instance or None","errorType":"exception","errorClass":"TypeError","httpStatus":null,"severity":"error","filePath":"Lib/_pydatetime.py","lineNumber":2525,"sourceCode":"        return \"%s%s(%r, %r)\" % (_get_class_module(self),\n                                 self.__class__.__qualname__,\n                                 self._offset, self._name)\n\n    def __str__(self):\n        return self.tzname(None)\n\n    def utcoffset(self, dt):\n        if isinstance(dt, datetime) or dt is None:\n            return self._offset\n        raise TypeError(\"utcoffset() argument must be a datetime instance\"\n                        \" or None\")\n\n    def tzname(self, dt):\n        if isinstance(dt, datetime) or dt is None:\n            if self._name is None:\n                return self._name_from_offset(self._offset)\n            return self._name\n        raise TypeError(\"tzname() argument must be a datetime instance\"\n                        \" or None\")\n\n    def dst(self, dt):\n        if isinstance(dt, datetime) or dt is None:\n            return None\n        raise TypeError(\"dst() argument must be a datetime instance\"\n                        \" or None\")\n\n    def fromutc(self, dt):\n        if isinstance(dt, datetime):\n            if dt.tzinfo is not self:\n                raise ValueError(\"fromutc: dt.tzinfo \"\n                                 \"is not self\")\n            return dt + self._offset\n        raise TypeError(\"fromutc() argument must be a datetime instance\"\n                        \" or None\")\n\n    _maxoffset = timedelta(hours=24, microseconds=-1)","sourceCodeStart":2507,"sourceCodeEnd":2543,"githubUrl":"https://github.com/python/cpython/blob/bc6749cc3b5ae4a5e88a6cc2d5b3bebbe354eae6/Lib/_pydatetime.py#L2507-L2543","documentation":"timezone.tzname(dt) returns the configured display name (or derives one like 'UTC+05:30' from the offset when no name was set), but only when dt is a datetime instance or None. Other argument types violate the tzinfo method protocol and raise TypeError.","triggerScenarios":"tz.tzname(date(2024,1,1)); tz.tzname('now'); tz.tzname(int) — typically from generic formatting code or a mistaken belief any hashable key is accepted.","commonSituations":"Report generators calling tzname with date objects; refactors where a datetime variable became a string; third-party tzinfo consumers that forward unvalidated input.","solutions":["Pass a datetime instance or None: tz.tzname(None) is sufficient for fixed zones","Type-check before forwarding in generic wrappers","If you already have an aware datetime dt, prefer dt.tzname() which routes correctly"],"exampleFix":"// before\nname = tz.tzname('2024-01-01')\n\n# after\nname = tz.tzname(None)  # fixed zones ignore dt","handlingStrategy":"type-guard","validationCode":"from datetime import datetime\n\ndef safe_tzname(tz, dt=None):\n    return tz.tzname(dt if isinstance(dt, datetime) or dt is None else None)","typeGuard":"from datetime import datetime\n\ndef is_datetime_or_none(v) -> bool:\n    return v is None or isinstance(v, datetime)","tryCatchPattern":null,"preventionTips":["Call dt.tzname() on aware datetimes instead of tz.tzname(dt)","tz.tzname(None) suffices for fixed-offset zones","Type-check forwarded values in generic tzinfo consumers"],"tags":["python","datetime","timezone","type-error","api-protocol"],"backgroundTag":null,"analyzedSha":"bc6749cc3b5ae4a5e88a6cc2d5b3bebbe354eae6","analyzedAt":"2026-08-14T22:01:13.976Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}