Project

General

Profile

Actions

Bug #19253

closed

`Time` objects can't be efficiently and precisely serialized without Marshal

Added by byroot (Jean Boussier) over 1 year ago. Updated over 1 year ago.

Status:
Closed
Assignee:
-
Target version:
-
[ruby-core:111392]

Description

Context

In our application we try to avoid to use Marshal for serializing cache payloads because we want to be strict on what types we allow to be cached. (Full context in this post).

As such we need to be able to break Time objects into a list of primitive types supported by our serialization format (msgpack).

Problem

Maybe I'm missing something, but I as far as I can tell Time instance can't be recreated in the exact same state.

>> t = Time.now
=> 2022-12-23 09:44:05.693688 +0100
>> Time.at(t.sec, t.nsec, :nanosecond)
=> 1970-01-01 01:00:05.693688 +0100
>> t == Time.at(t.sec, t.nsec, :nanosecond)
=> false
>> t == Time.at(t.sec, t.subsec)
=> false

Additionally, Time objects created with Time.now have a String as Time#zone, and as far as I can tell that can't be reproduced either:

>> t = Time.now
=> 2022-12-23 09:46:22.452771 +0100
>> t.zone
=> "CET"
>> Time.at(t.sec, t.subsec, in: t.utc_offset).zone
=> nil
>> Time.at(t.sec, t.subsec, in: t.zone)
<internal:timev>:274:in `at': "+HH:MM", "-HH:MM", "UTC" or "A".."I","K".."Z" expected for utc_offset: CET (ArgumentError)
>> Time.at(t.sec, t.subsec, in: TZInfo::Timezone.get(t.zone)).zone
=> #<TZInfo::DataTimezone: CET>
Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0