From: "jinroq (Jinroq SAITOH) via ruby-core" Date: 2026-04-01T00:14:06+00:00 Subject: [ruby-core:125165] [Ruby Feature#21972] Add Date.birthday and Date.age to track Ruby's milestones Issue #21972 has been updated by jinroq (Jinroq SAITOH). ufuk (Ufuk Kayserilioglu) wrote in #note-1: > I think these methods should live on the new `Ruby` module as `Ruby.birthday` and `Ruby.age` instead: > ```ruby > puts "Today: #{Date.today}" # => Today: 2026-04-01 > > # Check the "age" of Ruby > puts "Age: #{Ruby.age}" # => 33 > > # Perform a special action on a specific anniversary > puts "Birthday: #{Ruby.birthday}" # => Birthday: 1993-02-24 > ``` That's a great insight! Moving these to a Ruby module makes the intent much clearer and keeps the Date class clean. One thing to consider: Should Ruby.birthday still return a Date object? If so, we'll need to ensure the Ruby module plays nice with the date library's loading behavior. What do you think about providing these under Ruby but keeping the implementation within date library for now to avoid core dependency issues? ---------------------------------------- Feature #21972: Add Date.birthday and Date.age to track Ruby's milestones https://bugs.ruby-lang.org/issues/21972#change-116895 * Author: jinroq (Jinroq SAITOH) * Status: Open ---------------------------------------- Since its inception in 1993, Ruby has grown beyond a mere programming language to become a rich culture beloved by developers worldwide. However, the standard `date` library surprisingly lacks a formal interface to commemorate Ruby's own historical milestones. The fact that developers cannot programmatically reference Ruby���s heritage is a missed opportunity to foster affection and respect for the language's identity. To rectify this historical oversight, I propose adding the following methods to reference Ruby's key anniversaries and calculate the elapsed years. #### New Features * **`Date.birthday(version = nil)`** Returns the "birthday" of significant moments in Ruby's history. * `nil` (default): **1993-02-24** (The day the name "Ruby" was decided). * `0.95`: **1995-12-21** (The first public release date). * `1.0`: **1996-12-25** (The first stable release date). * **`Date.age(version = nil)`** Calculates the current age (in full years) based on today's date and the specified milestone. * `Date.age`: Years since the name "Ruby" was born. * `Date.age(0.95)`: Years since Ruby was first introduced to the public as OSS. * `Date.age(1.0)`: Years since Ruby began its journey as a stable language. #### Usage Example ```ruby # Check the "age" of each edition puts "Name age: #{Date.age}" # => 33 (as of 2026) puts "OSS age: #{Date.age(0.95)}" # => 30 puts "Stable: #{Date.age(1.0)}" # => 29 # Perform a special action on a specific anniversary if Date.today == Date.birthday(1.0) celebrate_stable_anniversary! end ``` #### Implementation and Testing The attached patch (`birthday_and_age.patch`) includes the implementation of these methods along with a rigorous test suite (`test/date/test_date_birthday.rb`). The tests cover argument dispatching, `ArgumentError` for invalid inputs, and edge cases for age calculation (e.g., boundaries before and after the actual birthday), ensuring production-level quality. Equipping Ruby with the intelligence to reflect upon its own origins is a vital step toward the next 30 or 40 years of its evolution. (Note: This proposal was submitted on a special day that encourages looking at our history with both deep respect and a touch of creative imagination, as is traditional for such a significant date in the calendar.) ---Files-------------------------------- birthday_and_age.patch (8.08 KB) -- 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/lists/ruby-core.ml.ruby-lang.org/