-
Notifications
You must be signed in to change notification settings - Fork 535
/
timestamp.rb
113 lines (111 loc) · 5.02 KB
/
timestamp.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
# Copyright 2020 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
module Google
module Protobuf
# A Timestamp represents a point in time independent of any time zone or local
# calendar, encoded as a count of seconds and fractions of seconds at
# nanosecond resolution. The count is relative to an epoch at UTC midnight on
# January 1, 1970, in the proleptic Gregorian calendar which extends the
# Gregorian calendar backwards to year one.
#
# All minutes are 60 seconds long. Leap seconds are "smeared" so that no leap
# second table is needed for interpretation, using a [24-hour linear
# smear](https://developers.google.com/time/smear).
#
# The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By
# restricting to that range, we ensure that we can convert to and from [RFC
# 3339](https://www.ietf.org/rfc/rfc3339.txt) date strings.
#
# = Examples
#
# Example 1: Compute Timestamp from POSIX `time()`.
#
# Timestamp timestamp;
# timestamp.set_seconds(time(NULL));
# timestamp.set_nanos(0);
#
# Example 2: Compute Timestamp from POSIX `gettimeofday()`.
#
# struct timeval tv;
# gettimeofday(&tv, NULL);
#
# Timestamp timestamp;
# timestamp.set_seconds(tv.tv_sec);
# timestamp.set_nanos(tv.tv_usec * 1000);
#
# Example 3: Compute Timestamp from Win32 `GetSystemTimeAsFileTime()`.
#
# FILETIME ft;
# GetSystemTimeAsFileTime(&ft);
# UINT64 ticks = (((UINT64)ft.dwHighDateTime) << 32) | ft.dwLowDateTime;
#
# // A Windows tick is 100 nanoseconds. Windows epoch 1601-01-01T00:00:00Z
# // is 11644473600 seconds before Unix epoch 1970-01-01T00:00:00Z.
# Timestamp timestamp;
# timestamp.set_seconds((INT64) ((ticks / 10000000) - 11644473600LL));
# timestamp.set_nanos((INT32) ((ticks % 10000000) * 100));
#
# Example 4: Compute Timestamp from Java `System.currentTimeMillis()`.
#
# long millis = System.currentTimeMillis();
#
# Timestamp timestamp = Timestamp.newBuilder().setSeconds(millis / 1000)
# .setNanos((int) ((millis % 1000) * 1000000)).build();
#
#
# Example 5: Compute Timestamp from current time in Python.
#
# timestamp = Timestamp()
# timestamp.GetCurrentTime()
#
# = JSON Mapping
#
# In JSON format, the Timestamp type is encoded as a string in the
# [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) format. That is, the
# format is "{year}-{month}-{day}T{hour}:{min}:{sec}[.{frac_sec}]Z"
# where {year} is always expressed using four digits while {month}, {day},
# {hour}, {min}, and {sec} are zero-padded to two digits each. The fractional
# seconds, which can go up to 9 digits (i.e. up to 1 nanosecond resolution),
# are optional. The "Z" suffix indicates the timezone ("UTC"); the timezone
# is required. A proto3 JSON serializer should always use UTC (as indicated by
# "Z") when printing the Timestamp type and a proto3 JSON parser should be
# able to accept both UTC and other timezones (as indicated by an offset).
#
# For example, "2017-01-15T01:30:15.01Z" encodes 15.01 seconds past
# 01:30 UTC on January 15, 2017.
#
# In JavaScript, one can convert a Date object to this format using the
# standard
# [toISOString()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString)
# method. In Python, a standard `datetime.datetime` object can be converted
# to this format using
# [`strftime`](https://docs.python.org/2/library/time.html#time.strftime) with
# the time format spec '%Y-%m-%dT%H:%M:%S.%fZ'. Likewise, in Java, one can use
# the Joda Time's [`ISODateTimeFormat.dateTime()`](
# http://www.joda.org/joda-time/apidocs/org/joda/time/format/ISODateTimeFormat.html#dateTime%2D%2D
# ) to obtain a formatter capable of generating timestamps in this format.
# @!attribute [rw] seconds
# @return [Integer]
# Represents seconds of UTC time since Unix epoch
# 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
# 9999-12-31T23:59:59Z inclusive.
# @!attribute [rw] nanos
# @return [Integer]
# Non-negative fractions of a second at nanosecond resolution. Negative
# second values with fractions must still have non-negative nanos values
# that count forward in time. Must be from 0 to 999,999,999
# inclusive.
class Timestamp; end
end
end