Project

General

Profile

Actions

Bug #15340

closed

Time.local behaving inconsistently for excess days after 2038

Added by dmikurube (Dai MIKURUBE) over 5 years ago. Updated about 5 years ago.

Status:
Closed
Assignee:
-
Target version:
-
ruby -v:
2.4.1, 2.5.1
[ruby-core:90060]

Description

Time.local accepts a day of month that exceeds the largest day of the month, for example, 2018-02-31. The behavior looks inconsistent before v.s. after 2038. Are they expected behavior?

The behavior looks somewhat reasonable before 2037. The number of exceeding days is passed on the next month. 2018-02-31 exceeds for 3 days since 2018-02-28. 2018-02-31 is recognized as 2018-03-03.

But after 2038, the behavior looks strange and inconsistent compared to before 2038, as shown in the example below observed in Ruby 2.4.1 and 2.5.1.

The difference looks affecting Time.strptime as well.

irb(main):001:0> ENV['TZ']=nil
=> nil

irb(main):002:0> Time.local(2037,2,28,0,0,0,0)
=> 2037-02-28 00:00:00 +0900
irb(main):003:0> Time.local(2037,2,29,0,0,0,0)
=> 2037-03-01 00:00:00 +0900
irb(main):004:0> Time.local(2037,2,30,0,0,0,0)
=> 2037-03-02 00:00:00 +0900
irb(main):005:0> Time.local(2037,2,31,0,0,0,0)
=> 2037-03-03 00:00:00 +0900

irb(main):006:0> Time.local(2038,2,28,0,0,0,0)
=> 2038-02-28 00:00:00 +0900
irb(main):007:0> Time.local(2038,2,29,0,0,0,0)
=> 2038-03-01 00:00:00 +0900
irb(main):008:0> Time.local(2038,2,30,0,0,0,0)
=> 2038-02-28 00:00:00 +0900
irb(main):009:0> Time.local(2038,2,31,0,0,0,0)
=> 2038-03-01 00:00:00 +0900

irb(main):010:0> ENV['TZ']='UTC'
=> "UTC"

irb(main):011:0> Time.local(2037,2,28,0,0,0,0)
=> 2037-02-28 00:00:00 +0000
irb(main):012:0> Time.local(2037,2,29,0,0,0,0)
=> 2037-03-01 00:00:00 +0000
irb(main):013:0> Time.local(2037,2,30,0,0,0,0)
=> 2037-03-02 00:00:00 +0000
irb(main):014:0> Time.local(2037,2,31,0,0,0,0)
=> 2037-03-03 00:00:00 +0000

irb(main):015:0> Time.local(2038,2,28,0,0,0,0)
=> 2038-02-28 00:00:00 +0000
irb(main):016:0> Time.local(2038,2,29,0,0,0,0)
=> 2038-03-01 00:00:00 +0000
irb(main):017:0> Time.local(2038,2,30,0,0,0,0)
=> 2038-02-28 00:00:00 +0000
irb(main):018:0> Time.local(2038,2,31,0,0,0,0)
=> 2038-03-01 00:00:00 +0000

JFYI: I thought I observed a case 2038-02-30 is recognized as 2038-03-01 when ENV['TZ']=nil, but just now I couldn't reproduce the case. It might be my mistake in operations, but let me leave the log just in case. (It might be because I was in different timezones when I observed them. The example above was in JST, and the below was in PST.)

irb(main):001:0> ENV['TZ']=nil
=> nil

irb(main):002:0> Time.local(2037,2,30,0,0,0,0)
=> 2037-03-02 00:00:00 -0800
irb(main):003:0> Time.local(2038,2,30,0,0,0,0)
=> 2038-03-01 00:00:00 -0800

Updated by naruse (Yui NARUSE) over 5 years ago

I thought I observed a case 2038-02-30 is recognized as 2038-03-01 when ENV['TZ']=nil, but just now I couldn't reproduce the case. It might be my mistake in operations, but let me leave the log just in case. (It might be because I was in different timezones when I observed them. The example above was in JST, and the below was in PST.)

ENV['TZ'] = nil means "Use system default timezone". In other words, it means Asia/Tokyo in Japan, and America/Los_Angeles in West America.

Actions #2

Updated by naruse (Yui NARUSE) over 5 years ago

  • Status changed from Open to Closed

Applied in changeset trunk|r65974.


Normalize month-mday before finding epoch

Especially over the year 2038, 30 Feb and so on may cause odd behavior
on validating found epoch with given year-month-day [Bug #15340]

Actions #3

Updated by naruse (Yui NARUSE) over 5 years ago

  • Backport changed from 2.3: UNKNOWN, 2.4: UNKNOWN, 2.5: UNKNOWN to 2.3: WONTFIX, 2.4: REQUIRED, 2.5: REQUIRED

Updated by nagachika (Tomoyuki Chikanaga) about 5 years ago

  • Backport changed from 2.3: WONTFIX, 2.4: REQUIRED, 2.5: REQUIRED to 2.3: WONTFIX, 2.4: REQUIRED, 2.5: DONE

ruby_2_5 r66839 merged revision(s) 65974.

Updated by usa (Usaku NAKAMURA) about 5 years ago

  • Backport changed from 2.3: WONTFIX, 2.4: REQUIRED, 2.5: DONE to 2.3: WONTFIX, 2.4: DONE, 2.5: DONE

ruby_2_4 r66967 merged revision(s) 65974.

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0