12

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.

Matt Johnson-Pint
243k75 gold badges467 silver badges618 bronze badges
asked Jan 22, 2015 at 11:06
1
  • 1
    In 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. Commented Jan 22, 2015 at 11:24

4 Answers 4

19

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))
answered Jan 22, 2015 at 18:04
10
  • 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]> Commented Jan 23, 2015 at 1:10
  • 1
    Not sure, but I think arrow is better aligned with dateutil than pytz. Commented 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 -> utc Commented 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 introduces localize(), normalize() methods, to use it correctly. Commented Jan 27, 2015 at 8:49
  • 1
    @EricDuminil - Updated my answer. Thanks! Commented Jan 27, 2022 at 16:33
12

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')
answered May 23, 2016 at 9:02
1
  • I don't understand why arrow.get uses UTC as default, and not the local timezone. Commented Jan 27, 2022 at 10:18
0

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.

answered Apr 11, 2018 at 22:55
0

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.

answered Nov 16, 2020 at 0:35

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.