Skip to content

Commit f5f80ca

Browse files
committed
Add timezone_abbr property shortcut to tzname()
1 parent c99f242 commit f5f80ca

14 files changed

+91
-0
lines changed

CHANGELOG.md

+6
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
# Change Log
22

3+
## Unreleased
4+
5+
### Added
6+
7+
- Added `DateTime.timezone_abbr` property to output timezone abbreviation of current datetime.
8+
39
## [2.1.0] - 2020-03-07
410

511
### Added

docs/docs/attributes_properties.md

+3
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,9 @@ Pendulum gives access to more attributes and properties than the default ``datet
6363
# Gets the timezone name
6464
>>> pendulum.now().timezone_name
6565

66+
# Gets the timezone abbreviation
67+
>>> pendulum.now().timezone_abbr
68+
6669
# Indicates if daylight savings time is on
6770
>>> dt = pendulum.datetime(2012, 1, 1, tz='America/Toronto')
6871
>>> dt.is_dst()

docs/docs/comparison.md

+4
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,14 @@ so things aren't always as they seem.
1414
'2012-09-05 23:26:11'
1515
>>> first.timezone_name
1616
'America/Toronto'
17+
>>> first.timezone_abbr
18+
'EDT'
1719
>>> second.to_datetime_string()
1820
'2012-09-05 20:26:11'
1921
>>> second.timezone_name
2022
'America/Vancouver'
23+
>>> second.timezone_abbr
24+
'PDT'
2125

2226
>>> first == second
2327
True

docs/docs/instantiation.md

