I have
import arrow
s = '2015/12/1 19:00:00'
tz = 'Asia/Hong_Kong'
How can I parse this with Arrow such that I get an Arrow object with the time zone tz
? The following defaults to UTC time.
In [30]: arrow.get(s, 'YYYY/M/D HH:mm:ss')
Out[30]: <Arrow [2015年12月01日T19:00:00+00:00]>
I know the .to
function but that converts a time zone and but doesn't allow me to change to time zone.
-
1In arrow doc i see that the constructor works like : "class arrow.arrow.Arrow(year, month, day, hour=0, minute=0, second=0, microsecond=0, tzinfo=None)". Is that enough for your problem? It actually returns an arrow object with you desired tz.Bestasttung– Bestasttung2015年01月22日 11:24:04 +00:00Commented Jan 22, 2015 at 11:24
4 Answers 4
Try this:
arrow.get(s, 'YYYY/M/D HH:mm:ss', tzinfo=tz)
If you are also using dateutil, this works as well:
arrow.get(s, 'YYYY/M/D HH:mm:ss', tzinfo=dateutil.tz.gettz(tz))
So does this:
arrow.get(s, 'YYYY/M/D HH:mm:ss').replace(tzinfo=dateutil.tz.gettz(tz))
-
This works! Just out of curiosity, is it possible to do the same with pytz? I get some weird results:
In [7]: arrow.get(s, 'YYYY/M/D HH:mm:ss').replace(tzinfo=pytz.timezone(tz)) Out[7]: <Arrow [2015年12月01日T19:00:00+07:37]>
mchangun– mchangun2015年01月23日 01:10:12 +00:00Commented Jan 23, 2015 at 1:10 -
1Not sure, but I think arrow is better aligned with dateutil than pytz.Matt Johnson-Pint– Matt Johnson-Pint2015年01月23日 01:27:59 +00:00Commented Jan 23, 2015 at 1:27
-
1@mchangun: btw, I see that even after two years of development
arrow
still fails to convert utc datetime to a named timezone, convert utc time to local timezone, and round-trip timestamp -> named timezone -> utcjfs– jfs2015年01月23日 12:35:37 +00:00Commented Jan 23, 2015 at 12:35 -
1@mchangun: "better" depends on your application. I use
pytz
but it might too low-level for most applications. Though all you need is to understand why pytz introduceslocalize()
,normalize()
methods, to use it correctly.jfs– jfs2015年01月27日 08:49:29 +00:00Commented Jan 27, 2015 at 8:49 -
1@EricDuminil - Updated my answer. Thanks!Matt Johnson-Pint– Matt Johnson-Pint2022年01月27日 16:33:01 +00:00Commented Jan 27, 2022 at 16:33
I'm not qualified yet to add a comment and would just like to share a bit simpler version of the answer with timezone str expression.
s = '2015/12/1 19:00:00'
tz = 'Asia/Hong_Kong'
arrow.get(s, 'YYYY/M/D HH:mm:ss').replace(tzinfo=tz)
or simply local timezone:
arrow.get(s, 'YYYY/M/D HH:mm:ss').replace(tzinfo='local')
or specified ISO-8601 style:
arrow.get(s, 'YYYY/M/D HH:mm:ss').replace(tzinfo='+08:00')
-
I don't understand why
arrow.get
uses UTC as default, and not the local timezone.Eric Duminil– Eric Duminil2022年01月27日 10:18:47 +00:00Commented Jan 27, 2022 at 10:18
Per the current documentation, you can also provide a default timezone for arrow.get()
, e.g.:
s = '2015/12/1 19:00:00'
tz = 'Asia/Hong_Kong'
arrow.get(s, tzinfo=tz)
However, as of right now (version 0.12.1) there is a shortcoming where that doesn't work for string-based date parsing. Fortunately, this has been fixed, so the next release of Arrow will integrate this fix.
This is working for me as of 0.10.0:
import arrow
s = '2015/12/1 19:00:00'
tz = 'Asia/Hong_Kong'
arrow.get(s, 'YYYY/M/D HH:mm:ss', tzinfo=tz)
# <Arrow [2015年12月01日T19:00:00+08:00]>
However, arrow.get('2018-01-29 14:46', tzinfo='US/Central')
(i.e. without the format string) ignores the tzinfo
parameter.
Explore related questions
See similar questions with these tags.