This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

Title: Add ability to get tzinfo from a datetime instance in C API
Type: enhancement Stage: resolved
Components: C API, Library (Lib) Versions: Python 3.10
Status: closed Resolution: fixed
Dependencies: 10381 Superseder:
Assigned To: Nosy List: ZackerySpytz, atuining, belopolsky, dlenski, p-ganssle, pitrou
Priority: normal Keywords: patch

Created on 2017-04-24 15:27 by atuining, last changed 2022-04-11 14:58 by admin. This issue is now closed.

Pull Requests
URL Status Linked Edit
PR 21633 merged ZackerySpytz, 2020-07-27 01:44
Messages (7)
msg292230 - (view) Author: Anthony Tuininga (atuining) * Date: 2017-04-24 15:27
Right now there is no documented way to create a datetime instance with a tzinfo instance. The documented macros all hard code the value Py_None for the tzinfo parameter. Using the PyObject_Call() method instead of the macro for creating a datetime instance is ~5x slower.

In addition, there is no macro or method for getting the tzinfo from an existing datetime instance. Perhaps creating DATE_GET_TZINFO and TIME_GET_TZINFO would be acceptable?

The enhancement 10381 ( would also be needed.

I can provide a GitHub PR if that would be helpful. I first want to make sure that such an effort would be appreciated!
msg321112 - (view) Author: Paul Ganssle (p-ganssle) * (Python committer) Date: 2018-07-05 15:54
Hmm. I never noticed this. In the past I have used the (undocumented) PyDateTimeAPI struct, which the official macros wrap. I'm not sure how official that struct is considering it doesn't show up in the documentation.

I agree that it should be possible to construct TZ-aware datetimes using the official C API, so I guess the question is whether to add a bunch more macros or document the existing struct.
msg361722 - (view) Author: Anthony Tuininga (atuining) * Date: 2020-02-10 21:22
Any progress on this?
msg361737 - (view) Author: Paul Ganssle (p-ganssle) * (Python committer) Date: 2020-02-10 22:31
So this bug is asking for two things:

1. An official accessor for the `tzinfo` component of an existing datetime, which I think is very reasonable in light of the fact that there are official accessors for all the other components of a datetime.

2. An official constructor for a timezone-aware datetime, which I think basically exists in the form of PyDatetime_CAPI->PyDateTimeAPI->DateTime_FromDateAndTime / ->DateTime_FromDateAndTimeAndFold, and we just need to document it. I think this is basically a separate issue, and I have opened #39604 to track it.

I'm going to rename this bug to focus only on issue #1. I think we can accept a PR adding two new macros. I would suggest calling them:


Please make sure to add tests to any PR you make. See the CapiTest case ( for examples. You may want to look at the git blame for a few of those tests to see the PRs that they were added in, since part of the tests are defined in a C file.

(As an aside: I don't love that the accessor methods are not available on the struct, since all the "macro-only" code needs to be re-implemented in all other-language bindings. Since the accessors are already all macro-only, though, might as well keep with the tradition for now :P)
msg374009 - (view) Author: Antoine Pitrou (pitrou) * (Python committer) Date: 2020-07-20 14:35
> I'm going to rename this bug to focus only on issue #1. I think we can accept a PR adding two new macros. I would suggest calling them:

+1 for this.
msg374354 - (view) Author: Zackery Spytz (ZackerySpytz) * (Python triager) Date: 2020-07-27 02:00
I have created PR 21633 to add these macros.  Please consider taking a look.
msg377417 - (view) Author: Paul Ganssle (p-ganssle) * (Python committer) Date: 2020-09-23 18:43
New changeset 2e4dd336e5b50fd30947fdecb605ddcd71f7f6f5 by Zackery Spytz in branch 'master':
bpo-30155: Add macros to get tzinfo from datetime instances (GH-21633)
Date User Action Args
2022-04-11 14:58:45adminsetgithub: 74341
2020-10-21 19:51:20p-gansslesetstatus: open -> closed
resolution: fixed
stage: patch review -> resolved
2020-09-23 18:43:53p-gansslesetmessages: + msg377417
2020-07-27 02:00:41ZackerySpytzsetmessages: + msg374354
versions: + Python 3.10, - Python 3.9
2020-07-27 01:44:06ZackerySpytzsetkeywords: + patch
nosy: + ZackerySpytz

pull_requests: + pull_request20775
stage: needs patch -> patch review
2020-07-20 14:35:33pitrousetnosy: + pitrou
messages: + msg374009
2020-02-10 22:31:28p-gansslesettitle: Add ability to get/set tzinfo on datetime instances in C API -> Add ability to get tzinfo from a datetime instance in C API
stage: needs patch
messages: + msg361737
versions: + Python 3.9, - Python 3.6
2020-02-10 21:22:03atuiningsetmessages: + msg361722
2019-12-09 16:15:45belopolskysetdependencies: + Add timezone support to datetime C API
2019-12-09 16:13:43vstinnersetcomponents: + C API
2018-07-05 15:54:14p-gansslesetnosy: + p-ganssle
messages: + msg321112
2017-04-29 15:56:14xiang.zhangsetnosy: + belopolsky
2017-04-24 16:35:31dlenskisetnosy: + dlenski
2017-04-24 15:27:26atuiningcreate