@@ -33,6 +33,28 @@ def timestamp_to_datetime(timestamp: Union[int, float], tzinfo: Optional[TzInfo]
33
33
return convert_timestamp_to_datetime (timestamp , tzinfo )
34
34
35
35
36
+ def get_now_date_time (
37
+ start_date : Optional [DateParseType ], end_date : Optional [DateParseType ], tzinfo : Optional [TzInfo ]
38
+ ) -> datetime :
39
+ if isinstance (start_date , datetime ) and not isinstance (end_date , datetime ):
40
+ now = start_date
41
+ elif isinstance (end_date , datetime ) and not isinstance (start_date , datetime ):
42
+ now = end_date
43
+ else :
44
+ now = datetime .now (tzinfo )
45
+ return now
46
+
47
+
48
+ def get_now_date (start_date : Optional [DateParseType ], end_date : Optional [DateParseType ]) -> dtdate :
49
+ if isinstance (start_date , dtdate ) and not isinstance (end_date , dtdate ):
50
+ now = start_date
51
+ elif isinstance (end_date , dtdate ) and not isinstance (start_date , dtdate ):
52
+ now = end_date
53
+ else :
54
+ now = dtdate .today ()
55
+ return now
56
+
57
+
36
58
def change_year (current_date : dtdate , year_diff : int ) -> dtdate :
37
59
"""
38
60
Unless the current_date is February 29th, it is fine to just subtract years.
@@ -1830,17 +1852,18 @@ def unix_time(
1830
1852
1831
1853
:example: 1061306726.6
1832
1854
"""
1833
- start_datetime = self ._parse_start_datetime (start_datetime )
1834
- end_datetime = self ._parse_end_datetime (end_datetime )
1855
+ now = get_now_date_time (start_datetime , end_datetime , tzinfo = None )
1856
+ start_datetime = self ._parse_start_datetime (now , start_datetime )
1857
+ end_datetime = self ._parse_end_datetime (now , end_datetime )
1835
1858
return float (self ._rand_seconds (start_datetime , end_datetime ))
1836
1859
1837
1860
def time_delta (self , end_datetime : Optional [DateParseType ] = None ) -> timedelta :
1838
1861
"""
1839
1862
Get a timedelta object
1840
1863
"""
1841
- start_datetime = self . _parse_start_datetime ( " now" )
1842
- end_datetime = self ._parse_end_datetime (end_datetime )
1843
- seconds = end_datetime - start_datetime
1864
+ now = datetime . now ( )
1865
+ end = self ._parse_end_datetime (now , end_datetime )
1866
+ seconds = end - datetime_to_timestamp ( now )
1844
1867
1845
1868
ts = self ._rand_seconds (* sorted ([0 , seconds ]))
1846
1869
return timedelta (seconds = ts )
@@ -1882,8 +1905,9 @@ def date_time_ad(
1882
1905
# simply change that class method to use this magic number as a
1883
1906
# default value when None is provided.
1884
1907
1885
- start_time = - 62135596800 if start_datetime is None else self ._parse_start_datetime (start_datetime )
1886
- end_datetime = self ._parse_end_datetime (end_datetime )
1908
+ now = get_now_date_time (start_datetime , end_datetime , tzinfo )
1909
+ start_time = - 62135596800 if start_datetime is None else self ._parse_start_datetime (now , start_datetime )
1910
+ end_datetime = self ._parse_end_datetime (now , end_datetime )
1887
1911
1888
1912
ts = self ._rand_seconds (start_time , end_datetime )
1889
1913
# NOTE: using datetime.fromtimestamp(ts) directly will raise
@@ -1948,18 +1972,18 @@ def time_object(self, end_datetime: Optional[DateParseType] = None) -> dttime:
1948
1972
return self .date_time (end_datetime = end_datetime ).time ()
1949
1973
1950
1974
@classmethod
1951
- def _parse_start_datetime (cls , value : Optional [DateParseType ]) -> int :
1975
+ def _parse_start_datetime (cls , now : datetime , value : Optional [DateParseType ]) -> int :
1952
1976
if value is None :
1953
1977
return 0
1954
1978
1955
- return cls ._parse_date_time (value )
1979
+ return cls ._parse_date_time (value , now )
1956
1980
1957
1981
@classmethod
1958
- def _parse_end_datetime (cls , value : Optional [DateParseType ]) -> int :
1982
+ def _parse_end_datetime (cls , now : datetime , value : Optional [DateParseType ]) -> int :
1959
1983
if value is None :
1960
- return datetime_to_timestamp (datetime . now () )
1984
+ return datetime_to_timestamp (now )
1961
1985
1962
- return cls ._parse_date_time (value )
1986
+ return cls ._parse_date_time (value , now )
1963
1987
1964
1988
@classmethod
1965
1989
def _parse_date_string (cls , value : str ) -> Dict [str , float ]:
@@ -1997,10 +2021,9 @@ def _parse_timedelta(cls, value: Union[timedelta, str, float]) -> Union[float, i
1997
2021
raise ParseError (f"Invalid format for timedelta { value !r} " )
1998
2022
1999
2023
@classmethod
2000
- def _parse_date_time (cls , value : DateParseType , tzinfo : Optional [TzInfo ] = None ) -> int :
2024
+ def _parse_date_time (cls , value : DateParseType , now : datetime , tzinfo : Optional [TzInfo ] = None ) -> int :
2001
2025
if isinstance (value , (datetime , dtdate )):
2002
2026
return datetime_to_timestamp (value )
2003
- now = datetime .now (tzinfo )
2004
2027
if isinstance (value , timedelta ):
2005
2028
return datetime_to_timestamp (now + value )
2006
2029
if isinstance (value , str ):
@@ -2013,12 +2036,11 @@ def _parse_date_time(cls, value: DateParseType, tzinfo: Optional[TzInfo] = None)
2013
2036
raise ParseError (f"Invalid format for date { value !r} " )
2014
2037
2015
2038
@classmethod
2016
- def _parse_date (cls , value : DateParseType ) -> dtdate :
2039
+ def _parse_date (cls , value : DateParseType , today : dtdate ) -> dtdate :
2017
2040
if isinstance (value , datetime ):
2018
2041
return value .date ()
2019
2042
elif isinstance (value , dtdate ):
2020
2043
return value
2021
- today = dtdate .today ()
2022
2044
if isinstance (value , timedelta ):
2023
2045
return today + value
2024
2046
if isinstance (value , str ):
@@ -2046,8 +2068,9 @@ def date_time_between(
2046
2068
:example: datetime('1999-02-02 11:42:52')
2047
2069
:return: datetime
2048
2070
"""
2049
- start_date = self ._parse_date_time (start_date , tzinfo = tzinfo )
2050
- end_date = self ._parse_date_time (end_date , tzinfo = tzinfo )
2071
+ now = get_now_date_time (start_date , end_date , tzinfo )
2072
+ start_date = self ._parse_date_time (start_date , now , tzinfo = tzinfo )
2073
+ end_date = self ._parse_date_time (end_date , now , tzinfo = tzinfo )
2051
2074
if end_date - start_date <= 1 :
2052
2075
ts = start_date + self .generator .random .random ()
2053
2076
else :
@@ -2067,9 +2090,9 @@ def date_between(self, start_date: DateParseType = "-30y", end_date: DateParseTy
2067
2090
:example: Date('1999-02-02')
2068
2091
:return: Date
2069
2092
"""
2070
-
2071
- start_date = self ._parse_date (start_date )
2072
- end_date = self ._parse_date (end_date )
2093
+ today = get_now_date ( start_date , end_date )
2094
+ start_date = self ._parse_date (start_date , today )
2095
+ end_date = self ._parse_date (end_date , today )
2073
2096
return self .date_between_dates (date_start = start_date , date_end = end_date )
2074
2097
2075
2098
def future_datetime (self , end_date : DateParseType = "+30d" , tzinfo : Optional [TzInfo ] = None ) -> datetime :
@@ -2141,13 +2164,17 @@ def date_time_between_dates(
2141
2164
:example: datetime('1999-02-02 11:42:52')
2142
2165
:return: datetime
2143
2166
"""
2167
+ today = get_now_date (datetime_start , datetime_end )
2168
+ now = datetime .combine (today , datetime .min .time (), tzinfo )
2144
2169
datetime_start_ = (
2145
2170
datetime_to_timestamp (datetime .now (tzinfo ))
2146
2171
if datetime_start is None
2147
- else self ._parse_date_time (datetime_start )
2172
+ else self ._parse_date_time (datetime_start , now )
2148
2173
)
2149
2174
datetime_end_ = (
2150
- datetime_to_timestamp (datetime .now (tzinfo )) if datetime_end is None else self ._parse_date_time (datetime_end )
2175
+ datetime_to_timestamp (datetime .now (tzinfo ))
2176
+ if datetime_end is None
2177
+ else self ._parse_date_time (datetime_end , now )
2151
2178
)
2152
2179
2153
2180
timestamp = self ._rand_seconds (datetime_start_ , datetime_end_ )
@@ -2398,8 +2425,9 @@ def time_series(
2398
2425
``distrib`` is a callable that accepts ``<datetime>`` and returns ``<value>``
2399
2426
2400
2427
"""
2401
- start_date_ = self ._parse_date_time (start_date , tzinfo = tzinfo )
2402
- end_date_ = self ._parse_date_time (end_date , tzinfo = tzinfo )
2428
+ now = get_now_date_time (start_date , end_date , tzinfo )
2429
+ start_date_ = self ._parse_date_time (start_date , now , tzinfo = tzinfo )
2430
+ end_date_ = self ._parse_date_time (end_date , now , tzinfo = tzinfo )
2403
2431
2404
2432
if end_date_ < start_date_ :
2405
2433
raise ValueError ("`end_date` must be greater than `start_date`." )
0 commit comments