Usage Examples#

To convert between Hijri and Gregorian dates:

>>> from hijridate import Hijri, Gregorian

>>> Hijri(1403, 2, 17).to_gregorian()
Gregorian(1982, 12, 2)

>>> Gregorian(1982, 12, 2).to_hijri()
Hijri(1403, 2, 17)

To convert from/to ISO format:

>>> from hijridate import Hijri, Gregorian

>>> Hijri.fromisoformat('1403-02-17').to_gregorian().isoformat()
'1982-12-02'

>>> Gregorian.fromisoformat('1982-12-02').to_hijri().isoformat()
'1403-02-17'

To get the today’s date in Hijri:

>>> from hijridate import Hijri

>>> Hijri.today().isoformat()
'1443-01-08'

The Hijri objects have some other useful methods. For example:

>>> from hijridate import Hijri

>>> hijri = Hijri(1403, 2, 17)

>>> hijri.datetuple()
(1403, 2, 17)

>>> hijri.dmyformat()
'17/02/1403'

>>> hijri.dmyformat('.', False)
'17.2.1403'

>>> hijri.month_name()
'Safar'

>>> hijri.day_name()
'Thursday'

>>> hijri.notation()
'AH'

The above methods can also be used with Gregorian objects.

You can additionally construct a Gregorian object from datetime.date object:

>>> from datetime import date
>>> from hijridate import Gregorian

>>> my_date = date(1982, 12, 2)
>>> Gregorian.fromdate(my_date)
Gregorian(1982, 12, 2)

The Gregorian object inherits all attributes and methods of datetime.date object:

>>> from hijridate import Gregorian

# To get today's date in Hijri
>>> Gregorian.today().to_hijri()
Hijri(1440, 10, 13)

# To format a Gregorian date
>>> Gregorian(1982, 12, 2).strftime('%A, %-d %B %Y')
'Thursday, 2 December 1982'

Rich Comparison#

Rich comparison (==, !=, >, >=, <, <=) for Hijri objects is supported. Both operands should be Hijri objects. Otherwise, a TypeError exception may be raised where it can be caught and handled in try and except blocks: For example:

>>> from hijridate import Hijri

>>> Hijri(1403, 2, 17) > Hijri(1402, 2, 17)
True

>>> Hijri.fromisoformat('1403-02-17') > '1402-02-17'
Traceback (most recent call last):
    ...
TypeError: '>' not supported between instances of 'Hijri' and 'str'

Internationalization#

Representation of weekday names, month names, and calendar notations is supported. English en is the default language. Additionally, Arabic ar and Bangla bn translations are available, but it can be easily extended for other natural languages.

The following is an example showing how to use the Arabic language:

>>> from hijridate import Hijri

>>> hijri = Hijri(1403, 2, 17)

>>> hijri.month_name('ar')
'صفر'

>>> hijri.day_name('ar')
'الخميس'

>>> hijri.notation('ar')
'هـ'

Date Validation#

Date input values are by default checked if valid and within conversion range. Invalid date raises a ValueError exception, and out of range date raises an OverflowError exception. Both exceptions can be caught and handled in try and except blocks:

>>> from hijridate import Hijri, Gregorian

>>> Hijri(1403, 1, 30)
Traceback (most recent call last):
    ...
ValueError: day must be in 1..29 for month

>>> Gregorian(1882, 12, 2).to_hijri()
Traceback (most recent call last):
    ...
OverflowError: date out of range