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-01T19: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.

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)) 
Sign up to request clarification or add additional context in comments.

10 Comments

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-01T19:00:00+07:37]>
Not sure, but I think arrow is better aligned with dateutil than pytz.
@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.
@EricDuminil - Updated my answer. Thanks!
|
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') 

1 Comment

I don't understand why arrow.get uses UTC as default, and not the local timezone.
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.

Comments

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-01T19: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.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.