[ruby-core:121449] [Ruby Bug#21199] Psych.dump and load on Date before 1582-10-15
From:
"mame (Yusuke Endoh) via ruby-core" <ruby-core@...>
Date:
2025-03-27 09:52:51 UTC
List:
ruby-core #121449
Issue #21199 has been updated by mame (Yusuke Endoh).
Status changed from Open to Feedback
Note that `date` and `date2` are equal in your reproduction code.
```ruby
require 'date'
require 'psych'
date = Date.new(1582, 10, 4)
p "date=#{date.inspect}"
str = Psych.dump(date, permitted_classes: [Date])
p "str=#{str}"
date2 = Psych.load(str, permitted_classes: [Date])
p "date2=#{date2.inspect}"
p date == date2 #=> true
```
The issue is that YAML cannot retain calendar information.
When Psych serializes a `Date` object, it converts it to `Date::GREGORIAN` (the proleptic Gregorian calendar).
As a result, the serialized YAML contains `--- 1582-10-14`, which is intentional.
When deserializing a `Date` from YAML, a `Date::GREGORIAN` Date object is generated.
I believe it would be possible to convert it to an `Date::ITALY` Date object by default.
However, consider a case where a user manually writes `--- 1582-10-14` in YAML and loads it with Psych.
They would then get `Date.new(1582, 10, 4)`, which could be an unexpected result.
For this reason, I thinkg the current behavior is unavoidable.
If you have a specific proposal on how to fix it, please write it.
----------------------------------------
Bug #21199: Psych.dump and load on Date before 1582-10-15
https://bugs.ruby-lang.org/issues/21199#change-112448
* Author: fitmap (Justin Peal)
* Status: Feedback
* ruby -v: ruby 3.2.2 (2023-03-30 revision e51014f9c0) [x64-mingw-ucrt]
* Backport: 3.1: UNKNOWN, 3.2: UNKNOWN, 3.3: UNKNOWN, 3.4: UNKNOWN
----------------------------------------
The code is:
require 'date'
require 'psych'
date = Date.new(1582, 10, 4)
p "date=#{date.inspect}"
str = Psych.dump(date, permitted_classes: [Date])
p "str=#{str}"
date2 = Psych.load(str, permitted_classes: [Date])
p "date2=#{date2.inspect}"
The output is:
"date=#<Date: 1582-10-04 ((2299160j,0s,0n),+0s,2299161j)>"
"str=--- 1582-10-14\n"
"date2=#<Date: 1582-10-14 ((2299160j,0s,0n),+0s,-Infj)>"
--
https://bugs.ruby-lang.org/
______________________________________________
ruby-core mailing list -- [email protected]
To unsubscribe send an email to [email protected]
ruby-core info -- https://ml.ruby-lang.org/mailman3/lists/ruby-core.ml.ruby-lang.org/