11// For the full copyright and license information, please view the LICENSE
22// file that was distributed with this source code.
33use crate :: ParseDateTimeError ;
4- use chrono:: { DateTime , Days , Duration , Months , Utc } ;
4+ use chrono:: { DateTime , Days , Duration , Months , TimeZone , Utc } ;
55use regex:: Regex ;
66/// Parses a relative time string and returns a `Duration` representing the
77/// relative time.
@@ -58,10 +58,10 @@ pub fn parse_relative_time(s: &str) -> Result<Duration, ParseDateTimeError> {
5858/// This function will return `Err(ParseDateTimeError::InvalidInput)` if the input string
5959/// cannot be parsed as a relative time.
6060/// ```
61- fn parse_relative_time_at_date (
62- mut datetime : DateTime < Utc > ,
61+ fn parse_relative_time_at_date < T : TimeZone > (
62+ mut datetime : DateTime < T > ,
6363 s : & str ,
64- ) -> Result < DateTime < Utc > , ParseDateTimeError > {
64+ ) -> Result < DateTime < T > , ParseDateTimeError > {
6565 let time_pattern: Regex = Regex :: new (
6666 r"(?x)
6767 (?:(?P<value>[-+]?\d*)\s*)?
@@ -146,7 +146,11 @@ fn parse_relative_time_at_date(
146146 }
147147}
148148
149- fn add_months ( datetime : DateTime < Utc > , months : i64 , mut is_ago : bool ) -> Option < DateTime < Utc > > {
149+ fn add_months < T : TimeZone > (
150+ datetime : DateTime < T > ,
151+ months : i64 ,
152+ mut is_ago : bool ,
153+ ) -> Option < DateTime < T > > {
150154 let months = if months < 0 {
151155 is_ago = !is_ago;
152156 u32:: try_from ( -months) . ok ( ) ?
@@ -160,7 +164,11 @@ fn add_months(datetime: DateTime<Utc>, months: i64, mut is_ago: bool) -> Option<
160164 }
161165}
162166
163- fn add_days ( datetime : DateTime < Utc > , days : i64 , mut is_ago : bool ) -> Option < DateTime < Utc > > {
167+ fn add_days < T : TimeZone > (
168+ datetime : DateTime < T > ,
169+ days : i64 ,
170+ mut is_ago : bool ,
171+ ) -> Option < DateTime < T > > {
164172 let days = if days < 0 {
165173 is_ago = !is_ago;
166174 u64:: try_from ( -days) . ok ( ) ?
@@ -174,11 +182,11 @@ fn add_days(datetime: DateTime<Utc>, days: i64, mut is_ago: bool) -> Option<Date
174182 }
175183}
176184
177- fn add_duration (
178- datetime : DateTime < Utc > ,
185+ fn add_duration < T : TimeZone > (
186+ datetime : DateTime < T > ,
179187 duration : Duration ,
180188 is_ago : bool ,
181- ) -> Option < DateTime < Utc > > {
189+ ) -> Option < DateTime < T > > {
182190 let duration = if is_ago { -duration } else { duration } ;
183191 datetime. checked_add_signed ( duration)
184192}
0 commit comments