diff --git a/faker/providers/date_time/__init__.py b/faker/providers/date_time/__init__.py
index f2048fa2..ed27c9f4 100644
--- a/faker/providers/date_time/__init__.py
+++ b/faker/providers/date_time/__init__.py
@@ -1379,8 +1379,11 @@ class Provider(BaseProvider):
         """
         Get a timedelta object
         """
+        start_datetime = self._parse_start_datetime('now')
         end_datetime = self._parse_end_datetime(end_datetime)
-        ts = self.generator.random.randint(0, end_datetime)
+        seconds = end_datetime - start_datetime
+
+        ts = self.generator.random.randint(*sorted([0, seconds]))
         return timedelta(seconds=ts)
 
     def date_time(self, tzinfo=None, end_datetime=None):
@@ -1507,20 +1510,20 @@ class Provider(BaseProvider):
         raise ParseError("Invalid format for timedelta '{0}'".format(value))
 
     @classmethod
-    def _parse_date_time(cls, text, tzinfo=None):
-        if isinstance(text, (datetime, date, real_datetime, real_date)):
-            return datetime_to_timestamp(text)
+    def _parse_date_time(cls, value, tzinfo=None):
+        if isinstance(value, (datetime, date, real_datetime, real_date)):
+            return datetime_to_timestamp(value)
         now = datetime.now(tzinfo)
-        if isinstance(text, timedelta):
-            return datetime_to_timestamp(now - text)
-        if is_string(text):
-            if text == 'now':
+        if isinstance(value, timedelta):
+            return datetime_to_timestamp(now + value)
+        if is_string(value):
+            if value == 'now':
                 return datetime_to_timestamp(datetime.now(tzinfo))
-            time_params = cls._parse_date_string(text)
+            time_params = cls._parse_date_string(value)
             return datetime_to_timestamp(now + timedelta(**time_params))
-        if isinstance(text, int):
-            return datetime_to_timestamp(now + timedelta(text))
-        raise ParseError("Invalid format for date '{0}'".format(text))
+        if isinstance(value, int):
+            return datetime_to_timestamp(now + timedelta(value))
+        raise ParseError("Invalid format for date '{0}'".format(value))
 
     @classmethod
     def _parse_date(cls, value):
@@ -1530,7 +1533,7 @@ class Provider(BaseProvider):
             return value
         today = date.today()
         if isinstance(value, timedelta):
-            return today - value
+            return today + value
         if is_string(value):
             if value in ('today', 'now'):
                 return today

Can't produce a time_delta with a maximum value
When using time_delta from the date_time provider it doesn't seem possible to provide a maximum value.
The provider takes an `end_datetime` parameter but what it does with that is beyond me, certainly not what I'd expect.

### Steps to reproduce

```
>>> from faker import Faker
>>> from datetime import timedelta
>>> Faker().time_delta(end_datetime=timedelta(minutes=60))
datetime.timedelta(days=5892, seconds=74879)
```

### Expected behavior

I'd expect to receive a `datetime.timedelta` with a value no greater than 60 minutes.

### Actual behavior

I receive a `datetime.timedelta` with seemingly unbounded value.

diff --git a/tests/providers/test_date_time.py b/tests/providers/test_date_time.py
index 479abba5..6f80ed54 100644
--- a/tests/providers/test_date_time.py
+++ b/tests/providers/test_date_time.py
@@ -91,7 +91,7 @@ class TestDateTime(unittest.TestCase):
         timestamp = DatetimeProvider._parse_date_time('+30d')
         now = DatetimeProvider._parse_date_time('now')
         assert timestamp > now
-        delta = timedelta(days=-30)
+        delta = timedelta(days=30)
         from_delta = DatetimeProvider._parse_date_time(delta)
         from_int = DatetimeProvider._parse_date_time(30)
 
@@ -114,7 +114,7 @@ class TestDateTime(unittest.TestCase):
         assert DatetimeProvider._parse_date(datetime.now()) == today
         assert DatetimeProvider._parse_date(parsed) == parsed
         assert DatetimeProvider._parse_date(30) == parsed
-        assert DatetimeProvider._parse_date(timedelta(days=-30)) == parsed
+        assert DatetimeProvider._parse_date(timedelta(days=30)) == parsed
 
     def test_timezone_conversion(self):
         from faker.providers.date_time import datetime_to_timestamp
@@ -168,6 +168,22 @@ class TestDateTime(unittest.TestCase):
     def test_time_object(self):
         assert isinstance(self.factory.time_object(), datetime_time)
 
+    def test_timedelta(self):
+        delta = self.factory.time_delta(end_datetime=timedelta(seconds=60))
+        assert delta.seconds <= 60
+
+        delta = self.factory.time_delta(end_datetime=timedelta(seconds=-60))
+        assert delta.seconds >= -60
+
+        delta = self.factory.time_delta(end_datetime='+60s')
+        assert delta.seconds <= 60
+
+        delta = self.factory.time_delta(end_datetime='-60s')
+        assert delta.seconds >= 60
+
+        delta = self.factory.time_delta(end_datetime='now')
+        assert delta.seconds <= 0
+
     def test_date_time_between_dates(self):
         timestamp_start = random.randint(0, 2000000000)
         timestamp_end = timestamp_start + 1

