zeit

package module
v0.0.0-...-64c4ec0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Feb 16, 2024 License: MIT Imports: 11 Imported by: 0

README

zeit

zeit does contain a few time abstractions that might be useful in other projects.

Go Reference

Key structs

  • Date: Date is a single day with no relevant time of day. (full source: date.go)
  • Time: Time denotes a time within a day. (full source: time.go)
  • Duration: Duration is an immutable description of a minute-scale time duration. (full source: duration.go)
  • Month: Month is a month in a year. Supports navigating back and forth as well as printing in different styles. (full source: month.go)
  • TimeRange: TimeRange is a pair of start and end time while both are optional. (full source: time_range.go)

Tests

go test -count=1 -v ./...
ok  	github.com/jojomi/zeit	0.350s

All test results
=== RUN   Test_parseWithDayDiff
--- PASS: Test_parseWithDayDiff (0.00s)
=== RUN   TestDate_Begin
=== RUN   TestDate_Begin/Default
--- PASS: TestDate_Begin (0.00s)
  --- PASS: TestDate_Begin/Default (0.00s)
=== RUN   TestDate_End
=== RUN   TestDate_End/Default
--- PASS: TestDate_End (0.00s)
  --- PASS: TestDate_End/Default (0.00s)
=== RUN   TestDate_Equals
=== RUN   TestDate_Equals/match
=== RUN   TestDate_Equals/no_match
--- PASS: TestDate_Equals (0.00s)
  --- PASS: TestDate_Equals/match (0.00s)
  --- PASS: TestDate_Equals/no_match (0.00s)
=== RUN   TestDate_Noon
=== RUN   TestDate_Noon/Default
--- PASS: TestDate_Noon (0.00s)
  --- PASS: TestDate_Noon/Default (0.00s)
=== RUN   TestDate_String
=== RUN   TestDate_String/Default
--- PASS: TestDate_String (0.00s)
  --- PASS: TestDate_String/Default (0.00s)
=== RUN   TestNewDateFromTime
=== RUN   TestNewDateFromTime/Default
--- PASS: TestNewDateFromTime (0.00s)
  --- PASS: TestNewDateFromTime/Default (0.00s)
=== RUN   TestDuration_AsClock
=== RUN   TestDuration_AsClock/basic
=== RUN   TestDuration_AsClock/negative
--- PASS: TestDuration_AsClock (0.00s)
  --- PASS: TestDuration_AsClock/basic (0.00s)
  --- PASS: TestDuration_AsClock/negative (0.00s)
=== RUN   TestDuration_AsHours
=== RUN   TestDuration_AsHours/basic
=== RUN   TestDuration_AsHours/negative
--- PASS: TestDuration_AsHours (0.00s)
  --- PASS: TestDuration_AsHours/basic (0.00s)
  --- PASS: TestDuration_AsHours/negative (0.00s)
=== RUN   TestDuration_AsMinutes
=== RUN   TestDuration_AsMinutes/basic
=== RUN   TestDuration_AsMinutes/negative
--- PASS: TestDuration_AsMinutes (0.00s)
  --- PASS: TestDuration_AsMinutes/basic (0.00s)
  --- PASS: TestDuration_AsMinutes/negative (0.00s)
=== RUN   TestDuration_AsRawClock
=== RUN   TestDuration_AsRawClock/basic
--- PASS: TestDuration_AsRawClock (0.00s)
  --- PASS: TestDuration_AsRawClock/basic (0.00s)
=== RUN   TestNewDurationFromHours
=== RUN   TestNewDurationFromHours/basic
=== RUN   TestNewDurationFromHours/negative
--- PASS: TestNewDurationFromHours (0.00s)
  --- PASS: TestNewDurationFromHours/basic (0.00s)
  --- PASS: TestNewDurationFromHours/negative (0.00s)
=== RUN   TestNewDurationFromMinutes
=== RUN   TestNewDurationFromMinutes/basic
=== RUN   TestNewDurationFromMinutes/negative
--- PASS: TestNewDurationFromMinutes (0.00s)
  --- PASS: TestNewDurationFromMinutes/basic (0.00s)
  --- PASS: TestNewDurationFromMinutes/negative (0.00s)
