pub struct Timestamp {
pub seconds: i64,
pub nanos: i32,
/* private fields */
}Expand description
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 Java Instant.now().
Instant now = Instant.now();
Timestamp timestamp =
Timestamp.newBuilder().setSeconds(now.getEpochSecond())
.setNanos(now.getNano()).build();Example 6: 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 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()
method. In Python, a standard datetime.datetime object can be converted
to this format using
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://joda-time.sourceforge.net/apidocs/org/joda/time/format/ISODateTimeFormat.html#dateTime()
) to obtain a formatter capable of generating timestamps in this format.
Fields§
§seconds: i64Represents 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.
Field 1: seconds
nanos: i32Non-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.
Field 2: nanos
Implementations§
Source§impl Timestamp
impl Timestamp
Sourcepub fn from_unix(seconds: i64, nanos: i32) -> Self
pub fn from_unix(seconds: i64, nanos: i32) -> Self
Create a Timestamp from a Unix epoch offset.
seconds is the number of seconds since (or before, if negative) the
Unix epoch. nanos must be in [0, 999_999_999].
§Panics
Panics in debug mode if nanos is outside [0, 999_999_999].
In release mode the value is stored as-is, producing an invalid
timestamp. Use Timestamp::from_unix_checked for a checked
variant that returns None on invalid input.
Sourcepub fn from_unix_secs(seconds: i64) -> Self
pub fn from_unix_secs(seconds: i64) -> Self
Create a Timestamp from a whole number of Unix seconds (nanoseconds = 0).
This is a convenience shorthand for Timestamp::from_unix(seconds, 0).
Trait Implementations§
Source§impl<'arbitrary> Arbitrary<'arbitrary> for Timestamp
impl<'arbitrary> Arbitrary<'arbitrary> for Timestamp
Source§fn arbitrary(u: &mut Unstructured<'arbitrary>) -> Result<Self>
fn arbitrary(u: &mut Unstructured<'arbitrary>) -> Result<Self>
Self from the given unstructured data. Read moreSource§fn arbitrary_take_rest(u: Unstructured<'arbitrary>) -> Result<Self>
fn arbitrary_take_rest(u: Unstructured<'arbitrary>) -> Result<Self>
Self from the entirety of the given
unstructured data. Read moreSource§fn size_hint(depth: usize) -> (usize, Option<usize>)
fn size_hint(depth: usize) -> (usize, Option<usize>)
Unstructured this type
needs to construct itself. Read moreSource§fn try_size_hint(
depth: usize,
) -> Result<(usize, Option<usize>), MaxRecursionReached>
fn try_size_hint( depth: usize, ) -> Result<(usize, Option<usize>), MaxRecursionReached>
Unstructured this type
needs to construct itself. Read moreSource§impl DefaultInstance for Timestamp
impl DefaultInstance for Timestamp
Source§fn default_instance() -> &'static Self
fn default_instance() -> &'static Self
Source§impl<'de> Deserialize<'de> for Timestamp
Available on crate feature json only.
impl<'de> Deserialize<'de> for Timestamp
json only.Source§fn deserialize<D: Deserializer<'de>>(d: D) -> Result<Self, D::Error>
fn deserialize<D: Deserializer<'de>>(d: D) -> Result<Self, D::Error>
Deserializes from an RFC 3339 string.
Source§impl ExtensionSet for Timestamp
impl ExtensionSet for Timestamp
Source§const PROTO_FQN: &'static str = "google.protobuf.Timestamp"
const PROTO_FQN: &'static str = "google.protobuf.Timestamp"
"google.protobuf.FieldOptions". Read moreSource§fn unknown_fields(&self) -> &UnknownFields
fn unknown_fields(&self) -> &UnknownFields
Source§fn unknown_fields_mut(&mut self) -> &mut UnknownFields
fn unknown_fields_mut(&mut self) -> &mut UnknownFields
Source§fn extension<C>(&self, ext: &Extension<C>) -> <C as ExtensionCodec>::Outputwhere
C: ExtensionCodec,
fn extension<C>(&self, ext: &Extension<C>) -> <C as ExtensionCodec>::Outputwhere
C: ExtensionCodec,
Source§fn set_extension<C>(
&mut self,
ext: &Extension<C>,
value: <C as ExtensionCodec>::Value,
)where
C: ExtensionCodec,
fn set_extension<C>(
&mut self,
ext: &Extension<C>,
value: <C as ExtensionCodec>::Value,
)where
C: ExtensionCodec,
Source§fn try_set_extension<C>(
&mut self,
ext: &Extension<C>,
value: <C as ExtensionCodec>::Value,
) -> Result<(), EncodeError>where
C: ExtensionCodec,
fn try_set_extension<C>(
&mut self,
ext: &Extension<C>,
value: <C as ExtensionCodec>::Value,
) -> Result<(), EncodeError>where
C: ExtensionCodec,
MAX_MESSAGE_BYTES). Read moreSource§fn has_extension<C>(&self, ext: &Extension<C>) -> boolwhere
C: ExtensionCodec,
fn has_extension<C>(&self, ext: &Extension<C>) -> boolwhere
C: ExtensionCodec,
true if any record at the extension’s field number is present. Read moreSource§fn clear_extension<C>(&mut self, ext: &Extension<C>)where
C: ExtensionCodec,
fn clear_extension<C>(&mut self, ext: &Extension<C>)where
C: ExtensionCodec,
Source§fn extension_or_default<C>(
&self,
ext: &Extension<C>,
) -> <C as ExtensionCodec>::Valuewhere
C: ExtensionCodec<Output = Option<<C as ExtensionCodec>::Value>>,
<C as ExtensionCodec>::Value: Default,
fn extension_or_default<C>(
&self,
ext: &Extension<C>,
) -> <C as ExtensionCodec>::Valuewhere
C: ExtensionCodec<Output = Option<<C as ExtensionCodec>::Value>>,
<C as ExtensionCodec>::Value: Default,
[default = ...]
value if absent, or the type’s Default if no proto default was declared. Read moreSource§impl<Tz: TimeZone> From<DateTime<Tz>> for Timestamp
Available on crate feature chrono only.
impl<Tz: TimeZone> From<DateTime<Tz>> for Timestamp
chrono only.Source§fn from(dt: DateTime<Tz>) -> Self
fn from(dt: DateTime<Tz>) -> Self
Convert a chrono::DateTime in any time zone to a protobuf
Timestamp.
Infallible. The instant is preserved — proto Timestamp is always
UTC, so the offset is folded in (a DateTime<FixedOffset> of
2023-11-15T03:13:20+05:00 and a DateTime<Utc> of
2023-11-14T22:13:20Z produce the same Timestamp).
§Examples
use buffa_types::Timestamp;
use chrono::{DateTime, Utc};
let dt = DateTime::<Utc>::from_timestamp(1_700_000_000, 123_456_789).unwrap();
let ts: Timestamp = dt.into();
assert_eq!(ts.seconds, 1_700_000_000);
assert_eq!(ts.nanos, 123_456_789);§Warning: proto JSON spec range
chrono::DateTime supports years up to ~262143, while the proto
JSON spec restricts Timestamp to years 0001–9999. A DateTime
outside that range converts without error here, but the resulting
Timestamp will fail JSON serialization (json feature).
§Leap seconds
A leap-second DateTime (constructed via
NaiveTime::from_hms_nano_opt(_, _, 59, 1_000_000_000)) reports
timestamp_subsec_nanos() of 1_000_000_000, which exceeds the proto
Timestamp.nanos upper bound of 999_999_999. The conversion clamps
the nanos field to 999_999_999 — the leap second collapses to the
final representable nanosecond of the same POSIX second
(23:59:59.999999999).
Source§impl From<SystemTime> for Timestamp
Available on crate feature std only.
impl From<SystemTime> for Timestamp
std only.Source§fn from(t: SystemTime) -> Self
fn from(t: SystemTime) -> Self
Convert a std::time::SystemTime to a protobuf Timestamp.
Pre-epoch times (where t < UNIX_EPOCH) are represented with a
negative seconds field and a non-negative nanos field, following
the protobuf convention that nanos is always in [0, 999_999_999].
§Saturation
Times more than ~292 billion years from the epoch (beyond i64::MAX
seconds) are saturated to i64::MAX seconds rather than wrapping,
which would produce a semantically incorrect negative timestamp.
Source§impl From<Timestamp> for Timestamp
Available on crate feature jiff only.
impl From<Timestamp> for Timestamp
jiff only.Source§fn from(ts: Timestamp) -> Self
fn from(ts: Timestamp) -> Self
Convert a jiff::Timestamp to a protobuf Timestamp.
Infallible: every jiff::Timestamp fits the binary proto
Timestamp range (proto allows any i64 second; jiff spans
≈ years -9999 through 9999, a strict subset).
§Warning: proto JSON spec range
jiff::Timestamp reaches back to ≈ year -9999, but the proto JSON spec
restricts Timestamp to years 0001–9999. A pre-year-1 instant converts
without error here and round-trips through binary encoding, but the
resulting Timestamp will fail JSON serialization (json feature),
which enforces the spec range.
§Sign normalization
jiff::Timestamp reports its sub-second component with the same
sign as the overall instant — a pre-epoch instant has a negative
subsec_nanosecond — whereas
proto Timestamp.nanos is always in [0, 999_999_999]. The conversion
re-normalizes by borrowing a second for negative sub-second components,
so -1.5s becomes { seconds: -2, nanos: 500_000_000 }.
§Examples
use buffa_types::Timestamp;
let jt = jiff::Timestamp::new(1_700_000_000, 123_456_789).unwrap();
let ts: Timestamp = jt.into();
assert_eq!(ts.seconds, 1_700_000_000);
assert_eq!(ts.nanos, 123_456_789);Source§impl HasMessageView for Timestamp
impl HasMessageView for Timestamp
Source§type View<'a> = TimestampView<'a>
type View<'a> = TimestampView<'a>
Self, borrowing from a buffer with lifetime
'a.Source§type ViewHandle = TimestampOwnedView
type ViewHandle = TimestampOwnedView
'static owned-view handle for Self
(FooOwnedView).Source§fn decode_view(buf: &[u8]) -> Result<Self::View<'_>, DecodeError>
fn decode_view(buf: &[u8]) -> Result<Self::View<'_>, DecodeError>
Source§fn decode_view_with_options<'a>(
buf: &'a [u8],
opts: &DecodeOptions,
) -> Result<Self::View<'a>, DecodeError>
fn decode_view_with_options<'a>( buf: &'a [u8], opts: &DecodeOptions, ) -> Result<Self::View<'a>, DecodeError>
View under custom
DecodeOptions (recursion limit, max message
size, unknown-field limit). Read moreSource§fn decode_view_handle(bytes: Bytes) -> Result<Self::ViewHandle, DecodeError>
fn decode_view_handle(bytes: Bytes) -> Result<Self::ViewHandle, DecodeError>
Source§fn decode_view_handle_with_options(
bytes: Bytes,
opts: &DecodeOptions,
) -> Result<Self::ViewHandle, DecodeError>
fn decode_view_handle_with_options( bytes: Bytes, opts: &DecodeOptions, ) -> Result<Self::ViewHandle, DecodeError>
Source§impl Message for Timestamp
impl Message for Timestamp
Source§fn compute_size(&self, _cache: &mut SizeCache) -> u32
fn compute_size(&self, _cache: &mut SizeCache) -> u32
Returns the total encoded size in bytes.
Accumulates in u64 (which cannot overflow for in-memory
data) and saturates to u32 at return, so a message whose
encoded size exceeds the 2 GiB protobuf limit yields a value
above ::buffa::MAX_MESSAGE_BYTES that the encode entry
points reject, never a silently wrapped size.
Source§fn write_to(&self, _cache: &mut SizeCache, buf: &mut impl EncodeSink)
fn write_to(&self, _cache: &mut SizeCache, buf: &mut impl EncodeSink)
cache (populated by a prior
compute_size call on the same cache). Read moreSource§fn merge_field(
&mut self,
tag: Tag,
buf: &mut impl Buf,
ctx: DecodeContext<'_>,
) -> Result<(), DecodeError>
fn merge_field( &mut self, tag: Tag, buf: &mut impl Buf, ctx: DecodeContext<'_>, ) -> Result<(), DecodeError>
buf. Read moreSource§fn encode(&self, buf: &mut impl EncodeSink)
fn encode(&self, buf: &mut impl EncodeSink)
Source§fn try_encode(&self, buf: &mut impl EncodeSink) -> Result<(), EncodeError>
fn try_encode(&self, buf: &mut impl EncodeSink) -> Result<(), EncodeError>
MAX_MESSAGE_BYTES). Read moreSource§fn encode_with_cache(&self, cache: &mut SizeCache, buf: &mut impl EncodeSink)
fn encode_with_cache(&self, cache: &mut SizeCache, buf: &mut impl EncodeSink)
Source§fn try_encode_with_cache(
&self,
cache: &mut SizeCache,
buf: &mut impl EncodeSink,
) -> Result<(), EncodeError>
fn try_encode_with_cache( &self, cache: &mut SizeCache, buf: &mut impl EncodeSink, ) -> Result<(), EncodeError>
SizeCache,
returning an error instead of panicking if the encoded size exceeds
the 2 GiB protobuf limit (MAX_MESSAGE_BYTES). Clears the cache
first. Read moreSource§fn try_encode_bounded(
&self,
max_bytes: u32,
buf: &mut impl EncodeSink,
) -> Result<u32, EncodeError>
fn try_encode_bounded( &self, max_bytes: u32, buf: &mut impl EncodeSink, ) -> Result<u32, EncodeError>
buf only if its encoded size fits within
max_bytes, using a single size pass that is then reused for the write. Read moreSource§fn try_encode_bounded_with_cache(
&self,
max_bytes: u32,
cache: &mut SizeCache,
buf: &mut impl EncodeSink,
) -> Result<u32, EncodeError>
fn try_encode_bounded_with_cache( &self, max_bytes: u32, cache: &mut SizeCache, buf: &mut impl EncodeSink, ) -> Result<u32, EncodeError>
Source§fn encoded_len(&self) -> u32
fn encoded_len(&self) -> u32
Source§fn try_encoded_len(&self) -> Result<u32, EncodeError>
fn try_encoded_len(&self) -> Result<u32, EncodeError>
MAX_MESSAGE_BYTES). Read moreSource§fn encode_length_delimited(&self, buf: &mut impl EncodeSink)
fn encode_length_delimited(&self, buf: &mut impl EncodeSink)
Source§fn try_encode_length_delimited(
&self,
buf: &mut impl EncodeSink,
) -> Result<(), EncodeError>
fn try_encode_length_delimited( &self, buf: &mut impl EncodeSink, ) -> Result<(), EncodeError>
MAX_MESSAGE_BYTES). Read moreSource§fn try_encode_to_vec(&self) -> Result<Vec<u8>, EncodeError>
fn try_encode_to_vec(&self) -> Result<Vec<u8>, EncodeError>
Vec<u8>, returning an error instead of panicking
if the encoded size exceeds the 2 GiB protobuf limit
(MAX_MESSAGE_BYTES). Read moreSource§fn encode_to_bytes(&self) -> Bytes
fn encode_to_bytes(&self) -> Bytes
bytes::Bytes. Read moreSource§fn try_encode_to_bytes(&self) -> Result<Bytes, EncodeError>
fn try_encode_to_bytes(&self) -> Result<Bytes, EncodeError>
bytes::Bytes, returning an error instead of
panicking if the encoded size exceeds the 2 GiB protobuf limit
(MAX_MESSAGE_BYTES). Read moreSource§fn decode(buf: &mut impl Buf) -> Result<Self, DecodeError>where
Self: Sized,
fn decode(buf: &mut impl Buf) -> Result<Self, DecodeError>where
Self: Sized,
Source§fn decode_from_slice(data: &[u8]) -> Result<Self, DecodeError>where
Self: Sized,
fn decode_from_slice(data: &[u8]) -> Result<Self, DecodeError>where
Self: Sized,
Source§fn decode_length_delimited(buf: &mut impl Buf) -> Result<Self, DecodeError>where
Self: Sized,
fn decode_length_delimited(buf: &mut impl Buf) -> Result<Self, DecodeError>where
Self: Sized,
Source§fn merge_to_limit(
&mut self,
buf: &mut impl Buf,
ctx: DecodeContext<'_>,
limit: usize,
) -> Result<(), DecodeError>
fn merge_to_limit( &mut self, buf: &mut impl Buf, ctx: DecodeContext<'_>, limit: usize, ) -> Result<(), DecodeError>
Source§fn merge_group(
&mut self,
buf: &mut impl Buf,
ctx: DecodeContext<'_>,
field_number: u32,
) -> Result<(), DecodeError>
fn merge_group( &mut self, buf: &mut impl Buf, ctx: DecodeContext<'_>, field_number: u32, ) -> Result<(), DecodeError>
buf, reading fields until an
EndGroup tag with the given field_number is encountered. Read moreSource§fn merge(
&mut self,
buf: &mut impl Buf,
ctx: DecodeContext<'_>,
) -> Result<(), DecodeError>
fn merge( &mut self, buf: &mut impl Buf, ctx: DecodeContext<'_>, ) -> Result<(), DecodeError>
Source§fn merge_from_slice(&mut self, data: &[u8]) -> Result<(), DecodeError>
fn merge_from_slice(&mut self, data: &[u8]) -> Result<(), DecodeError>
Source§fn merge_length_delimited(
&mut self,
buf: &mut impl Buf,
ctx: DecodeContext<'_>,
) -> Result<(), DecodeError>
fn merge_length_delimited( &mut self, buf: &mut impl Buf, ctx: DecodeContext<'_>, ) -> Result<(), DecodeError>
Source§impl MessageName for Timestamp
impl MessageName for Timestamp
Source§const PACKAGE: &'static str = "google.protobuf"
const PACKAGE: &'static str = "google.protobuf"
Source§const NAME: &'static str = "Timestamp"
const NAME: &'static str = "Timestamp"
. between nesting levels. Read moreSource§impl ReflectElement for Timestamp
Available on crate feature reflect only.
impl ReflectElement for Timestamp
reflect only.Source§fn as_value_ref(&self) -> ValueRef<'_>
fn as_value_ref(&self) -> ValueRef<'_>
ValueRef.Source§impl ReflectMessage for Timestamp
Available on crate feature reflect only.
impl ReflectMessage for Timestamp
reflect only.Source§fn message_descriptor(&self) -> &MessageDescriptor
fn message_descriptor(&self) -> &MessageDescriptor
Source§fn pool(&self) -> &Arc<DescriptorPool>
fn pool(&self) -> &Arc<DescriptorPool>
MessageIndex /
EnumIndex from FieldKind,
or Arc::clone it to construct sibling DynamicMessages while
navigating nested fields.Source§fn unknown_fields(&self) -> &UnknownFields
fn unknown_fields(&self) -> &UnknownFields
Source§fn for_each_set(&self, f: &mut dyn FnMut(&FieldDescriptor, ValueRef<'_>))
fn for_each_set(&self, f: &mut dyn FnMut(&FieldDescriptor, ValueRef<'_>))
Source§fn to_dynamic(&self) -> DynamicMessage
fn to_dynamic(&self) -> DynamicMessage
DynamicMessage. Read moreSource§fn which_oneof(&self, oneof: &OneofDescriptor) -> Option<&FieldDescriptor>
fn which_oneof(&self, oneof: &OneofDescriptor) -> Option<&FieldDescriptor>
oneof is set, if any. Read moreSource§impl Reflectable for Timestamp
Available on crate feature reflect only.
impl Reflectable for Timestamp
reflect only.Source§fn reflect(&self) -> ReflectCow<'_>
fn reflect(&self) -> ReflectCow<'_>
Vtable-mode reflective handle: borrows self directly. No
encode/decode round-trip and no allocation — the reflective
accessors read this message’s fields in place.
impl StructuralPartialEq for Timestamp
Source§impl TextFormat for Timestamp
impl TextFormat for Timestamp
Source§fn encode_text(&self, enc: &mut TextEncoder<'_>) -> Result
fn encode_text(&self, enc: &mut TextEncoder<'_>) -> Result
enc. Read moreSource§fn merge_text(&mut self, dec: &mut TextDecoder<'_>) -> Result<(), ParseError>
fn merge_text(&mut self, dec: &mut TextDecoder<'_>) -> Result<(), ParseError>
dec into this message. Read moreSource§impl TryFrom<Timestamp> for SystemTime
Available on crate feature std only.
impl TryFrom<Timestamp> for SystemTime
std only.Source§fn try_from(ts: Timestamp) -> Result<Self, Self::Error>
fn try_from(ts: Timestamp) -> Result<Self, Self::Error>
Convert a protobuf Timestamp to a std::time::SystemTime.
§Errors
Returns TimestampError::InvalidNanos if nanos is outside
[0, 999_999_999], or TimestampError::Overflow if the result
does not fit in a std::time::SystemTime.
Source§type Error = TimestampError
type Error = TimestampError
Source§impl TryFrom<Timestamp> for DateTime<Utc>
Available on crate feature chrono only.
impl TryFrom<Timestamp> for DateTime<Utc>
chrono only.Source§fn try_from(ts: Timestamp) -> Result<Self, Self::Error>
fn try_from(ts: Timestamp) -> Result<Self, Self::Error>
Convert a protobuf Timestamp to a chrono::DateTime<Utc>.
§Examples
use buffa_types::Timestamp;
use chrono::{DateTime, Utc};
let ts = Timestamp {
seconds: 1_700_000_000,
nanos: 0,
..Default::default()
};
let dt: DateTime<Utc> = ts.try_into().unwrap();
assert_eq!(dt.timestamp(), 1_700_000_000);§Errors
Returns TimestampError::InvalidNanos if nanos is outside
[0, 999_999_999], or TimestampError::Overflow if the value is
outside the range chrono::DateTime<Utc> can represent.
Source§type Error = TimestampError
type Error = TimestampError
Source§impl TryFrom<Timestamp> for Timestamp
Available on crate feature jiff only.
impl TryFrom<Timestamp> for Timestamp
jiff only.Source§fn try_from(ts: Timestamp) -> Result<Self, Self::Error>
fn try_from(ts: Timestamp) -> Result<Self, Self::Error>
Convert a protobuf Timestamp to a jiff::Timestamp.
§Examples
use buffa_types::Timestamp;
let ts = Timestamp {
seconds: 1_700_000_000,
nanos: 0,
..Default::default()
};
let jt: jiff::Timestamp = ts.try_into().unwrap();
assert_eq!(jt.as_second(), 1_700_000_000);§Errors
Returns TimestampError::InvalidNanos if nanos is outside
[0, 999_999_999], or TimestampError::Overflow if the instant is
outside jiff::Timestamp’s representable range (≈ years -9999 through
9999 — proto permits a far wider second range).