@@ -30,8 +30,8 @@ impl Now {
30
30
/// 1. Resolve user input `TimeZone` with the `SystemTimeZone`.
31
31
/// 2. Get the `SystemNanoseconds`
32
32
pub ( crate ) fn system_datetime_with_provider (
33
- epoch_nanoseconds : EpochNanoseconds ,
34
- timezone : TimeZone ,
33
+ system_epoch_nanoseconds : EpochNanoseconds ,
34
+ system_timezone : TimeZone ,
35
35
provider : & impl TimeZoneProvider ,
36
36
) -> TemporalResult < IsoDateTime > {
37
37
// 1. If temporalTimeZoneLike is undefined, then
@@ -40,7 +40,7 @@ impl Now {
40
40
// a. Let timeZone be ? ToTemporalTimeZoneIdentifier(temporalTimeZoneLike).
41
41
// 3. Let epochNs be SystemUTCEpochNanoseconds().
42
42
// 4. Return GetISODateTimeFor(timeZone, epochNs).
43
- timezone . get_iso_datetime_for ( & Instant :: from ( epoch_nanoseconds ) , provider)
43
+ system_timezone . get_iso_datetime_for ( & Instant :: from ( system_epoch_nanoseconds ) , provider)
44
44
}
45
45
46
46
/// Returns the current system time as a `ZonedDateTime` with an ISO8601 calendar.
@@ -61,15 +61,15 @@ impl Now {
61
61
///
62
62
/// For an example implementation, see `Now::zoneddatetime_iso`; available with
63
63
/// the `compiled_data` feature flag.
64
- pub fn zoneddatetime_iso_with_system_values (
65
- epoch_nanos : EpochNanoseconds ,
66
- timezone : TimeZone ,
64
+ pub fn zoneddatetime_iso_with_system_info (
65
+ sys_epoch_nanos : EpochNanoseconds ,
66
+ sys_timezone : TimeZone ,
67
67
) -> TemporalResult < ZonedDateTime > {
68
- let instant = Instant :: from ( epoch_nanos ) ;
68
+ let instant = Instant :: from ( sys_epoch_nanos ) ;
69
69
Ok ( ZonedDateTime :: new_unchecked (
70
70
instant,
71
71
Calendar :: default ( ) ,
72
- timezone ,
72
+ sys_timezone ,
73
73
) )
74
74
}
75
75
}
@@ -101,7 +101,7 @@ impl Now {
101
101
timezone. unwrap_or ( TimeZone :: IanaIdentifier ( crate :: sys:: get_system_timezone ( ) ?) ) ;
102
102
let system_nanos = crate :: sys:: get_system_nanoseconds ( ) ?;
103
103
let epoch_nanos = EpochNanoseconds :: try_from ( system_nanos) ?;
104
- Now :: zoneddatetime_iso_with_system_values ( epoch_nanos, timezone)
104
+ Now :: zoneddatetime_iso_with_system_info ( epoch_nanos, timezone)
105
105
}
106
106
}
107
107
@@ -121,12 +121,12 @@ impl Now {
121
121
///
122
122
/// For an example implementation, see `Now::plain_datetime_iso`; available with the
123
123
/// `compiled_data` feature flag.
124
- pub fn plain_datetime_iso_with_provider (
125
- epoch_nanos : EpochNanoseconds ,
126
- timezone : TimeZone ,
124
+ pub fn plain_datetime_iso_with_provider_and_system_info (
125
+ sys_epoch_nanos : EpochNanoseconds ,
126
+ sys_timezone : TimeZone ,
127
127
provider : & impl TimeZoneProvider ,
128
128
) -> TemporalResult < PlainDateTime > {
129
- let iso = Self :: system_datetime_with_provider ( epoch_nanos , timezone , provider) ?;
129
+ let iso = Self :: system_datetime_with_provider ( sys_epoch_nanos , sys_timezone , provider) ?;
130
130
Ok ( PlainDateTime :: new_unchecked ( iso, Calendar :: default ( ) ) )
131
131
}
132
132
@@ -145,12 +145,12 @@ impl Now {
145
145
///
146
146
/// For an example implementation, see `Now::plain_date_iso`; available
147
147
/// with the `compiled_data` feature flag.
148
- pub fn plain_date_iso_with_provider (
149
- epoch_nanos : EpochNanoseconds ,
150
- timezone : TimeZone ,
148
+ pub fn plain_date_iso_with_provider_and_system_info (
149
+ sys_epoch_nanos : EpochNanoseconds ,
150
+ sys_timezone : TimeZone ,
151
151
provider : & impl TimeZoneProvider ,
152
152
) -> TemporalResult < PlainDate > {
153
- let iso = Self :: system_datetime_with_provider ( epoch_nanos , timezone , provider) ?;
153
+ let iso = Self :: system_datetime_with_provider ( sys_epoch_nanos , sys_timezone , provider) ?;
154
154
Ok ( PlainDate :: new_unchecked ( iso. date , Calendar :: default ( ) ) )
155
155
}
156
156
@@ -169,26 +169,80 @@ impl Now {
169
169
///
170
170
/// For an example implementation, see `Now::plain_time_iso`; available with the
171
171
/// `compiled_data` feature flag.
172
- pub fn plain_time_iso_with_provider (
173
- epoch_nanos : EpochNanoseconds ,
174
- timezone : TimeZone ,
172
+ pub fn plain_time_iso_with_provider_and_system_info (
173
+ sys_epoch_nanos : EpochNanoseconds ,
174
+ sys_timezone : TimeZone ,
175
175
provider : & impl TimeZoneProvider ,
176
176
) -> TemporalResult < PlainTime > {
177
- let iso = Self :: system_datetime_with_provider ( epoch_nanos , timezone , provider) ?;
177
+ let iso = Self :: system_datetime_with_provider ( sys_epoch_nanos , sys_timezone , provider) ?;
178
178
Ok ( PlainTime :: new_unchecked ( iso. time ) )
179
179
}
180
180
}
181
181
182
- #[ cfg( all ( test, feature = "tzdb" , feature = "sys" , feature = "compiled_data" ) ) ]
182
+ #[ cfg( test) ]
183
183
mod tests {
184
- use crate :: builtins:: core:: Now ;
185
- use std:: thread;
186
- use std:: time:: Duration as StdDuration ;
187
184
185
+ #[ cfg( feature = "tzdb" ) ]
186
+ use crate :: builtins:: core:: Now ;
187
+ #[ cfg( feature = "tzdb" ) ]
188
188
use crate :: options:: DifferenceSettings ;
189
+ #[ cfg( feature = "tzdb" ) ]
190
+ use crate :: time:: EpochNanoseconds ;
191
+
192
+ #[ cfg( feature = "tzdb" ) ]
193
+ #[ test]
194
+ fn mocked_datetime ( ) {
195
+ use crate :: { tzdb:: FsTzdbProvider , TimeZone } ;
196
+ let provider = FsTzdbProvider :: default ( ) ;
197
+
198
+ // 2025-03-11T10:47-06:00
199
+ const TIME_BASE : u128 = 1_741_751_188_077_363_694 ;
200
+
201
+ let cdt = TimeZone :: try_from_identifier_str ( "-05:00" ) . unwrap ( ) ;
202
+ let uschi = TimeZone :: try_from_identifier_str ( "America/Chicago" ) . unwrap ( ) ;
189
203
204
+ let base = EpochNanoseconds :: try_from ( TIME_BASE ) . unwrap ( ) ;
205
+ let now =
206
+ Now :: plain_datetime_iso_with_provider_and_system_info ( base, cdt. clone ( ) , & provider)
207
+ . unwrap ( ) ;
208
+ assert_eq ! ( now. year( ) , 2025 ) ;
209
+ assert_eq ! ( now. month( ) , 3 ) ;
210
+ assert_eq ! ( now. month_code( ) . as_str( ) , "M03" ) ;
211
+ assert_eq ! ( now. day( ) , 11 ) ;
212
+ assert_eq ! ( now. hour( ) , 22 ) ;
213
+ assert_eq ! ( now. minute( ) , 46 ) ;
214
+ assert_eq ! ( now. second( ) , 28 ) ;
215
+ assert_eq ! ( now. millisecond( ) , 77 ) ;
216
+ assert_eq ! ( now. microsecond( ) , 363 ) ;
217
+ assert_eq ! ( now. nanosecond( ) , 694 ) ;
218
+
219
+ let now_iana =
220
+ Now :: plain_datetime_iso_with_provider_and_system_info ( base, uschi. clone ( ) , & provider)
221
+ . unwrap ( ) ;
222
+ assert_eq ! ( now, now_iana) ;
223
+
224
+ let plus_5_secs = TIME_BASE + ( 5 * 1_000_000_000 ) ;
225
+ let plus_5_epoch = EpochNanoseconds :: try_from ( plus_5_secs) . unwrap ( ) ;
226
+ let now_plus_5 =
227
+ Now :: plain_datetime_iso_with_provider_and_system_info ( plus_5_epoch, cdt, & provider)
228
+ . unwrap ( ) ;
229
+ assert_eq ! ( now_plus_5. second( ) , 33 ) ;
230
+
231
+ let duration = now
232
+ . until ( & now_plus_5, DifferenceSettings :: default ( ) )
233
+ . unwrap ( ) ;
234
+ assert ! ( duration. hours( ) . is_zero( ) ) ;
235
+ assert ! ( duration. minutes( ) . is_zero( ) ) ;
236
+ assert_eq ! ( duration. seconds( ) . as_inner( ) , 5.0 ) ;
237
+ assert ! ( duration. milliseconds( ) . is_zero( ) ) ;
238
+ }
239
+
240
+ #[ cfg( all( feature = "tzdb" , feature = "sys" , feature = "compiled_data" ) ) ]
190
241
#[ test]
191
242
fn now_datetime_test ( ) {
243
+ use std:: thread;
244
+ use std:: time:: Duration as StdDuration ;
245
+
192
246
let sleep = 2 ;
193
247
194
248
let before = Now :: plain_datetime_iso ( None ) . unwrap ( ) ;
0 commit comments