Skip to content

Commit b628abf

Browse files
committed
Add timezone_abbr property shortcut to tzname()
1 parent ce4d3aa commit b628abf

13 files changed

+85
-0
lines changed

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
@@ -182,6 +182,10 @@ def timezone_name(self) -> str:
182182

183183
return tz.name
184184

185+
@property
186+
def timezone_abbr(self) -> Optional[str]:
187+
return self.tzname()
188+
185189
@property
186190
def age(self) -> int:
187191
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
@@ -29,29 +29,35 @@ def test_creates_an_instance_default_to_utcnow():
2929
now.year, now.month, now.day, now.hour, now.minute, now.second
3030
)
3131
assert now.timezone_name == p.timezone_name
32+
assert now.timezone_name == p.timezone_abbr
33+
assert now.timezone_abbr == p.timezone_abbr
3234

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

3537

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

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

4650

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

5358
p = pendulum.datetime(dt.year, dt.month, dt.day, tz=tz)
5459
assert p.timezone_name == tz
60+
assert p.timezone_abbr == abbr
5561
assert p.offset_hours == int(offset)
5662

5763

@@ -78,22 +84,26 @@ def test_yesterday():
7884
def test_instance_naive_datetime_defaults_to_utc():
7985
now = pendulum.instance(datetime.now())
8086
assert now.timezone_name == "UTC"
87+
assert now.timezone_abbr == "UTC"
8188

8289

8390
def test_instance_timezone_aware_datetime():
8491
now = pendulum.instance(datetime.now(timezone("Europe/Paris")))
8592
assert now.timezone_name == "Europe/Paris"
93+
assert now.timezone_abbr == "CEST"
8694

8795

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

92101

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

98108

99109
def test_now():
@@ -147,12 +157,14 @@ def test_now_with_fixed_offset():
147157
now = pendulum.now(6)
148158

149159
assert "+06:00" == now.timezone_name
160+
assert "+06:00" == now.timezone_abbr
150161

151162

152163
def test_create_with_no_transition_timezone():
153164
dt = pendulum.now("Etc/UTC")
154165

155166
assert dt.timezone_name == "Etc/UTC"
167+
assert dt.timezone_abbr == "UTC"
156168

157169

158170
def test_create_maintains_microseconds():
@@ -174,3 +186,4 @@ def test_local():
174186

175187
assert_datetime(local, 2018, 2, 2, 12, 34, 56, 123456)
176188
assert local.timezone_name == "America/Toronto"
189+
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

@@ -167,6 +168,7 @@ def test_replace_tzinfo_dst_on():
167168
assert new.is_dst()
168169
assert new.offset == 7200
169170
assert new.timezone_name == "Europe/Paris"
171+
assert new.timezone_abbr == "CEST"
170172

171173

172174
def test_replace_tzinfo_dst_transitioning_off():
@@ -177,3 +179,4 @@ def test_replace_tzinfo_dst_transitioning_off():
177179
assert new.is_dst()
178180
assert new.offset == 7200
179181
assert new.timezone_name == "Europe/Paris"
182+
assert new.timezone_abbr == "CEST"

tests/datetime/test_from_format.py

+6
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ def test_from_format_returns_datetime():
99
assert_datetime(d, 1975, 5, 21, 22, 32, 11)
1010
assert isinstance(d, pendulum.DateTime)
1111
assert "UTC" == d.timezone_name
12+
assert "UTC" == d.timezone_abbr
1213

1314

1415
def test_from_format_rejects_extra_text():
@@ -22,6 +23,7 @@ def test_from_format_with_timezone_string():
2223
)
2324
assert_datetime(d, 1975, 5, 21, 22, 32, 11)
2425
assert "Europe/London" == d.timezone_name
26+
assert "BST" == d.timezone_abbr
2527

2628

2729
def test_from_format_with_timezone():
@@ -32,6 +34,7 @@ def test_from_format_with_timezone():
3234
)
3335
assert_datetime(d, 1975, 5, 21, 22, 32, 11)
3436
assert "Europe/London" == d.timezone_name
37+
assert "BST" == d.timezone_abbr
3538

3639

3740
def test_from_format_with_square_bracket_in_timezone():
@@ -45,12 +48,14 @@ def test_from_format_with_escaped_elements():
4548
d = pendulum.from_format("1975-05-21T22:32:11+00:00", "YYYY-MM-DD[T]HH:mm:ssZ")
4649
assert_datetime(d, 1975, 5, 21, 22, 32, 11)
4750
assert "+00:00" == d.timezone_name
51+
assert "+00:00" == d.timezone_abbr
4852

4953

5054
def test_from_format_with_escaped_elements_valid_tokens():
5155
d = pendulum.from_format("1975-05-21T22:32:11.123Z", "YYYY-MM-DD[T]HH:mm:ss.SSS[Z]")
5256
assert_datetime(d, 1975, 5, 21, 22, 32, 11)
5357
assert "UTC" == d.timezone_name
58+
assert "UTC" == d.timezone_abbr
5459

5560

5661
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
@@ -220,6 +220,14 @@ def test_timezone_name():
220220
assert d.timezone_name == "-05:00"
221221

222222

223+
def test_timezone_abbr():
224+
d = pendulum.datetime(2000, 1, 1, tz="America/Toronto")
225+
assert d.timezone_abbr == "EST"
226+
227+
d = pendulum.datetime(2000, 1, 1, tz=-5)
228+
assert d.timezone_abbr == "-05:00"
229+
230+
223231
def test_is_future():
224232
with pendulum.test(DateTime(2000, 1, 1)):
225233
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)