=== RUN   TestDuration_AsFrac
=== RUN   TestDuration_AsFrac/basic
=== RUN   TestDuration_AsFrac/basic_no_language
--- PASS: TestDuration_AsFrac (0.00s)
  --- PASS: TestDuration_AsFrac/basic (0.00s)
  --- PASS: TestDuration_AsFrac/basic_no_language (0.00s)
=== RUN   TestDuration_AsRawFrac
=== RUN   TestDuration_AsRawFrac/basic
--- PASS: TestDuration_AsRawFrac (0.00s)
  --- PASS: TestDuration_AsRawFrac/basic (0.00s)
=== RUN   TestDuration_IsZero
=== RUN   TestDuration_IsZero/positive_non-zero
=== RUN   TestDuration_IsZero/negative_non-zero
=== RUN   TestDuration_IsZero/zero
--- PASS: TestDuration_IsZero (0.00s)
  --- PASS: TestDuration_IsZero/positive_non-zero (0.00s)
  --- PASS: TestDuration_IsZero/negative_non-zero (0.00s)
  --- PASS: TestDuration_IsZero/zero (0.00s)
=== RUN   TestDuration_Minutes
=== RUN   TestDuration_Minutes/basic
=== RUN   TestDuration_Minutes/negative
--- PASS: TestDuration_Minutes (0.00s)
  --- PASS: TestDuration_Minutes/basic (0.00s)
  --- PASS: TestDuration_Minutes/negative (0.00s)
=== RUN   TestDuration_AsSignedClock
=== RUN   TestDuration_AsSignedClock/negative
=== RUN   TestDuration_AsSignedClock/positive
--- PASS: TestDuration_AsSignedClock (0.00s)
  --- PASS: TestDuration_AsSignedClock/negative (0.00s)
  --- PASS: TestDuration_AsSignedClock/positive (0.00s)
=== RUN   TestDuration_RoundedBy
=== RUN   TestDuration_RoundedBy/round_to_full_hour
=== RUN   TestDuration_RoundedBy/round_down_to_full_hour
=== RUN   TestDuration_RoundedBy/round_to_half_hour
=== RUN   TestDuration_RoundedBy/round_to_half_hour#01
=== RUN   TestDuration_RoundedBy/round_down_big_number_of_minutes
=== RUN   TestDuration_RoundedBy/round_down_with_fraction
--- PASS: TestDuration_RoundedBy (0.00s)
  --- PASS: TestDuration_RoundedBy/round_to_full_hour (0.00s)
  --- PASS: TestDuration_RoundedBy/round_down_to_full_hour (0.00s)
  --- PASS: TestDuration_RoundedBy/round_to_half_hour (0.00s)
  --- PASS: TestDuration_RoundedBy/round_to_half_hour#01 (0.00s)
  --- PASS: TestDuration_RoundedBy/round_down_big_number_of_minutes (0.00s)
  --- PASS: TestDuration_RoundedBy/round_down_with_fraction (0.00s)
=== RUN   TestDuration_RoundedDownBy
=== RUN   TestDuration_RoundedDownBy/round_down
=== RUN   TestDuration_RoundedDownBy/round_down_to_zero
=== RUN   TestDuration_RoundedDownBy/round_down_by_factor
--- PASS: TestDuration_RoundedDownBy (0.00s)
  --- PASS: TestDuration_RoundedDownBy/round_down (0.00s)
  --- PASS: TestDuration_RoundedDownBy/round_down_to_zero (0.00s)
  --- PASS: TestDuration_RoundedDownBy/round_down_by_factor (0.00s)
=== RUN   TestDuration_RoundedUpBy
=== RUN   TestDuration_RoundedUpBy/round_up
=== RUN   TestDuration_RoundedUpBy/round_up_from_zero
=== RUN   TestDuration_RoundedUpBy/round_up_by_factor
--- PASS: TestDuration_RoundedUpBy (0.00s)
  --- PASS: TestDuration_RoundedUpBy/round_up (0.00s)
  --- PASS: TestDuration_RoundedUpBy/round_up_from_zero (0.00s)
  --- PASS: TestDuration_RoundedUpBy/round_up_by_factor (0.00s)
=== RUN   TestDuration_IsNegative
=== RUN   TestDuration_IsNegative/negative_value
=== RUN   TestDuration_IsNegative/poitive_value
=== RUN   TestDuration_IsNegative/zero_value
--- PASS: TestDuration_IsNegative (0.00s)
  --- PASS: TestDuration_IsNegative/negative_value (0.00s)
  --- PASS: TestDuration_IsNegative/poitive_value (0.00s)
  --- PASS: TestDuration_IsNegative/zero_value (0.00s)
=== RUN   TestDuration_IsZero1
=== RUN   TestDuration_IsZero1/zero
=== RUN   TestDuration_IsZero1/non-zero
--- PASS: TestDuration_IsZero1 (0.00s)
  --- PASS: TestDuration_IsZero1/zero (0.00s)
  --- PASS: TestDuration_IsZero1/non-zero (0.00s)
=== RUN   TestDuration_IsPositive
=== RUN   TestDuration_IsPositive/positive_value
=== RUN   TestDuration_IsPositive/negative_value
=== RUN   TestDuration_IsPositive/zero_value
--- PASS: TestDuration_IsPositive (0.00s)
  --- PASS: TestDuration_IsPositive/positive_value (0.00s)
  --- PASS: TestDuration_IsPositive/negative_value (0.00s)
  --- PASS: TestDuration_IsPositive/zero_value (0.00s)
=== RUN   TestDuration_String
=== RUN   TestDuration_String/basic_test
--- PASS: TestDuration_String (0.00s)
  --- PASS: TestDuration_String/basic_test (0.00s)
=== RUN   TestDuration_Equals
=== RUN   TestDuration_Equals/same_value
=== RUN   TestDuration_Equals/different_value
--- PASS: TestDuration_Equals (0.00s)
  --- PASS: TestDuration_Equals/same_value (0.00s)
  --- PASS: TestDuration_Equals/different_value (0.00s)
=== RUN   TestDuration_Add
=== RUN   TestDuration_Add/add
--- PASS: TestDuration_Add (0.00s)
  --- PASS: TestDuration_Add/add (0.00s)
=== RUN   TestDuration_Sub
=== RUN   TestDuration_Sub/sub
--- PASS: TestDuration_Sub (0.00s)
  --- PASS: TestDuration_Sub/sub (0.00s)
=== RUN   TestNewDuration
=== RUN   TestNewDuration/simple
--- PASS: TestNewDuration (0.00s)
  --- PASS: TestNewDuration/simple (0.00s)
=== RUN   TestDuration_Format
=== RUN   TestDuration_Format/raw_clock_formatted
=== RUN   TestDuration_Format/raw_frac_formatted
=== RUN   TestDuration_Format/raw_frac_shortened
=== RUN   TestDuration_Format/abs_formatted
=== RUN   TestDuration_Format/pre_and_post_text
=== RUN   TestDuration_Format/sign
=== RUN   TestDuration_Format/forced_sign
--- PASS: TestDuration_Format (0.00s)
  --- PASS: TestDuration_Format/raw_clock_formatted (0.00s)
  --- PASS: TestDuration_Format/raw_frac_formatted (0.00s)
  --- PASS: TestDuration_Format/raw_frac_shortened (0.00s)
  --- PASS: TestDuration_Format/abs_formatted (0.00s)
  --- PASS: TestDuration_Format/pre_and_post_text (0.00s)
  --- PASS: TestDuration_Format/sign (0.00s)
  --- PASS: TestDuration_Format/forced_sign (0.00s)
=== RUN   TestDuration_Parse
=== RUN   TestDuration_Parse/basic
=== RUN   TestDuration_Parse/hours_only
=== RUN   TestDuration_Parse/without_suffix
=== RUN   TestDuration_Parse/invalid
=== RUN   TestDuration_Parse/invalid_minutes
=== RUN   TestDuration_Parse/invalid_negative_minutes
=== RUN   TestDuration_Parse/invalid_single_digit_minutes
=== RUN   TestDuration_Parse/big_hours_duration
--- PASS: TestDuration_Parse (0.00s)
  --- PASS: TestDuration_Parse/basic (0.00s)
  --- PASS: TestDuration_Parse/hours_only (0.00s)
  --- PASS: TestDuration_Parse/without_suffix (0.00s)
  --- PASS: TestDuration_Parse/invalid (0.00s)
  --- PASS: TestDuration_Parse/invalid_minutes (0.00s)
  --- PASS: TestDuration_Parse/invalid_negative_minutes (0.00s)
  --- PASS: TestDuration_Parse/invalid_single_digit_minutes (0.00s)
  --- PASS: TestDuration_Parse/big_hours_duration (0.00s)
=== RUN   TestNewTimeParsed
=== RUN   TestNewTimeParsed/Valid_full
=== RUN   TestNewTimeParsed/Valid_short_(0_padded)
=== RUN   TestNewTimeParsed/Valid_short_(not_0_padded)
=== RUN   TestNewTimeParsed/Without_colon
=== RUN   TestNewTimeParsed/zero_hours
=== RUN   TestNewTimeParsed/hours_invalid
=== RUN   TestNewTimeParsed/hours_invalid_(negative)
=== RUN   TestNewTimeParsed/minutes_invalid
=== RUN   TestNewTimeParsed/minutes_invalid_(negative)
=== RUN   TestNewTimeParsed/format_invalid
--- PASS: TestNewTimeParsed (0.00s)
  --- PASS: TestNewTimeParsed/Valid_full (0.00s)
  --- PASS: TestNewTimeParsed/Valid_short_(0_padded) (0.00s)
  --- PASS: TestNewTimeParsed/Valid_short_(not_0_padded) (0.00s)
  --- PASS: TestNewTimeParsed/Without_colon (0.00s)
  --- PASS: TestNewTimeParsed/zero_hours (0.00s)
  --- PASS: TestNewTimeParsed/hours_invalid (0.00s)
  --- PASS: TestNewTimeParsed/hours_invalid_(negative) (0.00s)
  --- PASS: TestNewTimeParsed/minutes_invalid (0.00s)
  --- PASS: TestNewTimeParsed/minutes_invalid_(negative) (0.00s)
  --- PASS: TestNewTimeParsed/format_invalid (0.00s)
=== RUN   TestNewTime
=== RUN   TestNewTime/making_new_time
=== RUN   TestNewTime/bad_hours
=== RUN   TestNewTime/bad_hours_II
=== RUN   TestNewTime/bad_minutes
=== RUN   TestNewTime/bad_minutes_II
--- PASS: TestNewTime (0.00s)
  --- PASS: TestNewTime/making_new_time (0.00s)
  --- PASS: TestNewTime/bad_hours (0.00s)
  --- PASS: TestNewTime/bad_hours_II (0.00s)
  --- PASS: TestNewTime/bad_minutes (0.00s)
  --- PASS: TestNewTime/bad_minutes_II (0.00s)
PASS
ok  	github.com/jojomi/zeit	0.180s
Test Coverage
go test -cover -count=1 ./...
ok  	github.com/jojomi/zeit	0.267s	coverage: 44.2% of statements

Latest changes

See the (https://github.com/jojomi/zeit/commits/master)[commits on master].

Why the name?

"Zeit" is German for "time".

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func IsValidTime

func IsValidTime(input string) bool

Types

type Date

type Date struct {
	// contains filtered or unexported fields
}

Date is a single day with no relevant time of day.

func NewDateFromTime

func NewDateFromTime(input time.Time) Date

NewDateFromTime creates a new Date from a standard library time.Time.

func NewDateToday

func NewDateToday() Date

NewDateToday creates a new Date from today/now.

func ParseDate

func ParseDate(input string) (Date, error)

ParseDate parses a string as a date. Supported formats:

  • YYYY-MM-DD
  • today, yesterday, tomorrow
  • -2, +4 (days from now)

func (Date) Begin

func (x Date) Begin() time.Time

Begin returns the begin of this day (midnight).

func (Date) End

func (x Date) End() time.Time

End returns the end of this day (one moment before midnight).

func (Date) Equals

func (x Date) Equals(o Date) bool

Equals returns true if and only if two Date structs are denoting the same day.

func (Date) MarshalJSON

func (x Date) MarshalJSON() ([]byte, error)

func (Date) Noon

func (x Date) Noon() time.Time

Noon returns noon of this day.

func (Date) String

func (x Date) String() string

func (Date) UnmarshalJSON

func (x Date) UnmarshalJSON(data []byte) error

type Duration

type Duration struct {
	// contains filtered or unexported fields
}

Duration is an immutable description of a minute-scale time duration.

func MustNewDurationFromString

func MustNewDurationFromString(input string) Duration

MustNewDurationFromString creates a Duration from a given string, panicking if it fails.

func NewDuration

func NewDuration() Duration

NewDuration creates a new Duration.

func NewDurationFromHours

func NewDurationFromHours(hours float64) Duration

NewDurationFromHours creates a Duration from a given number of hours.

func NewDurationFromMinutes

func NewDurationFromMinutes(minutes int) Duration

NewDurationFromMinutes creates a Duration from a given number of minutes.

func NewDurationFromString

func NewDurationFromString(input string) (Duration, error)

NewDurationFromString creates a Duration from a given string.

func NewDurationFromTime

func NewDurationFromTime(duration time.Duration) Duration

NewDurationFromTime creates a new Duration from a time.Duration.

func NewDurationFromTimes

func NewDurationFromTimes(a, b Time) Duration

NewDurationFromTimes creates a Duration from two Time's. Assumed to be forward in time, a < b.

func (Duration) Add

func (x Duration) Add(other Duration) Duration

func (Duration) AsAbsClock

func (x Duration) AsAbsClock() string

func (Duration) AsAbsRawClock

func (x Duration) AsAbsRawClock() string

func (Duration) AsClock

func (x Duration) AsClock() string

func (Duration) AsFrac

func (x Duration) AsFrac(lang *language.Tag) string

func (Duration) AsHours

func (x Duration) AsHours() float64

AsHours returns this Duration as possibly fractional hours.

func (Duration) AsMinutes

func (x Duration) AsMinutes() int

AsMinutes returns this Duration as total minutes.

func (Duration) AsRawClock

func (x Duration) AsRawClock() string

func (Duration) AsRawFrac

func (x Duration) AsRawFrac(lang *language.Tag) string

func (Duration) AsSignedClock

func (x Duration) AsSignedClock() string

func (Duration) AsTime

func (x Duration) AsTime() time.Duration

AsTime returns this Duration as time.Duration.

func (Duration) AsUnicode

func (x Duration) AsUnicode() string

AsUnicode returns the closest unicode clock to this Duration.

func (Duration) Equals

func (x Duration) Equals(other Duration) bool

func (Duration) Format

func (x Duration) Format(layout string) string

Format allows to format a duration similar to time.Format. Valid elements are

3: hours part
|3: absolute hours part
+3: hours part with forced sign indicator (also show +)
04: minutes part with 0 padding to 2 characters if necessary
4: minutes part
07: minutes part as percentage with maximum 2 characters
0-: minutes part as percentage with maximum 2 characters, but minimal length too
184: total minutes

func (*Duration) Hours

func (x *Duration) Hours() int

Hours returns the number of full hours in this Duration.

func (Duration) IsNegative

func (x Duration) IsNegative() bool

IsNegative returns true if the Duration is negative.

func (Duration) IsPositive

func (x Duration) IsPositive() bool

IsPositive returns true if the Duration is positive.

func (Duration) IsZero

func (x Duration) IsZero() bool

func (Duration) MarshalJSON

func (x Duration) MarshalJSON() ([]byte, error)

func (*Duration) Minutes

func (x *Duration) Minutes() int

Minutes returns the number of minutes in this Duration, without full hours.

func (*Duration) Parse

func (x *Duration) Parse(input string) error

Parse sets this Duration to the interpretation of the given string.

func (Duration) RoundedBy

func (x Duration) RoundedBy(rounding float64) Duration

RoundedBy returns a new Duration rounded to the next value given by a number of minutes or a fraction of on hour (for values <= 1). Make sure to only use values that cleanly split the 60 minutes of an hour like 15 (=0.25), 20 (=0.33), 30 (=0.5) or 60 (= 1).

func (Duration) RoundedDownBy

func (x Duration) RoundedDownBy(rounding float64) Duration

RoundedDownBy returns a new Duration rounded down to the next value given by a number of minutes or a fraction of on hour (for values <= 1). Make sure to only use values that cleanly split the 60 minutes of an hour like 15 (=0.25), 20 (=0.33), 30 (=0.5) or 60 (= 1). Also see RoundedBy.

func (Duration) RoundedUpBy

func (x Duration) RoundedUpBy(rounding float64) Duration

RoundedUpBy returns a new Duration rounded down to the next value given by a number of minutes or a fraction of on hour (for values <= 1). Also see RoundedBy.

func (Duration) String

func (x Duration) String() string

func (Duration) Sub

func (x Duration) Sub(other Duration) Duration

func (Duration) UnmarshalJSON

func (x Duration) UnmarshalJSON(data []byte) error

type Month

type Month struct {
	// contains filtered or unexported fields
}

Month is a month in a year. Supports navigating back and forth as well as printing in different styles.

func MustNewMonth

func MustNewMonth(month, year int) Month

func NewMonth

func NewMonth(month, year int) (Month, error)

func NewMonthFromTime

func NewMonthFromTime(input time.Time) Month

func (Month) After

func (x Month) After(other Month) bool

func (Month) Before

func (x Month) Before(other Month) bool

func (Month) Beginning

func (x Month) Beginning(loc *time.Location) time.Time

func (Month) End

func (x Month) End(loc *time.Location) time.Time

func (Month) Equals

func (x Month) Equals(other Month) bool

func (Month) HumanString

func (x Month) HumanString() string

func (Month) IsCurrent

func (x Month) IsCurrent(referenceDate time.Time) bool

func (Month) Month

func (x Month) Month() time.Month

func (Month) MonthNumber

func (x Month) MonthNumber() int

func (Month) MonthsUntil

func (x Month) MonthsUntil(other Month) []Month

MonthsUntil returns all months between this one and the given (later) Month, including both of them.

func (Month) String

func (x Month) String() string

func (Month) WithAddedMonths

func (x Month) WithAddedMonths(monthCount int) Month

func (Month) Year

func (x Month) Year() int

type Time

type Time struct {
	Hours   int
	Minutes int
}

Time denotes a time within a day.

func MustNewTimeParsed

func MustNewTimeParsed(input string) Time

MustNewTimeParsed creates a new Time from a string, panicking if that does not work.

func MustNewTimeParsedPointer

func MustNewTimeParsedPointer(input string) *Time

MustNewTimeParsedPointer creates a pointer to a new Time from a string, panicking if that does not work.

func NewTime

func NewTime(hours, minutes int) (Time, error)

NewTime creates a new Time by given hours and minutes.

func NewTimeFromTime

func NewTimeFromTime(input time.Time) Time

NewTimeFromTime creates a new Time by given time.Time.

func NewTimeParsed

func NewTimeParsed(input string) (Time, error)

NewTimeParsed creates a new Time from a string.

func (*Time) After

func (t *Time) After(o *Time) bool

After returns true if this Time is after another time.

func (*Time) AfterEqual

func (t *Time) AfterEqual(o *Time) bool

AfterEqual returns true if this Time is after another time or they are the same.

func (*Time) AsClock

func (t *Time) AsClock() string

AsClock returns this Time as a string like 9:25.

func (*Time) AsLongClock

func (t *Time) AsLongClock() string

AsLongClock returns this Time as a string like 09:25.

func (*Time) Before

func (t *Time) Before(o *Time) bool

Before returns true if this Time is before another time.

func (*Time) BeforeEqual

func (t *Time) BeforeEqual(o *Time) bool

BeforeEqual returns true if this Time is before another time or they are the same.

func (*Time) Diff

func (t *Time) Diff(o *Time) Duration

Diff returns the absolute Duration between this Time and another Time.

func (*Time) MinutesSinceMidnight

func (t *Time) MinutesSinceMidnight() int

MinutesSinceMidnight returns the number of minutes that have passed to this Time since midnight.

func (*Time) Parse

func (t *Time) Parse(input string) error

Parse sets the time to the interpretation of the given string.

func (*Time) String

func (t *Time) String() string

String returns this Time as a readable string.

type TimeRange

type TimeRange struct {
	Start *Time
	End   *Time
}

TimeRange is a pair of start and end time while both are optional.

func NewTimeRange

func NewTimeRange(start *Time, end *Time) TimeRange

func (TimeRange) Duration

func (x TimeRange) Duration() (Duration, error)

func (TimeRange) DurationUntilNow

func (x TimeRange) DurationUntilNow(now Time) Duration

func (TimeRange) MarshalJSON

func (x TimeRange) MarshalJSON() ([]byte, error)

func (TimeRange) String

func (x TimeRange) String() string

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL