diff --git a/src/_zkapauthorizer/tests/strategies.py b/src/_zkapauthorizer/tests/strategies.py
index 36d2362575ef34a33efed2bd459b025ed4fdbe4b..e90d2cc74e39acf2985d5dfd9dd17be42e585ca8 100644
--- a/src/_zkapauthorizer/tests/strategies.py
+++ b/src/_zkapauthorizer/tests/strategies.py
@@ -350,19 +350,29 @@ def client_errorredeemer_configurations(details):
     )
 
 
+def integer_seconds_timedeltas(
+    # Our intervals mostly want to be non-negative.
+    min_value=0,
+    # We can't make this value too large or it isn't convertable to a
+    # timedelta.  Also, even values as large as this one are of
+    # questionable value for the durations we measure.
+    max_value=60 * 60 * 24 * 365,
+):
+    """
+    Build ``timedelta`` instances without a fractional seconds part.
+    """
+    return integers(
+        min_value=min_value,
+        max_value=max_value,
+    ).map(lambda n: timedelta(seconds=n))
+
+
 def interval_means():
     """
     Build timedeltas representing the mean time between lease maintenance
     runs.
     """
-    return integers(
-        # It doesn't make sense to have a negative check interval mean.
-        min_value=0,
-        # We can't make this value too large or it isn't convertable to a
-        # timedelta.  Also, even values as large as this one are of
-        # questionable value.
-        max_value=60 * 60 * 24 * 365,
-    ).map(timedelta)
+    return integer_seconds_timedeltas()
 
 
 def lease_maintenance_configurations():
@@ -372,8 +382,8 @@ def lease_maintenance_configurations():
     return builds(
         LeaseMaintenanceConfig,
         interval_means(),
-        integers(min_value=0, max_value=60 * 60 * 24 * 365).map(timedelta),
-        integers(min_value=0, max_value=60 * 60 * 24 * 365).map(timedelta),
+        integer_seconds_timedeltas(),
+        integer_seconds_timedeltas(),
     )