diff --git a/pygmt/src/solar.py b/pygmt/src/solar.py index dc2f902099e..87ff481945d 100644 --- a/pygmt/src/solar.py +++ b/pygmt/src/solar.py @@ -71,10 +71,8 @@ def solar( terminator_datetime : str or datetime object Set the date and time for the terminator calculation. It can be provided as a string or any datetime-like object recognized by :func:`pandas.to_datetime`. The - time can be specified in UTC or using a UTC offset. The offset must be an - integer number of hours (e.g., -8 or +5); fractional hours are truncated - towards zero (e.g., -8.5 becomes -8 and +5.5 becomes +5). [Default is the - current UTC date and time]. + time can be specified in UTC or with a UTC offset of any precision [Default is + the current UTC date and time]. fill Set color or pattern for filling terminators [Default is no fill]. pen @@ -113,18 +111,16 @@ def solar( >>> # show the plot >>> fig.show() """ - datetime_string, datetime_timezone = None, None + datetime_string = None if terminator_datetime: try: _datetime = pd.to_datetime(terminator_datetime) - datetime_string = _datetime.strftime("%Y-%m-%dT%H:%M:%S.%f") - # GMT's solar module uses the C 'atoi' function to parse the timezone - # offset. Ensure the offset is an integer number of hours (e.g., -8 or +5). - # Fractional hours (e.g., -8.5 or +5.5) are truncated towards zero. - if utcoffset := _datetime.utcoffset(): - datetime_timezone = int(utcoffset.total_seconds() / 3600) except ValueError as verr: raise GMTValueError(terminator_datetime, description="datetime") from verr + # Convert a timezone-aware datetime to UTC, before passing to GMT. + if _datetime.tzinfo is not None: + _datetime = _datetime.tz_convert("UTC") + datetime_string = _datetime.strftime("%Y-%m-%dT%H:%M:%S.%f") aliasdict = AliasSystem( G=Alias(fill, name="fill"), @@ -140,7 +136,6 @@ def solar( }, ), Alias(datetime_string, name="terminator_datetime", prefix="+d"), - Alias(datetime_timezone, name="terminator_timezone", prefix="+z"), ], W=Alias(pen, name="pen"), ).add_common( diff --git a/pygmt/tests/baseline/test_solar_terminator_datetime_timezone.png b/pygmt/tests/baseline/test_solar_terminator_datetime_timezone.png index 05b7fb95404..5d862829c67 100644 --- a/pygmt/tests/baseline/test_solar_terminator_datetime_timezone.png +++ b/pygmt/tests/baseline/test_solar_terminator_datetime_timezone.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:465b6e30a0a391a9256a6f3eb82bce9fe7d878fe7c1fe1720d1f7b155bd158a8 -size 48753 +oid sha256:911c881bbe7261d5c7a0ecce6f78f63674a8e3f26341cb48de485be77d7d0682 +size 54054 diff --git a/pygmt/tests/test_solar.py b/pygmt/tests/test_solar.py index 29d031a947a..447f7b12b76 100644 --- a/pygmt/tests/test_solar.py +++ b/pygmt/tests/test_solar.py @@ -100,6 +100,7 @@ def test_solar_terminator_datetime_timezone(): fig = Figure() fig.basemap(region="d", projection="W0/15c", frame=True) fig.solar(terminator_datetime="2020-01-01T01:02:03", pen="1p,black") + fig.solar(terminator_datetime="2020-01-01T01:02:03+00:30", pen="1p,orange,-") fig.solar(terminator_datetime="2020-01-01T01:02:03+01:00", pen="1p,red") fig.solar(terminator_datetime="2020-01-01T01:02:03-01:00", pen="1p,blue") fig.solar(