From: "byroot (Jean Boussier) via ruby-core" <ruby-core@...>
Date: 2022-12-23T09:12:13+00:00
Subject: [ruby-core:111394] [Ruby master Bug#19253] `Time` objects can't be efficiently and precisely serialized without Marshal

Issue #19253 has been updated by byroot (Jean Boussier).


Interesting, `to_r` is what we were currently using: https://github.com/Shopify/paquito/pull/28.

The only part missing is the `zone` property:

```ruby
>> t.zone
=> "CET"
>> Time.at(t.to_r, in: t.utc_offset).zone
=> nil
```

It probably isn't a huge deal as it's very unlikely to be used, but would be preferable if it could be restored too.



----------------------------------------
Bug #19253: `Time` objects can't be efficiently and precisely serialized without Marshal
https://bugs.ruby-lang.org/issues/19253#change-100768

* Author: byroot (Jean Boussier)
* Status: Open
* Priority: Normal
* Backport: 2.7: UNKNOWN, 3.0: UNKNOWN, 3.1: UNKNOWN
----------------------------------------
### 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](https://shopify.engineering/caching-without-marshal-part-one)).

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.

```ruby
>> 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:


```ruby
>> 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>
```





-- 
https://bugs.ruby-lang.org/
 ______________________________________________
 ruby-core mailing list -- ruby-core@ml.ruby-lang.org
 To unsubscribe send an email to ruby-core-leave@ml.ruby-lang.org
 ruby-core info -- https://ml.ruby-lang.org/mailman3/postorius/lists/ruby-core.ml.ruby-lang.org/