@@ -11,33 +11,71 @@ import kotlin.time.*
1111 * A source of [Instant] values.
1212 *
1313 * See [Clock.System][Clock.System] for the clock instance that queries the operating system.
14+ *
15+ * It is not recommended to use [Clock.System] directly in the implementation. Instead, you can pass a
16+ * [Clock] explicitly to the necessary functions or classes.
17+ * This way, tests can be written deterministically by providing custom [Clock] implementations
18+ * to the system under test.
1419 */
1520public interface Clock {
1621 /* *
1722 * Returns the [Instant] corresponding to the current time, according to this clock.
23+ *
24+ * It is not guaranteed that calling [now] later will return a larger [Instant].
25+ * In particular, for [Clock.System] it is completely expected that the opposite will happen,
26+ * and it must be taken into account.
27+ * See the [System] documentation for details.
28+ *
29+ * Even though [Instant] is defined to be on the UTC-SLS time scale, which enforces a specific way of handling
30+ * leap seconds, [now] is not guaranteed to handle leap seconds in any specific way.
1831 */
1932 public fun now (): Instant
2033
2134 /* *
22- * The [Clock] instance that queries the operating system as its source of knowledge of time.
35+ * The [Clock] instance that queries the platform-specific system clock as its source of time knowledge.
36+ *
37+ * Successive calls to [now] will not necessarily return increasing [Instant] values, and when they do,
38+ * these increases will not necessarily correspond to the elapsed time.
39+ *
40+ * For example, when using [Clock.System], the following could happen:
41+ * - [now] returns `2023-01-02T22:35:01Z`.
42+ * - The system queries the Internet and recognizes that its clock needs adjusting.
43+ * - [now] returns `2023-01-02T22:32:05Z`.
44+ *
45+ * When you need predictable intervals between successive measurements, consider using [TimeSource.Monotonic].
46+ *
47+ * For improved testability, you should avoid using [Clock.System] directly in the implementation
48+ * and pass a [Clock] explicitly instead. For example:
49+ *
50+ * @sample kotlinx.datetime.test.samples.ClockSamples.system
51+ * @sample kotlinx.datetime.test.samples.ClockSamples.dependencyInjection
2352 */
2453 public object System : Clock {
2554 override fun now (): Instant = @Suppress(" DEPRECATION_ERROR" ) Instant .now()
2655 }
2756
57+ /* * A companion object used purely for namespacing. */
2858 public companion object {
2959
3060 }
3161}
3262
3363/* *
3464 * Returns the current date at the given [time zone][timeZone], according to [this Clock][this].
65+ *
66+ * The time zone is important because the current date is not the same in all time zones at the same instant.
67+ *
68+ * @sample kotlinx.datetime.test.samples.ClockSamples.todayIn
3569 */
3670public fun Clock.todayIn (timeZone : TimeZone ): LocalDate =
3771 now().toLocalDateTime(timeZone).date
3872
3973/* *
4074 * Returns a [TimeSource] that uses this [Clock] to mark a time instant and to find the amount of time elapsed since that mark.
75+ *
76+ * **Pitfall**: using this function with [Clock.System] is error-prone
77+ * because [Clock.System] is not well suited for measuring time intervals.
78+ * Please only use this conversion function on the [Clock] instances that are fully controlled programmatically.
4179 */
4280@ExperimentalTime
4381public fun Clock.asTimeSource (): TimeSource .WithComparableMarks = object : TimeSource .WithComparableMarks {
0 commit comments