pip install -e .[dev]
parse_log_pytest
requirements.txt
pytest pytest-cov pytest-xdist pytest-mock pytest-asyncio pytest
apt-get update apt-get install -y gcc
3.9
requirements/base.txt
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
coverage==7.8.0
exceptiongroup==1.2.2
execnet==2.1.1
-e git+https://github.com/joke2k/faker.git@4c9138f53b4a616f846900e87fa83fe0d309c613#egg=Faker
iniconfig==2.1.0
packaging==24.2
pluggy==1.5.0
pytest==8.3.5
pytest-asyncio==0.26.0
pytest-cov==6.0.0
pytest-mock==3.14.0
pytest-xdist==3.6.1
python-dateutil==2.9.0.post0
six==1.17.0
text-unidecode==1.2
tomli==2.2.1
typing_extensions==4.13.0

name: faker
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.4.4=h6a678d5_1
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=3.0.16=h5eee18b_0
  - pip=25.0=py39h06a4308_0
  - python=3.9.21=he870216_1
  - readline=8.2=h5eee18b_0
  - setuptools=75.8.0=py39h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - tzdata=2025a=h04d1e81_0
  - wheel=0.45.1=py39h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - coverage==7.8.0
      - exceptiongroup==1.2.2
      - execnet==2.1.1
      - iniconfig==2.1.0
      - packaging==24.2
      - pluggy==1.5.0
      - pytest==8.3.5
      - pytest-asyncio==0.26.0
      - pytest-cov==6.0.0
      - pytest-mock==3.14.0
      - pytest-xdist==3.6.1
      - python-dateutil==2.9.0.post0
      - six==1.17.0
      - text-unidecode==1.2
      - tomli==2.2.1
      - typing-extensions==4.13.0
prefix: /opt/conda/envs/faker

tests/providers/test_date_time.py::TestDateTime::test_parse_date tests/providers/test_date_time.py::TestDateTime::test_parse_date_time tests/providers/test_date_time.py::TestDateTime::test_timedelta
tests/providers/test_date_time.py::TestKoKR::test_day tests/providers/test_date_time.py::TestKoKR::test_month tests/providers/test_date_time.py::TestDateTime::test_date_between tests/providers/test_date_time.py::TestDateTime::test_date_between_dates tests/providers/test_date_time.py::TestDateTime::test_date_object tests/providers/test_date_time.py::TestDateTime::test_date_this_period tests/providers/test_date_time.py::TestDateTime::test_date_time_between tests/providers/test_date_time.py::TestDateTime::test_date_time_between_dates tests/providers/test_date_time.py::TestDateTime::test_date_time_between_dates_with_tzinfo tests/providers/test_date_time.py::TestDateTime::test_date_time_this_period tests/providers/test_date_time.py::TestDateTime::test_date_time_this_period_with_tzinfo tests/providers/test_date_time.py::TestDateTime::test_datetime_safe tests/providers/test_date_time.py::TestDateTime::test_datetime_safe_new_date tests/providers/test_date_time.py::TestDateTime::test_datetimes_with_and_without_tzinfo tests/providers/test_date_time.py::TestDateTime::test_day tests/providers/test_date_time.py::TestDateTime::test_future_date tests/providers/test_date_time.py::TestDateTime::test_future_datetime tests/providers/test_date_time.py::TestDateTime::test_month tests/providers/test_date_time.py::TestDateTime::test_parse_timedelta tests/providers/test_date_time.py::TestDateTime::test_past_date tests/providers/test_date_time.py::TestDateTime::test_past_datetime tests/providers/test_date_time.py::TestDateTime::test_past_datetime_within_second tests/providers/test_date_time.py::TestDateTime::test_time_object tests/providers/test_date_time.py::TestDateTime::test_time_series tests/providers/test_date_time.py::TestDateTime::test_timezone_conversion tests/providers/test_date_time.py::TestDateTime::test_unix_time tests/providers/test_date_time.py::TestPlPL::test_day tests/providers/test_date_time.py::TestPlPL::test_month tests/providers/test_date_time.py::TestAr::test_ar_aa tests/providers/test_date_time.py::TestAr::test_ar_eg tests/providers/test_date_time.py::DatesOfBirth::test_acceptable_age_range_eighteen_years tests/providers/test_date_time.py::DatesOfBirth::test_acceptable_age_range_five_years tests/providers/test_date_time.py::DatesOfBirth::test_bad_age_range tests/providers/test_date_time.py::DatesOfBirth::test_date_of_birth tests/providers/test_date_time.py::DatesOfBirth::test_distant_age_range tests/providers/test_date_time.py::DatesOfBirth::test_identical_age_range tests/providers/test_date_time.py::DatesOfBirth::test_type_errors tests/providers/test_date_time.py::DatesOfBirth::test_value_errors
faker/providers/date_time/__init__.py
faker/providers/date_time/__init__.py