-
Notifications
You must be signed in to change notification settings - Fork 13
Expand file tree
/
Copy pathdate-and-time.html
More file actions
320 lines (246 loc) · 91.9 KB
/
date-and-time.html
File metadata and controls
320 lines (246 loc) · 91.9 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
<!DOCTYPE html>
<html lang="en-US">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Python - Date and Time</title>
<meta name="generator" content="VuePress 1.8.2">
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png">
<link rel="manifest" href="/site.webmanifest">
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png">
<link rel="mask-icon" href="/safari-pinned-tab.svg" color="#5bbad5">
<meta name="description" content="Parsing a string into a timezone aware datetime object, Constructing timezone-aware datetimes, Basic datetime objects usage, Computing time differences, Simple date arithmetic , Switching between time zones, Converting timestamp to datetime, Subtracting months from a date accurately, Iterate over dates, Parsing a string with a short time zone name into a timezone aware datetime object, Fuzzy datetime parsing (extracting datetime out of a text), Parsing an arbitrary ISO 8601 timestamp with minimal libraries, Get an ISO 8601 timestamp">
<meta property="og:site_name" content="DevTut">
<meta property="og:title" content="Python - Date and Time">
<meta property="og:description" content="Parsing a string into a timezone aware datetime object, Constructing timezone-aware datetimes, Basic datetime objects usage, Computing time differences, Simple date arithmetic , Switching between time zones, Converting timestamp to datetime, Subtracting months from a date accurately, Iterate over dates, Parsing a string with a short time zone name into a timezone aware datetime object, Fuzzy datetime parsing (extracting datetime out of a text), Parsing an arbitrary ISO 8601 timestamp with minimal libraries, Get an ISO 8601 timestamp">
<meta property="og:type" content="article">
<meta property="og:url" content="/python/date-and-time.html">
<meta property="og:image" content="/logo.png">
<meta name="twitter:title" content="Python - Date and Time">
<meta name="twitter:description" content="Parsing a string into a timezone aware datetime object, Constructing timezone-aware datetimes, Basic datetime objects usage, Computing time differences, Simple date arithmetic , Switching between time zones, Converting timestamp to datetime, Subtracting months from a date accurately, Iterate over dates, Parsing a string with a short time zone name into a timezone aware datetime object, Fuzzy datetime parsing (extracting datetime out of a text), Parsing an arbitrary ISO 8601 timestamp with minimal libraries, Get an ISO 8601 timestamp">
<meta name="twitter:url" content="/python/date-and-time.html">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:image" content="/logo.png">
<meta name="theme-color" content="#ffffff">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black">
<meta name="msapplication-TileImage" content="/mstile-150x150.png">
<meta name="msapplication-TileColor" content="#da532c">
<meta name="google-site-verification" content="76_rKXgwMVIjd-axJC_1zPV9OS4mEjvtgjYOWVkAdnQ">
<link rel="preload" href="/assets/css/0.styles.60619e34.css" as="style"><link rel="preload" href="/assets/js/app.1779e102.js" as="script"><link rel="preload" href="/assets/js/3.2cfa8016.js" as="script"><link rel="preload" href="/assets/js/2687.cf2c80ff.js" as="script">
<link rel="stylesheet" href="/assets/css/0.styles.60619e34.css">
</head>
<body>
<div id="app" data-server-rendered="true"><div class="theme-container"><header class="navbar"><div class="sidebar-button"><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" role="img" viewBox="0 0 448 512" class="icon"><path fill="currentColor" d="M436 124H12c-6.627 0-12-5.373-12-12V80c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12z"></path></svg></div> <a href="/" class="home-link router-link-active"><!----> <span class="site-name">DevTut</span></a> <div class="links"><form id="search-form" role="search" class="algolia-search-wrapper search-box"><input id="algolia-search-input" class="search-query"></form> <nav class="nav-links can-hide"> <a href="https://github.com/devtut/generate" target="_blank" rel="noopener noreferrer" class="repo-link">
GitHub
<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></nav></div></header> <div class="sidebar-mask"></div> <aside class="sidebar"><nav class="nav-links"> <a href="https://github.com/devtut/generate" target="_blank" rel="noopener noreferrer" class="repo-link">
GitHub
<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></nav> <ul class="sidebar-links"><li><section class="sidebar-group depth-0"><p class="sidebar-heading open"><span>Python</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/python/" aria-current="page" class="sidebar-link">Disclaimer</a></li><li><a href="/python/getting-started-with-python-language.html" class="sidebar-link">Getting started with Python Language</a></li><li><a href="/python/python-data-types.html" class="sidebar-link">Python Data Types</a></li><li><a href="/python/indentation.html" class="sidebar-link">Indentation</a></li><li><a href="/python/comments-and-documentation.html" class="sidebar-link">Comments and Documentation</a></li><li><a href="/python/date-and-time.html" aria-current="page" class="active sidebar-link">Date and Time</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/python/date-and-time.html#parsing-a-string-into-a-timezone-aware-datetime-object" class="sidebar-link">Parsing a string into a timezone aware datetime object</a></li><li class="sidebar-sub-header"><a href="/python/date-and-time.html#constructing-timezone-aware-datetimes" class="sidebar-link">Constructing timezone-aware datetimes</a></li><li class="sidebar-sub-header"><a href="/python/date-and-time.html#basic-datetime-objects-usage" class="sidebar-link">Basic datetime objects usage</a></li><li class="sidebar-sub-header"><a href="/python/date-and-time.html#computing-time-differences" class="sidebar-link">Computing time differences</a></li><li class="sidebar-sub-header"><a href="/python/date-and-time.html#simple-date-arithmetic" class="sidebar-link">Simple date arithmetic</a></li><li class="sidebar-sub-header"><a href="/python/date-and-time.html#switching-between-time-zones" class="sidebar-link">Switching between time zones</a></li><li class="sidebar-sub-header"><a href="/python/date-and-time.html#converting-timestamp-to-datetime" class="sidebar-link">Converting timestamp to datetime</a></li><li class="sidebar-sub-header"><a href="/python/date-and-time.html#subtracting-months-from-a-date-accurately" class="sidebar-link">Subtracting months from a date accurately</a></li><li class="sidebar-sub-header"><a href="/python/date-and-time.html#iterate-over-dates" class="sidebar-link">Iterate over dates</a></li><li class="sidebar-sub-header"><a href="/python/date-and-time.html#parsing-a-string-with-a-short-time-zone-name-into-a-timezone-aware-datetime-object" class="sidebar-link">Parsing a string with a short time zone name into a timezone aware datetime object</a></li><li class="sidebar-sub-header"><a href="/python/date-and-time.html#fuzzy-datetime-parsing-extracting-datetime-out-of-a-text" class="sidebar-link">Fuzzy datetime parsing (extracting datetime out of a text)</a></li><li class="sidebar-sub-header"><a href="/python/date-and-time.html#parsing-an-arbitrary-iso-8601-timestamp-with-minimal-libraries" class="sidebar-link">Parsing an arbitrary ISO 8601 timestamp with minimal libraries</a></li><li class="sidebar-sub-header"><a href="/python/date-and-time.html#get-an-iso-8601-timestamp" class="sidebar-link">Get an ISO 8601 timestamp</a></li></ul></li><li><a href="/python/enum.html" class="sidebar-link">Enum</a></li><li><a href="/python/set.html" class="sidebar-link">Set</a></li><li><a href="/python/simple-mathematical-operators.html" class="sidebar-link">Simple Mathematical Operators</a></li><li><a href="/python/bitwise-operators.html" class="sidebar-link">Bitwise Operators</a></li><li><a href="/python/boolean-operators.html" class="sidebar-link">Boolean Operators</a></li><li><a href="/python/operator-precedence.html" class="sidebar-link">Operator Precedence</a></li><li><a href="/python/variable-scope-and-binding.html" class="sidebar-link">Variable Scope and Binding</a></li><li><a href="/python/conditionals.html" class="sidebar-link">Conditionals</a></li><li><a href="/python/comparisons.html" class="sidebar-link">Comparisons</a></li><li><a href="/python/loops.html" class="sidebar-link">Loops</a></li><li><a href="/python/arrays.html" class="sidebar-link">Arrays</a></li><li><a href="/python/multidimensional-arrays.html" class="sidebar-link">Multidimensional arrays</a></li><li><a href="/python/dictionary.html" class="sidebar-link">Dictionary</a></li><li><a href="/python/list.html" class="sidebar-link">List</a></li><li><a href="/python/list-comprehensions.html" class="sidebar-link">List Comprehensions</a></li><li><a href="/python/list-slicing-selecting-parts-of-lists.html" class="sidebar-link">List slicing (selecting parts of lists)</a></li><li><a href="/python/groupby.html" class="sidebar-link">groupby()</a></li><li><a href="/python/linked-lists.html" class="sidebar-link">Linked lists</a></li><li><a href="/python/linked-list-node.html" class="sidebar-link">Linked List Node</a></li><li><a href="/python/filter.html" class="sidebar-link">Filter</a></li><li><a href="/python/heapq.html" class="sidebar-link">Heapq</a></li><li><a href="/python/tuple.html" class="sidebar-link">Tuple</a></li><li><a href="/python/basic-input-and-output.html" class="sidebar-link">Basic Input and Output</a></li><li><a href="/python/files-folders-i-o.html" class="sidebar-link">Files & Folders I/O</a></li><li><a href="/python/os-path.html" class="sidebar-link">os.path</a></li><li><a href="/python/iterables-and-iterators.html" class="sidebar-link">Iterables and Iterators</a></li><li><a href="/python/functions.html" class="sidebar-link">Functions</a></li><li><a href="/python/defining-functions-with-list-arguments.html" class="sidebar-link">Defining functions with list arguments</a></li><li><a href="/python/functional-programming-in-python.html" class="sidebar-link">Functional Programming in Python</a></li><li><a href="/python/partial-functions.html" class="sidebar-link">Partial functions</a></li><li><a href="/python/decorators.html" class="sidebar-link">Decorators</a></li><li><a href="/python/classes.html" class="sidebar-link">Classes</a></li><li><a href="/python/metaclasses.html" class="sidebar-link">Metaclasses</a></li><li><a href="/python/string-formatting.html" class="sidebar-link">String Formatting</a></li><li><a href="/python/string-methods.html" class="sidebar-link">String Methods</a></li><li><a href="/python/using-loops-within-functions.html" class="sidebar-link">Using loops within functions</a></li><li><a href="/python/importing-modules.html" class="sidebar-link">Importing modules</a></li><li><a href="/python/difference-between-module-and-package.html" class="sidebar-link">Difference between Module and Package</a></li><li><a href="/python/math-module.html" class="sidebar-link">Math Module</a></li><li><a href="/python/complex-math.html" class="sidebar-link">Complex math</a></li><li><a href="/python/collections-module.html" class="sidebar-link">Collections module</a></li><li><a href="/python/operator-module.html" class="sidebar-link">Operator module</a></li><li><a href="/python/json-module.html" class="sidebar-link">JSON Module</a></li><li><a href="/python/sqlite3-module.html" class="sidebar-link">Sqlite3 Module</a></li><li><a href="/python/the-os-module.html" class="sidebar-link">The os Module</a></li><li><a href="/python/the-locale-module.html" class="sidebar-link">The locale Module</a></li><li><a href="/python/itertools-module.html" class="sidebar-link">Itertools Module</a></li><li><a href="/python/asyncio-module.html" class="sidebar-link">Asyncio Module</a></li><li><a href="/python/random-module.html" class="sidebar-link">Random module</a></li><li><a href="/python/functools-module.html" class="sidebar-link">Functools Module</a></li><li><a href="/python/the-dis-module.html" class="sidebar-link">The dis module</a></li><li><a href="/python/the-base64-module.html" class="sidebar-link">The base64 Module</a></li><li><a href="/python/queue-module.html" class="sidebar-link">Queue Module</a></li><li><a href="/python/deque-module.html" class="sidebar-link">Deque Module</a></li><li><a href="/python/webbrowser-module.html" class="sidebar-link">Webbrowser Module</a></li><li><a href="/python/tkinter.html" class="sidebar-link">tkinter</a></li><li><a href="/python/pyautogui-module.html" class="sidebar-link">pyautogui module</a></li><li><a href="/python/indexing-and-slicing.html" class="sidebar-link">Indexing and Slicing</a></li><li><a href="/python/plotting-with-matplotlib.html" class="sidebar-link">Plotting with Matplotlib</a></li><li><a href="/python/graph-tool.html" class="sidebar-link">graph-tool</a></li><li><a href="/python/generators.html" class="sidebar-link">Generators</a></li><li><a href="/python/reduce.html" class="sidebar-link">Reduce</a></li><li><a href="/python/map-function.html" class="sidebar-link">Map Function</a></li><li><a href="/python/exponentiation.html" class="sidebar-link">Exponentiation</a></li><li><a href="/python/searching.html" class="sidebar-link">Searching</a></li><li><a href="/python/sorting-minimum-and-maximum.html" class="sidebar-link">Sorting, Minimum and Maximum</a></li><li><a href="/python/counting.html" class="sidebar-link">Counting</a></li><li><a href="/python/the-print-function.html" class="sidebar-link">The Print Function</a></li><li><a href="/python/regular-expressions-regex.html" class="sidebar-link">Regular Expressions (Regex)</a></li><li><a href="/python/copying-data.html" class="sidebar-link">Copying data</a></li><li><a href="/python/context-managers-with-statement.html" class="sidebar-link">Context Managers (“with” Statement)</a></li><li><a href="/python/the-name-special-variable.html" class="sidebar-link">The _name_ special variable</a></li><li><a href="/python/checking-path-existence-and-permissions.html" class="sidebar-link">Checking Path Existence and Permissions</a></li><li><a href="/python/creating-python-packages.html" class="sidebar-link">Creating Python packages</a></li><li><a href="/python/usage-of-pip-module-pypi-package-manager.html" class="sidebar-link">Usage of "pip" module: PyPI Package Manager</a></li><li><a href="/python/pip-pypi-package-manager.html" class="sidebar-link">pip: PyPI Package Manager</a></li><li><a href="/python/parsing-command-line-arguments.html" class="sidebar-link">Parsing Command Line arguments</a></li><li><a href="/python/subprocess-library.html" class="sidebar-link">Subprocess Library</a></li><li><a href="/python/setup-py.html" class="sidebar-link">setup.py</a></li><li><a href="/python/recursion.html" class="sidebar-link">Recursion</a></li><li><a href="/python/type-hints.html" class="sidebar-link">Type Hints</a></li><li><a href="/python/exceptions.html" class="sidebar-link">Exceptions</a></li><li><a href="/python/raise-custom-errors-exceptions.html" class="sidebar-link">Raise Custom Errors / Exceptions</a></li><li><a href="/python/commonwealth-exceptions.html" class="sidebar-link">Commonwealth Exceptions</a></li><li><a href="/python/urllib.html" class="sidebar-link">urllib</a></li><li><a href="/python/web-scraping-with-python.html" class="sidebar-link">Web scraping with Python</a></li><li><a href="/python/html-parsing.html" class="sidebar-link">HTML Parsing</a></li><li><a href="/python/manipulating-xml.html" class="sidebar-link">Manipulating XML</a></li><li><a href="/python/python-requests-post.html" class="sidebar-link">Python Requests Post</a></li><li><a href="/python/distribution.html" class="sidebar-link">Distribution</a></li><li><a href="/python/property-objects.html" class="sidebar-link">Property Objects</a></li><li><a href="/python/overloading.html" class="sidebar-link">Overloading</a></li><li><a href="/python/polymorphism.html" class="sidebar-link">Polymorphism</a></li><li><a href="/python/method-overriding.html" class="sidebar-link">Method Overriding</a></li><li><a href="/python/user-defined-methods.html" class="sidebar-link">User-Defined Methods</a></li><li><a href="/python/string-representations-of-class-instances-str-and-repr-methods.html" class="sidebar-link">String representations of class instances: _str and repr_ methods</a></li><li><a href="/python/debugging.html" class="sidebar-link">Debugging</a></li><li><a href="/python/reading-and-writing-csv.html" class="sidebar-link">Reading and Writing CSV</a></li><li><a href="/python/writing-to-csv-from-string-or-list.html" class="sidebar-link">Writing to CSV from String or List</a></li><li><a href="/python/dynamic-code-execution-with-exec-and-eval.html" class="sidebar-link">Dynamic code execution with exec and eval</a></li><li><a href="/python/pyinstaller-distributing-python-code.html" class="sidebar-link">PyInstaller - Distributing Python Code</a></li><li><a href="/python/data-visualization-with-python.html" class="sidebar-link">Data Visualization with Python</a></li><li><a href="/python/the-interpreter-command-line-console.html" class="sidebar-link">The Interpreter (Command Line Console)</a></li><li><a href="/python/args-and-kwargs.html" class="sidebar-link">args and *kwargs</a></li><li><a href="/python/garbage-collection.html" class="sidebar-link">Garbage Collection</a></li><li><a href="/python/pickle-data-serialisation.html" class="sidebar-link">Pickle data serialisation</a></li><li><a href="/python/binary-data.html" class="sidebar-link">Binary Data</a></li><li><a href="/python/idioms.html" class="sidebar-link">Idioms</a></li><li><a href="/python/data-serialization.html" class="sidebar-link">Data Serialization</a></li><li><a href="/python/multiprocessing.html" class="sidebar-link">Multiprocessing</a></li><li><a href="/python/multithreading.html" class="sidebar-link">Multithreading</a></li><li><a href="/python/processes-and-threads.html" class="sidebar-link">Processes and Threads</a></li><li><a href="/python/python-concurrency.html" class="sidebar-link">Python concurrency</a></li><li><a href="/python/parallel-computation.html" class="sidebar-link">Parallel computation</a></li><li><a href="/python/sockets.html" class="sidebar-link">Sockets</a></li><li><a href="/python/websockets.html" class="sidebar-link">Websockets</a></li><li><a href="/python/sockets-and-message-encryption-decryption-between-client-and-server.html" class="sidebar-link">Sockets And Message Encryption/Decryption Between Client and Server</a></li><li><a href="/python/python-networking.html" class="sidebar-link">Python Networking</a></li><li><a href="/python/python-http-server.html" class="sidebar-link">Python HTTP Server</a></li><li><a href="/python/flask.html" class="sidebar-link">Flask</a></li><li><a href="/python/introduction-to-rabbitmq-using-amqpstorm.html" class="sidebar-link">Introduction to RabbitMQ using AMQPStorm</a></li><li><a href="/python/descriptor.html" class="sidebar-link">Descriptor</a></li><li><a href="/python/tempfile-namedtemporaryfile.html" class="sidebar-link">tempfile NamedTemporaryFile</a></li><li><a href="/python/input-subset-and-output-external-data-files-using-pandas.html" class="sidebar-link">Input, Subset and Output External Data Files using Pandas</a></li><li><a href="/python/unzipping-files.html" class="sidebar-link">Unzipping Files</a></li><li><a href="/python/working-with-zip-archives.html" class="sidebar-link">Working with ZIP archives</a></li><li><a href="/python/getting-start-with-gzip.html" class="sidebar-link">getting start with GZip</a></li><li><a href="/python/stack.html" class="sidebar-link">Stack</a></li><li><a href="/python/working-around-the-global-interpreter-lock-gil.html" class="sidebar-link">Working around the Global Interpreter Lock (GIL)</a></li><li><a href="/python/deployment.html" class="sidebar-link">Deployment</a></li><li><a href="/python/logging.html" class="sidebar-link">Logging</a></li><li><a href="/python/web-server-gateway-interface-wsgi.html" class="sidebar-link">Web Server Gateway Interface (WSGI)</a></li><li><a href="/python/python-server-sent-events.html" class="sidebar-link">Python Server Sent Events</a></li><li><a href="/python/alternatives-to-switch-statement-from-other-languages.html" class="sidebar-link">Alternatives to switch statement from other languages</a></li><li><a href="/python/list-destructuring-aka-packing-and-unpacking.html" class="sidebar-link">List destructuring (aka packing and unpacking)</a></li><li><a href="/python/accessing-python-source-code-and-bytecode.html" class="sidebar-link">Accessing Python source code and bytecode</a></li><li><a href="/python/mixins.html" class="sidebar-link">Mixins</a></li><li><a href="/python/attribute-access.html" class="sidebar-link">Attribute Access</a></li><li><a href="/python/arcpy.html" class="sidebar-link">ArcPy</a></li><li><a href="/python/abstract-base-classes-abc.html" class="sidebar-link">Abstract Base Classes (abc)</a></li><li><a href="/python/plugin-and-extension-classes.html" class="sidebar-link">Plugin and Extension Classes</a></li><li><a href="/python/immutable-datatypes-int-float-str-tuple-and-frozensets.html" class="sidebar-link">Immutable datatypes(int, float, str, tuple and frozensets)</a></li><li><a href="/python/incompatibilities-moving-from-python-2-to-python-3.html" class="sidebar-link">Incompatibilities moving from Python 2 to Python 3</a></li><li><a href="/python/2to3-tool.html" class="sidebar-link">2to3 tool</a></li><li><a href="/python/non-official-python-implementations.html" class="sidebar-link">Non-official Python implementations</a></li><li><a href="/python/abstract-syntax-tree.html" class="sidebar-link">Abstract syntax tree</a></li><li><a href="/python/unicode-and-bytes.html" class="sidebar-link">Unicode and bytes</a></li><li><a href="/python/python-serial-communication-pyserial.html" class="sidebar-link">Python Serial Communication (pyserial)</a></li><li><a href="/python/neo4j-and-cypher-using-py2neo.html" class="sidebar-link">Neo4j and Cypher using Py2Neo</a></li><li><a href="/python/basic-curses-with-python.html" class="sidebar-link">Basic Curses with Python</a></li><li><a href="/python/templates-in-python.html" class="sidebar-link">Templates in python</a></li><li><a href="/python/pillow.html" class="sidebar-link">Pillow</a></li><li><a href="/python/the-pass-statement.html" class="sidebar-link">The pass statement</a></li><li><a href="/python/cli-subcommands-with-precise-help-output.html" class="sidebar-link">CLI subcommands with precise help output</a></li><li><a href="/python/database-access.html" class="sidebar-link">Database Access</a></li><li><a href="/python/connecting-python-to-sql-server.html" class="sidebar-link">Connecting Python to SQL Server</a></li><li><a href="/python/postgresql.html" class="sidebar-link">PostgreSQL</a></li><li><a href="/python/python-and-excel.html" class="sidebar-link">Python and Excel</a></li><li><a href="/python/turtle-graphics.html" class="sidebar-link">Turtle Graphics</a></li><li><a href="/python/python-persistence.html" class="sidebar-link">Python Persistence</a></li><li><a href="/python/design-patterns.html" class="sidebar-link">Design Patterns</a></li><li><a href="/python/hashlib.html" class="sidebar-link">hashlib</a></li><li><a href="/python/creating-a-windows-service-using-python.html" class="sidebar-link">Creating a Windows service using Python</a></li><li><a href="/python/mutable-vs-immutable-and-hashable-in-python.html" class="sidebar-link">Mutable vs Immutable (and Hashable) in Python</a></li><li><a href="/python/configparser.html" class="sidebar-link">configparser</a></li><li><a href="/python/optical-character-recognition.html" class="sidebar-link">Optical Character Recognition</a></li><li><a href="/python/virtual-environments.html" class="sidebar-link">Virtual environments</a></li><li><a href="/python/python-virtual-environment-virtualenv.html" class="sidebar-link">Python Virtual Environment - virtualenv</a></li><li><a href="/python/virtual-environment-with-virtualenvwrapper.html" class="sidebar-link">virtual environment with virtualenvwrapper</a></li><li><a href="/python/create-virtual-environment-with-virtualenvwrapper-in-windows.html" class="sidebar-link">Create virtual environment with virtualenvwrapper in windows</a></li><li><a href="/python/sys.html" class="sidebar-link">sys</a></li><li><a href="/python/chempy-python-package.html" class="sidebar-link">ChemPy - python package</a></li><li><a href="/python/pygame.html" class="sidebar-link">pygame</a></li><li><a href="/python/pyglet.html" class="sidebar-link">Pyglet</a></li><li><a href="/python/audio.html" class="sidebar-link">Audio</a></li><li><a href="/python/pyaudio.html" class="sidebar-link">pyaudio</a></li><li><a href="/python/shelve.html" class="sidebar-link">shelve</a></li><li><a href="/python/iot-programming-with-python-and-raspberry-pi.html" class="sidebar-link">IoT Programming with Python and Raspberry PI</a></li><li><a href="/python/kivy-cross-platform-python-framework-for-nui-development.html" class="sidebar-link">kivy - Cross-platform Python Framework for NUI Development</a></li><li><a href="/python/pandas-transform-preform-operations-on-groups-and-concatenate-the-results.html" class="sidebar-link">Pandas Transform: Preform operations on groups and concatenate the results</a></li><li><a href="/python/similarities-in-syntax-differences-in-meaning-python-vs-javascript.html" class="sidebar-link">Similarities in syntax, Differences in meaning: Python vs. JavaScript</a></li><li><a href="/python/call-python-from-c.html" class="sidebar-link">Call Python from C#</a></li><li><a href="/python/ctypes.html" class="sidebar-link">ctypes</a></li><li><a href="/python/writing-extensions.html" class="sidebar-link">Writing extensions</a></li><li><a href="/python/python-lex-yacc.html" class="sidebar-link">Python Lex-Yacc</a></li><li><a href="/python/unit-testing.html" class="sidebar-link">Unit Testing</a></li><li><a href="/python/py-test.html" class="sidebar-link">py.test</a></li><li><a href="/python/profiling.html" class="sidebar-link">Profiling</a></li><li><a href="/python/python-speed-of-program.html" class="sidebar-link">Python speed of program</a></li><li><a href="/python/performance-optimization.html" class="sidebar-link">Performance optimization</a></li><li><a href="/python/security-and-cryptography.html" class="sidebar-link">Security and Cryptography</a></li><li><a href="/python/secure-shell-connection-in-python.html" class="sidebar-link">Secure Shell Connection in Python</a></li><li><a href="/python/python-anti-patterns.html" class="sidebar-link">Python Anti-Patterns</a></li><li><a href="/python/common-pitfalls.html" class="sidebar-link">Common Pitfalls</a></li><li><a href="/python/hidden-features.html" class="sidebar-link">Hidden Features</a></li><li><a href="/python/date-formatting.html" class="sidebar-link">Date Formatting</a></li><li><a href="/python/ijson.html" class="sidebar-link">ijson</a></li><li><a href="/python/django.html" class="sidebar-link">Django</a></li><li><a href="/python/code-blocks-execution-frames-and-namespaces.html" class="sidebar-link">Code blocks, execution frames, and namespaces</a></li><li><a href="/python/contributors.html" class="sidebar-link">The Contributors</a></li></ul></section></li></ul> </aside> <main class="page"> <div class="theme-default-content content__default"><h1 id="date-and-time"><a href="#date-and-time" class="header-anchor">#</a> Date and Time</h1> <h2 id="parsing-a-string-into-a-timezone-aware-datetime-object"><a href="#parsing-a-string-into-a-timezone-aware-datetime-object" class="header-anchor">#</a> Parsing a string into a timezone aware datetime object</h2> <p>Python 3.2+ has support for <code>%z</code> format when <a href="https://docs.python.org/3/library/datetime.html#strftime-and-strptime-behavior" target="_blank" rel="noopener noreferrer">parsing a string<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a> into a <code>datetime</code> object.</p> <blockquote></blockquote> <p>UTC offset in the form <code>+HHMM</code> or <code>-HHMM</code> (empty string if the object is naive).</p> <div class="language-py extra-class"><pre class="language-py"><code><span class="token keyword">import</span> datetime
dt <span class="token operator">=</span> datetime<span class="token punctuation">.</span>datetime<span class="token punctuation">.</span>strptime<span class="token punctuation">(</span><span class="token string">"2016-04-15T08:27:18-0500"</span><span class="token punctuation">,</span> <span class="token string">"%Y-%m-%dT%H:%M:%S%z"</span><span class="token punctuation">)</span>
</code></pre></div><p>For other versions of Python, you can use an external library such as <a href="https://dateutil.readthedocs.org/en/latest/" target="_blank" rel="noopener noreferrer"><code>dateutil</code><span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a>, which makes parsing a string with timezone into a <code>datetime</code> object is quick.</p> <div class="language-py extra-class"><pre class="language-py"><code><span class="token keyword">import</span> dateutil<span class="token punctuation">.</span>parser
dt <span class="token operator">=</span> dateutil<span class="token punctuation">.</span>parser<span class="token punctuation">.</span>parse<span class="token punctuation">(</span><span class="token string">"2016-04-15T08:27:18-0500"</span><span class="token punctuation">)</span>
</code></pre></div><p>The <code>dt</code> variable is now a <code>datetime</code> object with the following value:</p> <div class="language-py extra-class"><pre class="language-py"><code>datetime<span class="token punctuation">.</span>datetime<span class="token punctuation">(</span><span class="token number">2016</span><span class="token punctuation">,</span> <span class="token number">4</span><span class="token punctuation">,</span> <span class="token number">15</span><span class="token punctuation">,</span> <span class="token number">8</span><span class="token punctuation">,</span> <span class="token number">27</span><span class="token punctuation">,</span> <span class="token number">18</span><span class="token punctuation">,</span> tzinfo<span class="token operator">=</span>tzoffset<span class="token punctuation">(</span><span class="token boolean">None</span><span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">18000</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
</code></pre></div><h2 id="constructing-timezone-aware-datetimes"><a href="#constructing-timezone-aware-datetimes" class="header-anchor">#</a> Constructing timezone-aware datetimes</h2> <p>By default all <code>datetime</code> objects are naive. To make them timezone-aware, you must attach a <code>tzinfo</code> object, which provides the UTC offset and timezone abbreviation as a function of date and time.</p> <p><strong>Fixed Offset Time Zones</strong></p> <p>For time zones that are a fixed offset from UTC, in Python 3.2+, the <code>datetime</code> module provides the <code>timezone</code> class, a concrete implementation of <code>tzinfo</code>, which takes a <code>timedelta</code> and an (optional) name parameter:</p> <div class="language-py extra-class"><pre class="language-py"><code><span class="token keyword">from</span> datetime <span class="token keyword">import</span> datetime<span class="token punctuation">,</span> timedelta<span class="token punctuation">,</span> timezone
JST <span class="token operator">=</span> timezone<span class="token punctuation">(</span>timedelta<span class="token punctuation">(</span>hours<span class="token operator">=</span><span class="token operator">+</span><span class="token number">9</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
dt <span class="token operator">=</span> datetime<span class="token punctuation">(</span><span class="token number">2015</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">12</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> tzinfo<span class="token operator">=</span>JST<span class="token punctuation">)</span>
<span class="token keyword">print</span><span class="token punctuation">(</span>dt<span class="token punctuation">)</span>
<span class="token comment"># 2015-01-01 12:00:00+09:00</span>
<span class="token keyword">print</span><span class="token punctuation">(</span>dt<span class="token punctuation">.</span>tzname<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token comment"># UTC+09:00</span>
dt <span class="token operator">=</span> datetime<span class="token punctuation">(</span><span class="token number">2015</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">12</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> tzinfo<span class="token operator">=</span>timezone<span class="token punctuation">(</span>timedelta<span class="token punctuation">(</span>hours<span class="token operator">=</span><span class="token number">9</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token string">'JST'</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token keyword">print</span><span class="token punctuation">(</span>dt<span class="token punctuation">.</span>tzname<span class="token punctuation">)</span>
<span class="token comment"># 'JST'</span>
</code></pre></div><p>For Python versions before 3.2, it is necessary to use a third party library, such as <a href="http://dateutil.readthedocs.io" target="_blank" rel="noopener noreferrer"><code>dateutil</code><span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a>. <code>dateutil</code> provides an equivalent class, <code>tzoffset</code>, which (as of version 2.5.3) takes arguments of the form <code>dateutil.tz.tzoffset(tzname, offset)</code>, where <code>offset</code> is specified in seconds:</p> <div class="language-py extra-class"><pre class="language-py"><code><span class="token keyword">from</span> datetime <span class="token keyword">import</span> datetime<span class="token punctuation">,</span> timedelta
<span class="token keyword">from</span> dateutil <span class="token keyword">import</span> tz
JST <span class="token operator">=</span> tz<span class="token punctuation">.</span>tzoffset<span class="token punctuation">(</span><span class="token string">'JST'</span><span class="token punctuation">,</span> <span class="token number">9</span> <span class="token operator">*</span> <span class="token number">3600</span><span class="token punctuation">)</span> <span class="token comment"># 3600 seconds per hour</span>
dt <span class="token operator">=</span> datetime<span class="token punctuation">(</span><span class="token number">2015</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">12</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> tzinfo<span class="token operator">=</span>JST<span class="token punctuation">)</span>
<span class="token keyword">print</span><span class="token punctuation">(</span>dt<span class="token punctuation">)</span>
<span class="token comment"># 2015-01-01 12:00:00+09:00</span>
<span class="token keyword">print</span><span class="token punctuation">(</span>dt<span class="token punctuation">.</span>tzname<span class="token punctuation">)</span>
<span class="token comment"># 'JST'</span>
</code></pre></div><p><strong>Zones with daylight savings time</strong></p> <p>For zones with daylight savings time, python standard libraries do not provide a standard class, so it is necessary to use a third party library. <a href="http://pytz.sourceforge.net/" target="_blank" rel="noopener noreferrer"><code>pytz</code><span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a> and <code>dateutil</code> are popular libraries providing time zone classes.</p> <p>In addition to static time zones, <code>dateutil</code> provides time zone classes that use daylight savings time (see <a href="http://dateutil.readthedocs.io/en/stable/tz.html" target="_blank" rel="noopener noreferrer">the documentation for the <code>tz</code> module<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a>). You can use the <code>tz.gettz()</code> method to get a time zone object, which can then be passed directly to the <code>datetime</code> constructor:</p> <div class="language-py extra-class"><pre class="language-py"><code><span class="token keyword">from</span> datetime <span class="token keyword">import</span> datetime
<span class="token keyword">from</span> dateutil <span class="token keyword">import</span> tz
local <span class="token operator">=</span> tz<span class="token punctuation">.</span>gettz<span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token comment"># Local time</span>
PT <span class="token operator">=</span> tz<span class="token punctuation">.</span>gettz<span class="token punctuation">(</span><span class="token string">'US/Pacific'</span><span class="token punctuation">)</span> <span class="token comment"># Pacific time</span>
dt_l <span class="token operator">=</span> datetime<span class="token punctuation">(</span><span class="token number">2015</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">12</span><span class="token punctuation">,</span> tzinfo<span class="token operator">=</span>local<span class="token punctuation">)</span> <span class="token comment"># I am in EST</span>
dt_pst <span class="token operator">=</span> datetime<span class="token punctuation">(</span><span class="token number">2015</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">12</span><span class="token punctuation">,</span> tzinfo<span class="token operator">=</span>PT<span class="token punctuation">)</span>
dt_pdt <span class="token operator">=</span> datetime<span class="token punctuation">(</span><span class="token number">2015</span><span class="token punctuation">,</span> <span class="token number">7</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">12</span><span class="token punctuation">,</span> tzinfo<span class="token operator">=</span>PT<span class="token punctuation">)</span> <span class="token comment"># DST is handled automatically</span>
<span class="token keyword">print</span><span class="token punctuation">(</span>dt_l<span class="token punctuation">)</span>
<span class="token comment"># 2015-01-01 12:00:00-05:00</span>
<span class="token keyword">print</span><span class="token punctuation">(</span>dt_pst<span class="token punctuation">)</span>
<span class="token comment"># 2015-01-01 12:00:00-08:00</span>
<span class="token keyword">print</span><span class="token punctuation">(</span>dt_pdt<span class="token punctuation">)</span>
<span class="token comment"># 2015-07-01 12:00:00-07:00</span>
</code></pre></div><p><strong>CAUTION</strong>: As of version 2.5.3, <code>dateutil</code> does not handle ambiguous datetimes correctly, and will always default to the <strong>later</strong> date. There is no way to construct an object with a <code>dateutil</code> timezone representing, for example <code>2015-11-01 1:30 EDT-4</code>, since this is <strong>during</strong> a daylight savings time transition.</p> <p>All edge cases are handled properly when using <code>pytz</code>, but <code>pytz</code> time zones should <strong>not</strong> be directly attached to time zones through the constructor. Instead, a <code>pytz</code> time zone should be attached using the time zone's <code>localize</code> method:</p> <div class="language-py extra-class"><pre class="language-py"><code><span class="token keyword">from</span> datetime <span class="token keyword">import</span> datetime<span class="token punctuation">,</span> timedelta
<span class="token keyword">import</span> pytz
PT <span class="token operator">=</span> pytz<span class="token punctuation">.</span>timezone<span class="token punctuation">(</span><span class="token string">'US/Pacific'</span><span class="token punctuation">)</span>
dt_pst <span class="token operator">=</span> PT<span class="token punctuation">.</span>localize<span class="token punctuation">(</span>datetime<span class="token punctuation">(</span><span class="token number">2015</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">12</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
dt_pdt <span class="token operator">=</span> PT<span class="token punctuation">.</span>localize<span class="token punctuation">(</span>datetime<span class="token punctuation">(</span><span class="token number">2015</span><span class="token punctuation">,</span> <span class="token number">11</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">30</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token keyword">print</span><span class="token punctuation">(</span>dt_pst<span class="token punctuation">)</span>
<span class="token comment"># 2015-01-01 12:00:00-08:00</span>
<span class="token keyword">print</span><span class="token punctuation">(</span>dt_pdt<span class="token punctuation">)</span>
<span class="token comment"># 2015-11-01 00:30:00-07:00</span>
</code></pre></div><p>Be aware that if you perform datetime arithmetic on a <code>pytz</code>-aware time zone, you must either perform the calculations in UTC (if you want absolute elapsed time), or you must call <code>normalize()</code> on the result:</p> <div class="language-py extra-class"><pre class="language-py"><code>dt_new <span class="token operator">=</span> dt_pdt <span class="token operator">+</span> timedelta<span class="token punctuation">(</span>hours<span class="token operator">=</span><span class="token number">3</span><span class="token punctuation">)</span> <span class="token comment"># This should be 2:30 AM PST</span>
<span class="token keyword">print</span><span class="token punctuation">(</span>dt_new<span class="token punctuation">)</span>
<span class="token comment"># 2015-11-01 03:30:00-07:00</span>
dt_corrected <span class="token operator">=</span> PT<span class="token punctuation">.</span>normalize<span class="token punctuation">(</span>dt_new<span class="token punctuation">)</span>
<span class="token keyword">print</span><span class="token punctuation">(</span>dt_corrected<span class="token punctuation">)</span>
<span class="token comment"># 2015-11-01 02:30:00-08:00</span>
</code></pre></div><h2 id="basic-datetime-objects-usage"><a href="#basic-datetime-objects-usage" class="header-anchor">#</a> Basic datetime objects usage</h2> <p>The datetime module contains three primary types of objects - date, time, and datetime.</p> <div class="language-py extra-class"><pre class="language-py"><code><span class="token keyword">import</span> datetime
<span class="token comment"># Date object</span>
today <span class="token operator">=</span> datetime<span class="token punctuation">.</span>date<span class="token punctuation">.</span>today<span class="token punctuation">(</span><span class="token punctuation">)</span>
new_year <span class="token operator">=</span> datetime<span class="token punctuation">.</span>date<span class="token punctuation">(</span><span class="token number">2017</span><span class="token punctuation">,</span> <span class="token number">01</span><span class="token punctuation">,</span> <span class="token number">01</span><span class="token punctuation">)</span> <span class="token comment">#datetime.date(2017, 1, 1)</span>
<span class="token comment"># Time object</span>
noon <span class="token operator">=</span> datetime<span class="token punctuation">.</span>time<span class="token punctuation">(</span><span class="token number">12</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token comment">#datetime.time(12, 0)</span>
<span class="token comment"># Current datetime</span>
now <span class="token operator">=</span> datetime<span class="token punctuation">.</span>datetime<span class="token punctuation">.</span>now<span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token comment"># Datetime object</span>
millenium_turn <span class="token operator">=</span> datetime<span class="token punctuation">.</span>datetime<span class="token punctuation">(</span><span class="token number">2000</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token comment">#datetime.datetime(2000, 1, 1, 0, 0)</span>
</code></pre></div><p>Arithmetic operations for these objects are only supported within same datatype and performing simple arithmetic with instances of different types will result in a TypeError.</p> <div class="language-py extra-class"><pre class="language-py"><code><span class="token comment"># subtraction of noon from today</span>
noon<span class="token operator">-</span>today
Traceback <span class="token punctuation">(</span>most recent call last<span class="token punctuation">)</span><span class="token punctuation">:</span>
File <span class="token string">"<stdin>"</span><span class="token punctuation">,</span> line <span class="token number">1</span><span class="token punctuation">,</span> <span class="token keyword">in</span> <span class="token operator"><</span>module<span class="token operator">></span>
TypeError<span class="token punctuation">:</span> unsupported operand <span class="token builtin">type</span><span class="token punctuation">(</span>s<span class="token punctuation">)</span> <span class="token keyword">for</span> <span class="token operator">-</span><span class="token punctuation">:</span> <span class="token string">'datetime.time'</span> <span class="token keyword">and</span> <span class="token string">'datetime.date'</span>
However<span class="token punctuation">,</span> it <span class="token keyword">is</span> straightforward to convert between types<span class="token punctuation">.</span>
<span class="token comment"># Do this instead</span>
<span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">'Time since the millenium at midnight: '</span><span class="token punctuation">,</span>
datetime<span class="token punctuation">.</span>datetime<span class="token punctuation">(</span>today<span class="token punctuation">.</span>year<span class="token punctuation">,</span> today<span class="token punctuation">.</span>month<span class="token punctuation">,</span> today<span class="token punctuation">.</span>day<span class="token punctuation">)</span> <span class="token operator">-</span> millenium_turn<span class="token punctuation">)</span>
<span class="token comment"># Or this</span>
<span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">'Time since the millenium at noon: '</span><span class="token punctuation">,</span>
datetime<span class="token punctuation">.</span>datetime<span class="token punctuation">.</span>combine<span class="token punctuation">(</span>today<span class="token punctuation">,</span> noon<span class="token punctuation">)</span> <span class="token operator">-</span> millenium_turn<span class="token punctuation">)</span>
</code></pre></div><h2 id="computing-time-differences"><a href="#computing-time-differences" class="header-anchor">#</a> Computing time differences</h2> <p>the <code>timedelta</code> module comes in handy to compute differences between times:</p> <div class="language-py extra-class"><pre class="language-py"><code><span class="token keyword">from</span> datetime <span class="token keyword">import</span> datetime<span class="token punctuation">,</span> timedelta
now <span class="token operator">=</span> datetime<span class="token punctuation">.</span>now<span class="token punctuation">(</span><span class="token punctuation">)</span>
then <span class="token operator">=</span> datetime<span class="token punctuation">(</span><span class="token number">2016</span><span class="token punctuation">,</span> <span class="token number">5</span><span class="token punctuation">,</span> <span class="token number">23</span><span class="token punctuation">)</span> <span class="token comment"># datetime.datetime(2016, 05, 23, 0, 0, 0)</span>
</code></pre></div><p>Specifying time is optional when creating a new <code>datetime</code> object</p> <div class="language-py extra-class"><pre class="language-py"><code>delta <span class="token operator">=</span> now<span class="token operator">-</span>then
</code></pre></div><p><code>delta</code> is of type <code>timedelta</code></p> <div class="language-py extra-class"><pre class="language-py"><code><span class="token keyword">print</span><span class="token punctuation">(</span>delta<span class="token punctuation">.</span>days<span class="token punctuation">)</span>
<span class="token comment"># 60</span>
<span class="token keyword">print</span><span class="token punctuation">(</span>delta<span class="token punctuation">.</span>seconds<span class="token punctuation">)</span>
<span class="token comment"># 40826</span>
</code></pre></div><p>To get n day's after and n day's before date we could use :</p> <p><strong>n day's after date:</strong></p> <div class="language-py extra-class"><pre class="language-py"><code><span class="token keyword">def</span> <span class="token function">get_n_days_after_date</span><span class="token punctuation">(</span>date_format<span class="token operator">=</span><span class="token string">"%d %B %Y"</span><span class="token punctuation">,</span> add_days<span class="token operator">=</span><span class="token number">120</span><span class="token punctuation">)</span><span class="token punctuation">:</span>
date_n_days_after <span class="token operator">=</span> datetime<span class="token punctuation">.</span>datetime<span class="token punctuation">.</span>now<span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">+</span> timedelta<span class="token punctuation">(</span>days<span class="token operator">=</span>add_days<span class="token punctuation">)</span>
<span class="token keyword">return</span> date_n_days_after<span class="token punctuation">.</span>strftime<span class="token punctuation">(</span>date_format<span class="token punctuation">)</span>
</code></pre></div><p><strong>n day's before date:</strong></p> <div class="language- extra-class"><pre class="language-text"><code>
def get_n_days_before_date(self, date_format="%d %B %Y", days_before=120):
date_n_days_ago = datetime.datetime.now() - timedelta(days=days_before)
return date_n_days_ago.strftime(date_format)
</code></pre></div><h2 id="simple-date-arithmetic"><a href="#simple-date-arithmetic" class="header-anchor">#</a> Simple date arithmetic</h2> <p>Dates don't exist in isolation. It is common that you will need to find the amount of time between dates or determine what the date will be tomorrow. This can be accomplished using <a href="https://docs.python.org/3/library/datetime.html#timedelta-objects" target="_blank" rel="noopener noreferrer"><code>timedelta</code><span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a> objects</p> <div class="language-py extra-class"><pre class="language-py"><code><span class="token keyword">import</span> datetime
today <span class="token operator">=</span> datetime<span class="token punctuation">.</span>date<span class="token punctuation">.</span>today<span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">'Today:'</span><span class="token punctuation">,</span> today<span class="token punctuation">)</span>
yesterday <span class="token operator">=</span> today <span class="token operator">-</span> datetime<span class="token punctuation">.</span>timedelta<span class="token punctuation">(</span>days<span class="token operator">=</span><span class="token number">1</span><span class="token punctuation">)</span>
<span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">'Yesterday:'</span><span class="token punctuation">,</span> yesterday<span class="token punctuation">)</span>
tomorrow <span class="token operator">=</span> today <span class="token operator">+</span> datetime<span class="token punctuation">.</span>timedelta<span class="token punctuation">(</span>days<span class="token operator">=</span><span class="token number">1</span><span class="token punctuation">)</span>
<span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">'Tomorrow:'</span><span class="token punctuation">,</span> tomorrow<span class="token punctuation">)</span>
<span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">'Time between tomorrow and yesterday:'</span><span class="token punctuation">,</span> tomorrow <span class="token operator">-</span> yesterday<span class="token punctuation">)</span>
</code></pre></div><p>This will produce results similar to:</p> <div class="language-py extra-class"><pre class="language-py"><code>Today<span class="token punctuation">:</span> <span class="token number">2016</span><span class="token operator">-</span><span class="token number">04</span><span class="token operator">-</span><span class="token number">15</span>
Yesterday<span class="token punctuation">:</span> <span class="token number">2016</span><span class="token operator">-</span><span class="token number">04</span><span class="token operator">-</span><span class="token number">14</span>
Tomorrow<span class="token punctuation">:</span> <span class="token number">2016</span><span class="token operator">-</span><span class="token number">04</span><span class="token operator">-</span><span class="token number">16</span>
Difference between tomorrow <span class="token keyword">and</span> yesterday<span class="token punctuation">:</span> <span class="token number">2</span> days<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">:</span><span class="token number">00</span><span class="token punctuation">:</span><span class="token number">00</span>
</code></pre></div><h2 id="switching-between-time-zones"><a href="#switching-between-time-zones" class="header-anchor">#</a> Switching between time zones</h2> <p>To switch between time zones, you need datetime objects that are timezone-aware.</p> <div class="language-py extra-class"><pre class="language-py"><code><span class="token keyword">from</span> datetime <span class="token keyword">import</span> datetime
<span class="token keyword">from</span> dateutil <span class="token keyword">import</span> tz
utc <span class="token operator">=</span> tz<span class="token punctuation">.</span>tzutc<span class="token punctuation">(</span><span class="token punctuation">)</span>
local <span class="token operator">=</span> tz<span class="token punctuation">.</span>tzlocal<span class="token punctuation">(</span><span class="token punctuation">)</span>
utc_now <span class="token operator">=</span> datetime<span class="token punctuation">.</span>utcnow<span class="token punctuation">(</span><span class="token punctuation">)</span>
utc_now <span class="token comment"># Not timezone-aware.</span>
utc_now <span class="token operator">=</span> utc_now<span class="token punctuation">.</span>replace<span class="token punctuation">(</span>tzinfo<span class="token operator">=</span>utc<span class="token punctuation">)</span>
utc_now <span class="token comment"># Timezone-aware.</span>
local_now <span class="token operator">=</span> utc_now<span class="token punctuation">.</span>astimezone<span class="token punctuation">(</span>local<span class="token punctuation">)</span>
local_now <span class="token comment"># Converted to local time.</span>
</code></pre></div><h2 id="converting-timestamp-to-datetime"><a href="#converting-timestamp-to-datetime" class="header-anchor">#</a> Converting timestamp to datetime</h2> <p>The <code>datetime</code> module can convert a POSIX <code>timestamp</code> to a ITC <code>datetime</code> object.</p> <p>The Epoch is January 1st, 1970 midnight.</p> <div class="language-py extra-class"><pre class="language-py"><code><span class="token keyword">import</span> time
<span class="token keyword">from</span> datetime <span class="token keyword">import</span> datetime
seconds_since_epoch<span class="token operator">=</span>time<span class="token punctuation">.</span>time<span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token comment">#1469182681.709</span>
utc_date<span class="token operator">=</span>datetime<span class="token punctuation">.</span>utcfromtimestamp<span class="token punctuation">(</span>seconds_since_epoch<span class="token punctuation">)</span> <span class="token comment">#datetime.datetime(2016, 7, 22, 10, 18, 1, 709000)</span>
</code></pre></div><h2 id="subtracting-months-from-a-date-accurately"><a href="#subtracting-months-from-a-date-accurately" class="header-anchor">#</a> Subtracting months from a date accurately</h2> <p>Using the <code>calendar</code> module</p> <div class="language-py extra-class"><pre class="language-py"><code><span class="token keyword">import</span> calendar
<span class="token keyword">from</span> datetime <span class="token keyword">import</span> date
<span class="token keyword">def</span> <span class="token function">monthdelta</span><span class="token punctuation">(</span>date<span class="token punctuation">,</span> delta<span class="token punctuation">)</span><span class="token punctuation">:</span>
m<span class="token punctuation">,</span> y <span class="token operator">=</span> <span class="token punctuation">(</span>date<span class="token punctuation">.</span>month<span class="token operator">+</span>delta<span class="token punctuation">)</span> <span class="token operator">%</span> <span class="token number">12</span><span class="token punctuation">,</span> date<span class="token punctuation">.</span>year <span class="token operator">+</span> <span class="token punctuation">(</span><span class="token punctuation">(</span>date<span class="token punctuation">.</span>month<span class="token punctuation">)</span><span class="token operator">+</span>delta<span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span> <span class="token operator">//</span> <span class="token number">12</span>
<span class="token keyword">if</span> <span class="token keyword">not</span> m<span class="token punctuation">:</span> m <span class="token operator">=</span> <span class="token number">12</span>
d <span class="token operator">=</span> <span class="token builtin">min</span><span class="token punctuation">(</span>date<span class="token punctuation">.</span>day<span class="token punctuation">,</span> calendar<span class="token punctuation">.</span>monthrange<span class="token punctuation">(</span>y<span class="token punctuation">,</span> m<span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">)</span>
<span class="token keyword">return</span> date<span class="token punctuation">.</span>replace<span class="token punctuation">(</span>day<span class="token operator">=</span>d<span class="token punctuation">,</span>month<span class="token operator">=</span>m<span class="token punctuation">,</span> year<span class="token operator">=</span>y<span class="token punctuation">)</span>
next_month <span class="token operator">=</span> monthdelta<span class="token punctuation">(</span>date<span class="token punctuation">.</span>today<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token comment">#datetime.date(2016, 10, 23)</span>
</code></pre></div><p>Using the <code>dateutils</code> module</p> <div class="language-py extra-class"><pre class="language-py"><code><span class="token keyword">import</span> datetime
<span class="token keyword">import</span> dateutil<span class="token punctuation">.</span>relativedelta
d <span class="token operator">=</span> datetime<span class="token punctuation">.</span>datetime<span class="token punctuation">.</span>strptime<span class="token punctuation">(</span><span class="token string">"2013-03-31"</span><span class="token punctuation">,</span> <span class="token string">"%Y-%m-%d"</span><span class="token punctuation">)</span>
d2 <span class="token operator">=</span> d <span class="token operator">-</span> dateutil<span class="token punctuation">.</span>relativedelta<span class="token punctuation">.</span>relativedelta<span class="token punctuation">(</span>months<span class="token operator">=</span><span class="token number">1</span><span class="token punctuation">)</span> <span class="token comment">#datetime.datetime(2013, 2, 28, 0, 0)</span>
</code></pre></div><h2 id="iterate-over-dates"><a href="#iterate-over-dates" class="header-anchor">#</a> Iterate over dates</h2> <p>Sometimes you want to iterate over a range of dates from a start date to some end date. You can do it using <code>datetime</code> library and <code>timedelta</code> object:</p> <div class="language-py extra-class"><pre class="language-py"><code><span class="token keyword">import</span> datetime
<span class="token comment"># The size of each step in days</span>
day_delta <span class="token operator">=</span> datetime<span class="token punctuation">.</span>timedelta<span class="token punctuation">(</span>days<span class="token operator">=</span><span class="token number">1</span><span class="token punctuation">)</span>
start_date <span class="token operator">=</span> datetime<span class="token punctuation">.</span>date<span class="token punctuation">.</span>today<span class="token punctuation">(</span><span class="token punctuation">)</span>
end_date <span class="token operator">=</span> start_date <span class="token operator">+</span> <span class="token number">7</span><span class="token operator">*</span>day_delta
<span class="token keyword">for</span> i <span class="token keyword">in</span> <span class="token builtin">range</span><span class="token punctuation">(</span><span class="token punctuation">(</span>end_date <span class="token operator">-</span> start_date<span class="token punctuation">)</span><span class="token punctuation">.</span>days<span class="token punctuation">)</span><span class="token punctuation">:</span>
<span class="token keyword">print</span><span class="token punctuation">(</span>start_date <span class="token operator">+</span> i<span class="token operator">*</span>day_delta<span class="token punctuation">)</span>
</code></pre></div><p>Which produces:</p> <div class="language-py extra-class"><pre class="language-py"><code><span class="token number">2016</span><span class="token operator">-</span><span class="token number">07</span><span class="token operator">-</span><span class="token number">21</span>
<span class="token number">2016</span><span class="token operator">-</span><span class="token number">07</span><span class="token operator">-</span><span class="token number">22</span>
<span class="token number">2016</span><span class="token operator">-</span><span class="token number">07</span><span class="token operator">-</span><span class="token number">23</span>
<span class="token number">2016</span><span class="token operator">-</span><span class="token number">07</span><span class="token operator">-</span><span class="token number">24</span>
<span class="token number">2016</span><span class="token operator">-</span><span class="token number">07</span><span class="token operator">-</span><span class="token number">25</span>
<span class="token number">2016</span><span class="token operator">-</span><span class="token number">07</span><span class="token operator">-</span><span class="token number">26</span>
<span class="token number">2016</span><span class="token operator">-</span><span class="token number">07</span><span class="token operator">-</span><span class="token number">27</span>
</code></pre></div><h2 id="parsing-a-string-with-a-short-time-zone-name-into-a-timezone-aware-datetime-object"><a href="#parsing-a-string-with-a-short-time-zone-name-into-a-timezone-aware-datetime-object" class="header-anchor">#</a> Parsing a string with a short time zone name into a timezone aware datetime object</h2> <p>Using the <a href="https://dateutil.readthedocs.io" target="_blank" rel="noopener noreferrer"><code>dateutil</code><span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a> library as in the <a href="https://stackoverflow.com/documentation/python/484/date-and-time/1592/parsing-a-string-into-a-timezone-aware-datetime-object" target="_blank" rel="noopener noreferrer">previous example on parsing timezone-aware timestamps<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a>, it is also possible to parse timestamps with a specified "short" time zone name.</p> <p>For dates formatted with short time zone names or abbreviations, which are generally ambiguous (e.g. CST, which could be Central Standard Time, China Standard Time, Cuba Standard Time, etc - more can be found <a href="https://www.timeanddate.com/time/zones/" target="_blank" rel="noopener noreferrer">here<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a>) or not necessarily available in a standard database, it is necessary to specify a mapping between time zone abbreviation and <code>tzinfo</code> object.</p> <div class="language-py extra-class"><pre class="language-py"><code><span class="token keyword">from</span> dateutil <span class="token keyword">import</span> tz
<span class="token keyword">from</span> dateutil<span class="token punctuation">.</span>parser <span class="token keyword">import</span> parse
ET <span class="token operator">=</span> tz<span class="token punctuation">.</span>gettz<span class="token punctuation">(</span><span class="token string">'US/Eastern'</span><span class="token punctuation">)</span>
CT <span class="token operator">=</span> tz<span class="token punctuation">.</span>gettz<span class="token punctuation">(</span><span class="token string">'US/Central'</span><span class="token punctuation">)</span>
MT <span class="token operator">=</span> tz<span class="token punctuation">.</span>gettz<span class="token punctuation">(</span><span class="token string">'US/Mountain'</span><span class="token punctuation">)</span>
PT <span class="token operator">=</span> tz<span class="token punctuation">.</span>gettz<span class="token punctuation">(</span><span class="token string">'US/Pacific'</span><span class="token punctuation">)</span>
us_tzinfos <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token string">'CST'</span><span class="token punctuation">:</span> CT<span class="token punctuation">,</span> <span class="token string">'CDT'</span><span class="token punctuation">:</span> CT<span class="token punctuation">,</span>
<span class="token string">'EST'</span><span class="token punctuation">:</span> ET<span class="token punctuation">,</span> <span class="token string">'EDT'</span><span class="token punctuation">:</span> ET<span class="token punctuation">,</span>
<span class="token string">'MST'</span><span class="token punctuation">:</span> MT<span class="token punctuation">,</span> <span class="token string">'MDT'</span><span class="token punctuation">:</span> MT<span class="token punctuation">,</span>
<span class="token string">'PST'</span><span class="token punctuation">:</span> PT<span class="token punctuation">,</span> <span class="token string">'PDT'</span><span class="token punctuation">:</span> PT<span class="token punctuation">}</span>
dt_est <span class="token operator">=</span> parse<span class="token punctuation">(</span><span class="token string">'2014-01-02 04:00:00 EST'</span><span class="token punctuation">,</span> tzinfos<span class="token operator">=</span>us_tzinfos<span class="token punctuation">)</span>
dt_pst <span class="token operator">=</span> parse<span class="token punctuation">(</span><span class="token string">'2016-03-11 16:00:00 PST'</span><span class="token punctuation">,</span> tzinfos<span class="token operator">=</span>us_tzinfos<span class="token punctuation">)</span>
</code></pre></div><p>After running this:</p> <div class="language-py extra-class"><pre class="language-py"><code>dt_est
<span class="token comment"># datetime.datetime(2014, 1, 2, 4, 0, tzinfo=tzfile('/usr/share/zoneinfo/US/Eastern'))</span>
dt_pst
<span class="token comment"># datetime.datetime(2016, 3, 11, 16, 0, tzinfo=tzfile('/usr/share/zoneinfo/US/Pacific'))</span>
</code></pre></div><p>It is worth noting that if using a <code>pytz</code> time zone with this method, it will <strong>not</strong> be properly localized:</p> <div class="language-py extra-class"><pre class="language-py"><code><span class="token keyword">from</span> dateutil<span class="token punctuation">.</span>parser <span class="token keyword">import</span> parse
<span class="token keyword">import</span> pytz
EST <span class="token operator">=</span> pytz<span class="token punctuation">.</span>timezone<span class="token punctuation">(</span><span class="token string">'America/New_York'</span><span class="token punctuation">)</span>
dt <span class="token operator">=</span> parse<span class="token punctuation">(</span><span class="token string">'2014-02-03 09:17:00 EST'</span><span class="token punctuation">,</span> tzinfos<span class="token operator">=</span><span class="token punctuation">{</span><span class="token string">'EST'</span><span class="token punctuation">:</span> EST<span class="token punctuation">}</span><span class="token punctuation">)</span>
</code></pre></div><p>This simply attaches the <code>pytz</code> time zone to the datetime:</p> <div class="language-py extra-class"><pre class="language-py"><code>dt<span class="token punctuation">.</span>tzinfo <span class="token comment"># Will be in Local Mean Time!</span>
<span class="token comment"># <DstTzInfo 'America/New_York' LMT-1 day, 19:04:00 STD></span>
</code></pre></div><p>If using this method, you should probably re-<code>localize</code> the naive portion of the datetime after parsing:</p> <div class="language-py extra-class"><pre class="language-py"><code>dt_fixed <span class="token operator">=</span> dt<span class="token punctuation">.</span>tzinfo<span class="token punctuation">.</span>localize<span class="token punctuation">(</span>dt<span class="token punctuation">.</span>replace<span class="token punctuation">(</span>tzinfo<span class="token operator">=</span><span class="token boolean">None</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
dt_fixed<span class="token punctuation">.</span>tzinfo <span class="token comment"># Now it's EST.</span>
<span class="token comment"># <DstTzInfo 'America/New_York' EST-1 day, 19:00:00 STD>)</span>
</code></pre></div><h2 id="fuzzy-datetime-parsing-extracting-datetime-out-of-a-text"><a href="#fuzzy-datetime-parsing-extracting-datetime-out-of-a-text" class="header-anchor">#</a> Fuzzy datetime parsing (extracting datetime out of a text)</h2> <p>It is possible to extract a date out of a text using the <a href="https://dateutil.readthedocs.io/en/stable/parser.html#dateutil.parser.parse" target="_blank" rel="noopener noreferrer"><code>dateutil</code> parser<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a> in a "fuzzy" mode, where components of the string not recognized as being part of a date are ignored.</p> <div class="language-py extra-class"><pre class="language-py"><code><span class="token keyword">from</span> dateutil<span class="token punctuation">.</span>parser <span class="token keyword">import</span> parse
dt <span class="token operator">=</span> parse<span class="token punctuation">(</span><span class="token string">"Today is January 1, 2047 at 8:21:00AM"</span><span class="token punctuation">,</span> fuzzy<span class="token operator">=</span><span class="token boolean">True</span><span class="token punctuation">)</span>
<span class="token keyword">print</span><span class="token punctuation">(</span>dt<span class="token punctuation">)</span>
</code></pre></div><p><code>dt</code> is now a <strong><code>datetime</code> object</strong> and you would see <code>datetime.datetime(2047, 1, 1, 8, 21)</code> printed.</p> <h2 id="parsing-an-arbitrary-iso-8601-timestamp-with-minimal-libraries"><a href="#parsing-an-arbitrary-iso-8601-timestamp-with-minimal-libraries" class="header-anchor">#</a> Parsing an arbitrary ISO 8601 timestamp with minimal libraries</h2> <p>Python has only limited support for parsing ISO 8601 timestamps. For <code>strptime</code> you need to know exactly what format it is in. As a complication the stringification of a <code>datetime</code> is an ISO 8601 timestamp, with space as a separator and 6 digit fraction:</p> <div class="language-py extra-class"><pre class="language-py"><code><span class="token builtin">str</span><span class="token punctuation">(</span>datetime<span class="token punctuation">.</span>datetime<span class="token punctuation">(</span><span class="token number">2016</span><span class="token punctuation">,</span> <span class="token number">7</span><span class="token punctuation">,</span> <span class="token number">22</span><span class="token punctuation">,</span> <span class="token number">9</span><span class="token punctuation">,</span> <span class="token number">25</span><span class="token punctuation">,</span> <span class="token number">59</span><span class="token punctuation">,</span> <span class="token number">555555</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token comment"># '2016-07-22 09:25:59.555555'</span>
</code></pre></div><p>but if the fraction is 0, no fractional part is output</p> <div class="language-py extra-class"><pre class="language-py"><code><span class="token builtin">str</span><span class="token punctuation">(</span>datetime<span class="token punctuation">.</span>datetime<span class="token punctuation">(</span><span class="token number">2016</span><span class="token punctuation">,</span> <span class="token number">7</span><span class="token punctuation">,</span> <span class="token number">22</span><span class="token punctuation">,</span> <span class="token number">9</span><span class="token punctuation">,</span> <span class="token number">25</span><span class="token punctuation">,</span> <span class="token number">59</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token comment"># '2016-07-22 09:25:59'</span>
</code></pre></div><p>But these 2 forms need a <strong>different</strong> format for <code>strptime</code>. Furthermore, <code>strptime' does not support at all parsing minute timezones that have a</code>:<code>in it, thus</code>2016-07-22 09:25:59+0300<code>can be parsed, but the standard format</code>2016-07-22 09:25:59+03:00` cannot.</p> <p>There is a <a href="https://bitbucket.org/micktwomey/pyiso8601/src/43c6749d06c4aac6b1156911e85a0b952ca8a324/iso8601/iso8601.py?at=default&fileviewer=file-view-default" target="_blank" rel="noopener noreferrer">single-file<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a> library called <a href="https://pypi.python.org/pypi/iso8601" target="_blank" rel="noopener noreferrer"><code>iso8601</code><span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a> which properly parses ISO 8601 timestamps and only them.</p> <p>It supports fractions and timezones, and the <code>T</code> separator all with a single function:</p> <div class="language-py extra-class"><pre class="language-py"><code><span class="token keyword">import</span> iso8601
iso8601<span class="token punctuation">.</span>parse_date<span class="token punctuation">(</span><span class="token string">'2016-07-22 09:25:59'</span><span class="token punctuation">)</span>
<span class="token comment"># datetime.datetime(2016, 7, 22, 9, 25, 59, tzinfo=<iso8601.Utc>)</span>
iso8601<span class="token punctuation">.</span>parse_date<span class="token punctuation">(</span><span class="token string">'2016-07-22 09:25:59+03:00'</span><span class="token punctuation">)</span>
<span class="token comment"># datetime.datetime(2016, 7, 22, 9, 25, 59, tzinfo=<FixedOffset '+03:00' ...>)</span>
iso8601<span class="token punctuation">.</span>parse_date<span class="token punctuation">(</span><span class="token string">'2016-07-22 09:25:59Z'</span><span class="token punctuation">)</span>
<span class="token comment"># datetime.datetime(2016, 7, 22, 9, 25, 59, tzinfo=<iso8601.Utc>)</span>
iso8601<span class="token punctuation">.</span>parse_date<span class="token punctuation">(</span><span class="token string">'2016-07-22T09:25:59.000111+03:00'</span><span class="token punctuation">)</span>
<span class="token comment"># datetime.datetime(2016, 7, 22, 9, 25, 59, 111, tzinfo=<FixedOffset '+03:00' ...>)</span>
</code></pre></div><p>If no timezone is set, <code>iso8601.parse_date</code> defaults to UTC. The default zone can be changed with <code>default_zone</code> keyword argument. Notably, if this is <code>None</code> instead of the default, then those timestamps that do not have an explicit timezone are returned as naive datetimes instead:</p> <div class="language-py extra-class"><pre class="language-py"><code>iso8601<span class="token punctuation">.</span>parse_date<span class="token punctuation">(</span><span class="token string">'2016-07-22T09:25:59'</span><span class="token punctuation">,</span> default_timezone<span class="token operator">=</span><span class="token boolean">None</span><span class="token punctuation">)</span>
<span class="token comment"># datetime.datetime(2016, 7, 22, 9, 25, 59)</span>
iso8601<span class="token punctuation">.</span>parse_date<span class="token punctuation">(</span><span class="token string">'2016-07-22T09:25:59Z'</span><span class="token punctuation">,</span> default_timezone<span class="token operator">=</span><span class="token boolean">None</span><span class="token punctuation">)</span>
<span class="token comment"># datetime.datetime(2016, 7, 22, 9, 25, 59, tzinfo=<iso8601.Utc>)</span>
</code></pre></div><h2 id="get-an-iso-8601-timestamp"><a href="#get-an-iso-8601-timestamp" class="header-anchor">#</a> Get an ISO 8601 timestamp</h2> <h3 id="without-timezone-with-microseconds"><a href="#without-timezone-with-microseconds" class="header-anchor">#</a> Without timezone, with microseconds</h3> <div class="language-py extra-class"><pre class="language-py"><code><span class="token keyword">from</span> datetime <span class="token keyword">import</span> datetime
datetime<span class="token punctuation">.</span>now<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span>isoformat<span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token comment"># Out: '2016-07-31T23:08:20.886783'</span>
</code></pre></div><h3 id="with-timezone-with-microseconds"><a href="#with-timezone-with-microseconds" class="header-anchor">#</a> With timezone, with microseconds</h3> <div class="language-py extra-class"><pre class="language-py"><code><span class="token keyword">from</span> datetime <span class="token keyword">import</span> datetime
<span class="token keyword">from</span> dateutil<span class="token punctuation">.</span>tz <span class="token keyword">import</span> tzlocal
datetime<span class="token punctuation">.</span>now<span class="token punctuation">(</span>tzlocal<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">.</span>isoformat<span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token comment"># Out: '2016-07-31T23:09:43.535074-07:00'</span>
</code></pre></div><h3 id="with-timezone-without-microseconds"><a href="#with-timezone-without-microseconds" class="header-anchor">#</a> With timezone, without microseconds</h3> <div class="language-py extra-class"><pre class="language-py"><code><span class="token keyword">from</span> datetime <span class="token keyword">import</span> datetime
<span class="token keyword">from</span> dateutil<span class="token punctuation">.</span>tz <span class="token keyword">import</span> tzlocal
datetime<span class="token punctuation">.</span>now<span class="token punctuation">(</span>tzlocal<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">.</span>replace<span class="token punctuation">(</span>microsecond<span class="token operator">=</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">.</span>isoformat<span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token comment"># Out: '2016-07-31T23:10:30-07:00'</span>
</code></pre></div><p>See <a href="https://en.wikipedia.org/wiki/ISO_8601" target="_blank" rel="noopener noreferrer">ISO 8601<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a> for more information about the ISO 8601 format.</p> <h4 id="remarks"><a href="#remarks" class="header-anchor">#</a> Remarks</h4> <p>Python provides both <a href="https://docs.python.org/3/library/datetime.html#strftime-and-strptime-behavior" target="_blank" rel="noopener noreferrer">builtin<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a> methods and external libraries for creating, modifying, parsing, and manipulating dates and times.</p></div> <footer class="page-edit"><div class="edit-link"><a href="https://github.com/devtut/generate/edit/master/docs/python/date-and-time.md" target="_blank" rel="noopener noreferrer">Edit this page on GitHub</a> <span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></div> <!----></footer> <div class="page-nav"><p class="inner"><span class="prev">
←
<a href="/python/comments-and-documentation.html" class="prev">
Comments and Documentation
</a></span> <span class="next"><a href="/python/enum.html">
Enum
</a>
→
</span></p></div> </main></div><div class="global-ui"><!----></div></div>
<script src="/assets/js/app.1779e102.js" defer></script><script src="/assets/js/3.2cfa8016.js" defer></script><script src="/assets/js/2687.cf2c80ff.js" defer></script>
</body>
</html>