+2
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,8 @@ There is also the `now()` method.
6262
>>> now_in_london_tz = pendulum.now('Europe/London')
6363
>>> now_in_london_tz.timezone_name
6464
'Europe/London'
65+
>>> now_in_london_tz.timezone_abbr
66+
'BST'
6567
```
6668

6769
To accompany `now()`, a few other static instantiation helpers exist to create known instances.

pendulum/datetime.py

+4
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,10 @@ def timezone_name(self): # type: () -> Optional[str]
239239

240240
return tz.name
241241

242+
@property
243+
def timezone_abbr(self): # type: () -> Optional[str]
244+
return self.tzname()
245+
242246
@property
243247
def age(self):
244248
return self.date().diff(self.now(self.tz).date(), abs=False).in_years()

tests/datetime/test_add.py

+15
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,7 @@ def test_add_to_fixed_timezones():
138138

139139
assert_datetime(dt, 2015, 3, 15, 2, 0, 0)
140140
assert dt.timezone_name == "-06:00"
141+
assert dt.timezone_abbr == "-06:00"
141142
assert dt.offset == -6 * 3600
142143

143144

@@ -146,41 +147,47 @@ def test_add_time_to_new_transition_skipped():
146147

147148
assert_datetime(dt, 2013, 3, 31, 1, 59, 59, 999999)
148149
assert dt.timezone_name == "Europe/Paris"
150+
assert dt.timezone_abbr == "CET"
149151
assert dt.offset == 3600
150152
assert not dt.is_dst()
151153

152154
dt = dt.add(microseconds=1)
153155

154156
assert_datetime(dt, 2013, 3, 31, 3, 0, 0, 0)
155157
assert dt.timezone_name == "Europe/Paris"
158+
assert dt.timezone_abbr == "CEST"
156159
assert dt.offset == 7200
157160
assert dt.is_dst()
158161

159162
dt = pendulum.datetime(2013, 3, 10, 1, 59, 59, 999999, tz="America/New_York")
160163

161164
assert_datetime(dt, 2013, 3, 10, 1, 59, 59, 999999)
162165
assert dt.timezone_name == "America/New_York"
166+
assert dt.timezone_abbr == "EST"
163167
assert dt.offset == -5 * 3600
164168
assert not dt.is_dst()
165169

166170
dt = dt.add(microseconds=1)
167171

168172
assert_datetime(dt, 2013, 3, 10, 3, 0, 0, 0)
169173
assert dt.timezone_name == "America/New_York"
174+
assert dt.timezone_abbr == "EDT"
170175
assert dt.offset == -4 * 3600
171176
assert dt.is_dst()
172177

173178
dt = pendulum.datetime(1957, 4, 28, 1, 59, 59, 999999, tz="America/New_York")
174179

175180
assert_datetime(dt, 1957, 4, 28, 1, 59, 59, 999999)
176181
assert dt.timezone_name == "America/New_York"
182+
assert dt.timezone_abbr == "EST"
177183
assert dt.offset == -5 * 3600
178184
assert not dt.is_dst()
179185

180186
dt = dt.add(microseconds=1)
181187

182188
assert_datetime(dt, 1957, 4, 28, 3, 0, 0, 0)
183189
assert dt.timezone_name == "America/New_York"
190+
assert dt.timezone_abbr == "EDT"
184191
assert dt.offset == -4 * 3600
185192
assert dt.is_dst()
186193

@@ -190,13 +197,15 @@ def test_add_time_to_new_transition_skipped_big():
190197

191198
assert_datetime(dt, 2013, 3, 31, 1, 0, 0, 0)
192199
assert dt.timezone_name == "Europe/Paris"
200+
assert dt.timezone_abbr == "CET"
193201
assert dt.offset == 3600
194202
assert not dt.is_dst()
195203

196204
dt = dt.add(weeks=1)
197205

198206
assert_datetime(dt, 2013, 4, 7, 1, 0, 0, 0)
199207
assert dt.timezone_name == "Europe/Paris"
208+
assert dt.timezone_abbr == "CEST"
200209
assert dt.offset == 7200
201210
assert dt.is_dst()
202211

@@ -207,13 +216,15 @@ def test_add_time_to_new_transition_repeated():
207216

208217
assert_datetime(dt, 2013, 10, 27, 2, 59, 59, 999999)
209218
assert dt.timezone_name == "Europe/Paris"
219+
assert dt.timezone_abbr == "CEST"
210220
assert dt.offset == 7200
211221
assert dt.is_dst()
212222

213223
dt = dt.add(microseconds=1)
214224

215225
assert_datetime(dt, 2013, 10, 27, 2, 0, 0, 0)
216226
assert dt.timezone_name == "Europe/Paris"
227+
assert dt.timezone_abbr == "CET"
217228
assert dt.offset == 3600
218229
assert not dt.is_dst()
219230

@@ -224,13 +235,15 @@ def test_add_time_to_new_transition_repeated():
224235

225236
assert_datetime(dt, 2013, 11, 3, 1, 59, 59, 999999)
226237
assert dt.timezone_name == "America/New_York"
238+
assert dt.timezone_abbr == "EDT"
227239
assert dt.offset == -4 * 3600
228240
assert dt.is_dst()
229241

230242
dt = dt.add(microseconds=1)
231243

232244
assert_datetime(dt, 2013, 11, 3, 1, 0, 0, 0)
233245
assert dt.timezone_name == "America/New_York"
246+
assert dt.timezone_abbr == "EST"
234247
assert dt.offset == -5 * 3600
235248
assert not dt.is_dst()
236249

@@ -240,13 +253,15 @@ def test_add_time_to_new_transition_repeated_big():
240253

241254
assert_datetime(dt, 2013, 10, 27, 1, 0, 0, 0)
242255
assert dt.timezone_name == "Europe/Paris"
256+
assert dt.timezone_abbr == "CEST"
243257
assert dt.offset == 7200
244258
assert dt.is_dst()
245259

246260
dt = dt.add(weeks=1)
247261

248262
assert_datetime(dt, 2013, 11, 3, 1, 0, 0, 0)
249263
assert dt.timezone_name == "Europe/Paris"
264+
assert dt.timezone_abbr == "CET"
250265
assert dt.offset == 3600
251266
assert not dt.is_dst()
252267

tests/datetime/test_construct.py

+13
Original file line numberDiff line numberDiff line change
@@ -28,29 +28,35 @@ def test_creates_an_instance_default_to_utcnow():
2828
now.year, now.month, now.day, now.hour, now.minute, now.second
2929
)
3030
assert now.timezone_name == p.timezone_name
31+
assert now.timezone_name == p.timezone_abbr
32+
assert now.timezone_abbr == p.timezone_abbr
3133

3234
assert_datetime(p, now.year, now.month, now.day, now.hour, now.minute, now.second)
3335

3436

3537
def test_setting_timezone():
3638
tz = "Europe/London"
39+
abbr = "BST"
3740
dtz = timezone(tz)
3841
dt = datetime.utcnow()
3942
offset = dtz.convert(dt).utcoffset().total_seconds() / 3600
4043

4144
p = pendulum.datetime(dt.year, dt.month, dt.day, tz=dtz)
4245
assert p.timezone_name == tz
46+
assert p.timezone_abbr == abbr
4347
assert p.offset_hours == int(offset)
4448

4549

4650
def test_setting_timezone_with_string():
4751
tz = "Europe/London"
52+
abbr = "BST"
4853
dtz = timezone(tz)
4954
dt = datetime.utcnow()
5055
offset = dtz.convert(dt).utcoffset().total_seconds() / 3600
5156

5257
p = pendulum.datetime(dt.year, dt.month, dt.day, tz=tz)
5358
assert p.timezone_name == tz
59+
assert p.timezone_abbr == abbr
5460
assert p.offset_hours == int(offset)
5561

5662

@@ -77,22 +83,26 @@ def test_yesterday():
7783
def test_instance_naive_datetime_defaults_to_utc():
7884
now = pendulum.instance(datetime.now())
7985
assert now.timezone_name == "UTC"
86+
assert now.timezone_abbr == "UTC"
8087

8188

8289
def test_instance_timezone_aware_datetime():
8390
now = pendulum.instance(datetime.now(timezone("Europe/Paris")))
8491
assert now.timezone_name == "Europe/Paris"
92+
assert now.timezone_abbr == "CEST"
8593

8694

8795
def test_instance_timezone_aware_datetime_pytz():
8896
now = pendulum.instance(datetime.now(pytz.timezone("Europe/Paris")))
8997
assert now.timezone_name == "Europe/Paris"
98+
assert now.timezone_abbr == "CEST"
9099

91100

92101
def test_instance_timezone_aware_datetime_any_tzinfo():
93102
dt = datetime(2016, 8, 7, 12, 34, 56, tzinfo=tz.gettz("Europe/Paris"))
94103
now = pendulum.instance(dt)
95104
assert now.timezone_name == "+02:00"
105+
assert now.timezone_abbr == "+02:00"
96106

97107

98108
def test_now():
@@ -106,12 +116,14 @@ def test_now_with_fixed_offset():
106116
now = pendulum.now(6)
107117

108118
assert "+06:00" == now.timezone_name
119+
assert "+06:00" == now.timezone_abbr
109120

110121

111122
def test_create_with_no_transition_timezone():
112123
dt = pendulum.now("Etc/UTC")
113124

114125
assert dt.timezone_name == "Etc/UTC"
126+
assert dt.timezone_abbr == "UTC"
115127

116128

117129
def test_create_maintains_microseconds():
@@ -133,3 +145,4 @@ def test_local():
133145

134146
assert_datetime(local, 2018, 2, 2, 12, 34, 56, 123456)
135147
assert local.timezone_name == "America/Toronto"
148+
assert local.timezone_abbr == "EST"

tests/datetime/test_create_from_timestamp.py

+3
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,18 @@ def test_create_from_timestamp_returns_pendulum():
99
d = pendulum.from_timestamp(pendulum.datetime(1975, 5, 21, 22, 32, 5).timestamp())
1010
assert_datetime(d, 1975, 5, 21, 22, 32, 5)
1111
assert d.timezone_name == "UTC"
12+
assert d.timezone_abbr == "UTC"
1213

1314

1415
def test_create_from_timestamp_with_timezone_string():
1516
d = pendulum.from_timestamp(0, "America/Toronto")
1617
assert d.timezone_name == "America/Toronto"
18+
assert d.timezone_abbr == "EST"
1719
assert_datetime(d, 1969, 12, 31, 19, 0, 0)
1820

1921

2022
def test_create_from_timestamp_with_timezone():
2123
d = pendulum.from_timestamp(0, timezone("America/Toronto"))
2224
assert d.timezone_name == "America/Toronto"
25+
assert d.timezone_abbr == "EST"
2326
assert_datetime(d, 1969, 12, 31, 19, 0, 0)

tests/datetime/test_fluent_setters.py

+3
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ def test_fluid_timezone_setter():
7272
new = d.set(tz="Europe/Paris")
7373
assert isinstance(new, datetime)
7474
assert "Europe/Paris" == new.timezone_name
75+
assert "CEST" == new.timezone_abbr
7576
assert "Europe/Paris" == new.tzinfo.name
7677

7778

@@ -144,6 +145,7 @@ def test_replace_tzinfo():
144145
new = d.replace(tzinfo=pendulum.timezone("Europe/Paris"))
145146

146147
assert new.timezone_name == "Europe/Paris"
148+
assert new.timezone_abbr == "CEST"
147149

148150

149151
def test_replace_tzinfo_dst():
@@ -154,3 +156,4 @@ def test_replace_tzinfo_dst():
154156
assert new.is_dst()
155157
assert new.offset == 7200
156158
assert new.timezone_name == "Europe/Paris"
159+
assert new.timezone_abbr == "CEST"

tests/datetime/test_from_format.py

+6
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ def test_from_format_returns_datetime():
1111
assert_datetime(d, 1975, 5, 21, 22, 32, 11)
1212
assert isinstance(d, pendulum.DateTime)
1313
assert "UTC" == d.timezone_name
14+
assert "UTC" == d.timezone_abbr
1415

1516

1617
def test_from_format_rejects_extra_text():
@@ -24,6 +25,7 @@ def test_from_format_with_timezone_string():
2425
)
2526
assert_datetime(d, 1975, 5, 21, 22, 32, 11)
2627
assert "Europe/London" == d.timezone_name
28+
assert "BST" == d.timezone_abbr
2729

2830

2931
def test_from_format_with_timezone():
@@ -34,18 +36,21 @@ def test_from_format_with_timezone():
3436
)
3537
assert_datetime(d, 1975, 5, 21, 22, 32, 11)
3638
assert "Europe/London" == d.timezone_name
39+
assert "BST" == d.timezone_abbr
3740

3841

3942
def test_from_format_with_escaped_elements():
4043
d = pendulum.from_format("1975-05-21T22:32:11+00:00", "YYYY-MM-DD[T]HH:mm:ssZ")
4144
assert_datetime(d, 1975, 5, 21, 22, 32, 11)
4245
assert "+00:00" == d.timezone_name
46+
assert "+00:00" == d.timezone_abbr
4347

4448

4549
def test_from_format_with_escaped_elements_valid_tokens():
4650
d = pendulum.from_format("1975-05-21T22:32:11.123Z", "YYYY-MM-DD[T]HH:mm:ss.SSS[Z]")
4751
assert_datetime(d, 1975, 5, 21, 22, 32, 11)
4852
assert "UTC" == d.timezone_name
53+
assert "UTC" == d.timezone_abbr
4954

5055

5156
def test_from_format_with_millis():
@@ -198,3 +203,4 @@ def test_strptime():
198203
assert_datetime(d, 1975, 5, 21, 22, 32, 11)
199204
assert isinstance(d, pendulum.DateTime)
200205
assert "UTC" == d.timezone_name
206+
assert "UTC" == d.timezone_abbr

tests/datetime/test_getters.py

+8
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,14 @@ def test_timezone_name():
230230
assert d.timezone_name == "-05:00"
231231

232232

233+
def test_timezone_abbr():
234+
d = pendulum.datetime(2000, 1, 1, tz="America/Toronto")
235+
assert d.timezone_abbr == "EST"
236+
237+
d = pendulum.datetime(2000, 1, 1, tz=-5)
238+
assert d.timezone_abbr == "-05:00"
239+
240+
233241
def test_is_future():
234242
with pendulum.test(DateTime(2000, 1, 1)):
235243
d = pendulum.now()

tests/datetime/test_naive.py

+4
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ def test_naive():
1010
assert dt.tzinfo is None
1111
assert dt.timezone is None
1212
assert dt.timezone_name is None
13+
assert dt.timezone_abbr is None
1314

1415

1516
def test_naive_add():
@@ -32,6 +33,7 @@ def test_naive_in_timezone():
3233

3334
assert_datetime(new, 2013, 3, 31, 1, 30)
3435
assert new.timezone_name == "Europe/Paris"
36+
assert new.timezone_abbr == "CET"
3537

3638

3739
def test_naive_in_timezone_dst():
@@ -40,6 +42,7 @@ def test_naive_in_timezone_dst():
4042

4143
assert_datetime(new, 2013, 3, 31, 3, 30)
4244
assert new.timezone_name == "Europe/Paris"
45+
assert new.timezone_abbr == "CEST"
4346

4447

4548
def test_add():
@@ -74,3 +77,4 @@ def test_naive_method():
7477
assert dt.tzinfo is None
7578
assert dt.timezone is None
7679
assert dt.timezone_name is None
80+
assert dt.timezone_abbr is None

0 commit comments

Comments
 (0)