Skip to content

Exception 'NoneType' object has no attribute 'replace' when parsing specific dates #840

Open

Description

  • I am on the latest Pendulum version.
  • I have searched the issues of this repo and believe that this is not a duplicate.
  • Fedora 40:
  • 3.0.0

Issue

An exception is raised when parsing specific date times.

Current date time on my machine, in case that is relevant.

>>> pendulum.now()                                                                                                                                                                                                  
DateTime(2024, 8, 29, 16, 46, 14, 16970, tzinfo=Timezone('Europe/London')) 

Example of the bad case:

>>> pendulum.parse('Tue, 02 Mar 2024 06:00:00 GMT', tz="UTC", strict=False)                                                                                                                                         
Traceback (most recent call last):                                                                                                                                                                                  
  File "<stdin>", line 1, in <module>                                                                                                                                                                               
  File "/home/sam/flexget.venv/lib64/python3.12/site-packages/pendulum/parser.py", line 30, in parse                                                                                                                
    return _parse(text, **options)                                                                                                                                                                                  
           ^^^^^^^^^^^^^^^^^^^^^^^                                                                                                                                                                                  
  File "/home/sam/flexget.venv/lib64/python3.12/site-packages/pendulum/parser.py", line 46, in _parse                                                                                                               
    return pendulum.datetime(                                                                                                                                                                                       
           ^^^^^^^^^^^^^^^^^^                                                                                                                                                                                       
  File "/home/sam/flexget.venv/lib64/python3.12/site-packages/pendulum/__init__.py", line 143, in datetime                                                                                                          
    return DateTime.create(                                                                                                                                                                                         
           ^^^^^^^^^^^^^^^^                                                                                                                                                                                         
  File "/home/sam/flexget.venv/lib64/python3.12/site-packages/pendulum/datetime.py", line 103, in create                                                                                                            
    tz = pendulum._safe_timezone(tz)                                                                                                                                                                                
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^                                                                                                                                                                                
  File "/home/sam/flexget.venv/lib64/python3.12/site-packages/pendulum/__init__.py", line 112, in _safe_timezone                                                                                                    
    elif obj.tzname(None) == "UTC":                                                                                                                                                                                 
         ^^^^^^^^^^^^^^^^                                                                                                                                                                                           
  File "/home/sam/flexget.venv/lib64/python3.12/site-packages/dateutil/tz/tz.py", line 238, in tzname                                                                                                               
    return self._tznames[self._isdst(dt)]                                                                                                                                                                           
                         ^^^^^^^^^^^^^^^                                                                                                                                                                            
  File "/home/sam/flexget.venv/lib64/python3.12/site-packages/dateutil/tz/tz.py", line 291, in _isdst                                                                                                               
    dstval = self._naive_is_dst(dt)                                                                                                                                                                                 
             ^^^^^^^^^^^^^^^^^^^^^^                                                                                                                                                                                 
  File "/home/sam/flexget.venv/lib64/python3.12/site-packages/dateutil/tz/tz.py", line 259, in _naive_is_dst                                                                                                        
    timestamp = _datetime_to_timestamp(dt)                                                                                                                                                                          
                ^^^^^^^^^^^^^^^^^^^^^^^^^^                                                                                                                                                                          
  File "/home/sam/flexget.venv/lib64/python3.12/site-packages/dateutil/tz/tz.py", line 1814, in _datetime_to_timestamp                                                                                              
    return (dt.replace(tzinfo=None) - EPOCH).total_seconds()                                                                                                                                                        
            ^^^^^^^^^^                                                                                                                                                                                              
AttributeError: 'NoneType' object has no attribute 'replace'                                                                                                                                                        

Example of the good case:

>>> pendulum.parse('Tue, 02 Apr 2024 06:00:00 GMT', tz="UTC", strict=False)                                                                                                                                         
DateTime(2024, 4, 2, 6, 0, 0, tzinfo=Timezone('UTC'))          

This is affecting Flexget rss plugin, see: Flexget/Flexget#4036

Activity

  1. ghost changed the title [-]`Exception `'NoneType' object has no attribute 'replace'` when parsing specific dates[/-] [+]`Exception 'NoneType' object has no attribute 'replace'` when parsing specific dates[/+] on Aug 29, 2024
  2. M117n commented on Aug 31, 2024

    @M117n

    Im gonna try to work on this

  3. M117n commented on Aug 31, 2024

    @M117n

    I have tried to replicate the error using the same date and timezone configuration (Europe/London) in a Windows environment:

    Operating System: Windows 11
    Python: 3.9
    Pendulum: 3.0.0
    Date and time used: DateTime(2024, 8, 29, 16, 46, 14, 16970, tzinfo=Timezone('Europe/London'))
    Parsing result: 2024-03-02 06:00:00+00:00 without any errors.

    This suggests that the issue might be specific to the Fedora 40 environment or related to differences in dependency configurations on that operating system.

  4. ashirley commented on Nov 14, 2024

    @ashirley

    Note that the TZ environment variable has an impact here. On debian bookworm I see the following:

    root@48ff42b03f9d:/# unset TZ
    root@48ff42b03f9d:/# python3 -c 'import pendulum; print(pendulum.parse("Tue, 02 Mar 2024 06:00:00 GMT", tz="UTC", strict=False))'
    2024-03-02 06:00:00+00:00
    root@48ff42b03f9d:/# TZ="UTC" python3 -c 'import pendulum; print(pendulum.parse("Tue, 02 Mar 2024 06:00:00 GMT", tz="UTC", strict=False))'
    2024-03-02 06:00:00+00:00
    root@48ff42b03f9d:/# TZ="Europe/London" python3 -c 'import pendulum; print(pendulum.parse("Tue, 02 Mar 2024 06:00:00 GMT", tz="UTC", strict=False))'
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "/usr/local/lib/python3.11/dist-packages/pendulum/parser.py", line 30, in parse
        return _parse(text, **options)
               ^^^^^^^^^^^^^^^^^^^^^^^
      File "/usr/local/lib/python3.11/dist-packages/pendulum/parser.py", line 46, in _parse
        return pendulum.datetime(
               ^^^^^^^^^^^^^^^^^^
      File "/usr/local/lib/python3.11/dist-packages/pendulum/__init__.py", line 143, in datetime
        return DateTime.create(
               ^^^^^^^^^^^^^^^^
      File "/usr/local/lib/python3.11/dist-packages/pendulum/datetime.py", line 103, in create
        tz = pendulum._safe_timezone(tz)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/usr/local/lib/python3.11/dist-packages/pendulum/__init__.py", line 112, in _safe_timezone
        elif obj.tzname(None) == "UTC":
             ^^^^^^^^^^^^^^^^
      File "/usr/local/lib/python3.11/dist-packages/dateutil/tz/tz.py", line 238, in tzname
        return self._tznames[self._isdst(dt)]
                             ^^^^^^^^^^^^^^^
      File "/usr/local/lib/python3.11/dist-packages/dateutil/tz/tz.py", line 291, in _isdst
        dstval = self._naive_is_dst(dt)
                 ^^^^^^^^^^^^^^^^^^^^^^
      File "/usr/local/lib/python3.11/dist-packages/dateutil/tz/tz.py", line 259, in _naive_is_dst
        timestamp = _datetime_to_timestamp(dt)
                    ^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/usr/local/lib/python3.11/dist-packages/dateutil/tz/tz.py", line 1814, in _datetime_to_timestamp
        return (dt.replace(tzinfo=None) - EPOCH).total_seconds()
                ^^^^^^^^^^
    AttributeError: 'NoneType' object has no attribute 'replace'
    
  5. ashb commented on Jan 14, 2025

    @ashb
    Member

    Possibly related to #837 then.

  6. added this to the Pendulum 3.2 milestone on Apr 23, 2025
  7. vivodi commented on Sep 23, 2025

    @vivodi

    I can confirm that this issue still exists.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions