blob: 232d6887348191f070e9a32be92fc9ef9500e4c9 [file] [log] [blame]
// Copyright 2015 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// Package time defines standard representations of absolute and relative times.
//
// The representations described below are required to provide wire
// compatibility between different programming environments. Generated code for
// different environments typically provide automatic conversions into native
// representations, for simpler idiomatic usage.
package time
// Representing dates and times is a complicated topic. Some of the issues:
// 1) The earth's rate of rotation is not regular.
// http://en.wikipedia.org/wiki/Leap_second
// http://en.wikipedia.org/wiki/Coordinated_Universal_Time
// http://en.wikipedia.org/wiki/International_Atomic_Time
// 2) There are different standards for defining calendars.
// http://en.wikipedia.org/wiki/0_(year)
// http://en.wikipedia.org/wiki/Julian_calendar
// http://en.wikipedia.org/wiki/Gregorian_calendar
// http://en.wikipedia.org/wiki/Proleptic_Gregorian_calendar
//
// The most important choice is whether to represent time as a count of ticks
// since an epoch (tick time), or as a date/time for a particular calendar
// (calendar time). Tick time maps naturally to hardware clocks, is cheap to
// represent, and allows using simple subtraction for computing durations.
// Calendar time is typically more semantically meaningful. Conversions between
// tick time and calendar time are complicated by the above issues.
//
// http://en.wikipedia.org/wiki/ISO_8601
// http://en.wikipedia.org/wiki/System_time
// Time represents an absolute point in time with up to nanosecond precision.
//
// Time is represented as the duration before or after a fixed epoch. The zero
// Time represents the epoch 0001-01-01T00:00:00.000000000Z. This uses the
// proleptic Gregorian calendar; the calendar runs on an exact 400 year cycle.
// Leap seconds are "smeared", ensuring that no leap second table is necessary
// for interpretation.
//
// This is similar to Go time.Time, but always in the UTC location.
// http://golang.org/pkg/time/#Time
//
// This is similar to conventional "unix time", but with the epoch defined at
// year 1 rather than year 1970. This allows the zero Time to be used as a
// natural sentry, since it isn't a valid time for many practical applications.
// http://en.wikipedia.org/wiki/Unix_time
type Time Duration
// Duration represents the elapsed duration between two points in time, with
// up to nanosecond precision.
type Duration struct {
// Seconds represents the seconds in the duration. The range is roughly
// +/-290 billion years, larger than the estimated age of the universe.
Seconds int64
// Nanos represents the fractions of a second at nanosecond resolution. Must
// be in the inclusive range between +/-999,999,999.
//
// In normalized form, durations less than one second are represented with 0
// Seconds and +/-Nanos. For durations one second or more, the sign of Nanos
// must match Seconds, or be 0.
Nanos int32
}
// WireDeadline represents the deadline for an operation, where the operation is
// expected to finish before the deadline. The intended usage is for a client
// to set a deadline on an operation, say one minute from "now", and send the
// deadline to a server. The server is expected to finish the operation before
// the deadline.
//
// On a single device, it is simplest to represent a deadline as an absolute
// time; when the time now reaches the deadline, the deadline has expired.
// However when sending a deadline between devices with potential clock skew, it
// is often more robust to represent the deadline as a duration from "now". The
// sender computes the duration from its notion of "now", while the receiver
// computes the absolute deadline from its own notion of "now".
//
// This representation doesn't account for propagation delay, but does ensure
// that the deadline used by the receiver is no earlier than the deadline
// intended by the client. In many common scenarios the propagation delay is
// small compared to the potential clock skew, making this a simple but
// effective approach.
//
// WireDeadline typically has a native representation called Deadline that is an
// absolute Time, which automatically performs the sender and receiver
// conversions from "now".
type WireDeadline struct {
// FromNow represents the deadline as a duration from "now". As a
// special-case, the 0 duration indicates that there is no deadline; i.e. the
// deadline is "infinite".
FromNow Duration
}