Date 클래스

Date 클래스

Date 클래스는 달력 날짜를 저장하고 조작하는 메서드를 제공해요.

다음 같은 경우라면 Date보다 Time 클래스를 쓰는 걸 고려해 보세요.

  • 날짜와 시간이 둘 다 필요할 때. Date는 날짜만 다뤄요.
  • 그레고리력 날짜(줄리안력이 아닌)만 필요할 때. Julian and Gregorian Calendars 참고.

한 번 만들어진 Date 객체는 불변이고 수정할 수 없어요.

출처: Ruby 3.3 API

본문

Date 만들기

Date.today로 현재 날짜의 날짜 객체를 만들 수 있어요.

Date.today # => #<Date: 1999-12-31>

인자들의 다양한 조합으로 특정 날짜를 만들 수 있어요.

  • Date.new는 정수 연, 월, 일을 받아요. Date.new(1999, 12, 31) # => #<Date: 1999-12-31>
  • Date.ordinal은 정수 연과 연중 일수(day-of-year)를 받아요. Date.ordinal(1999, 365) # => #<Date: 1999-12-31>
  • Date.jd는 정수 율리우스 일(Julian day)을 받아요. Date.jd(2451544) # => #<Date: 1999-12-31>
  • Date.commercial은 정수 상업용 데이터(연, 주, 요일)를 받아요. Date.commercial(1999, 52, 5) # => #<Date: 1999-12-31>
  • Date.parse는 문자열을 받아 휴리스틱하게 파싱해요.
Date.parse('1999-12-31') # => #<Date: 1999-12-31>
Date.parse('31-12-1999') # => #<Date: 1999-12-31>
Date.parse('1999-365') # => #<Date: 1999-12-31>
Date.parse('1999-W52-5') # => #<Date: 1999-12-31>
  • Date.strptime은 날짜 문자열과 형식 문자열을 받아 형식에 따라 날짜 문자열을 파싱해요.
Date.strptime('1999-12-31', '%Y-%m-%d') # => #<Date: 1999-12-31>
Date.strptime('31-12-1999', '%d-%m-%Y') # => #<Date: 1999-12-31>
Date.strptime('1999-365', '%Y-%j') # => #<Date: 1999-12-31>
Date.strptime('1999-W52-5', '%G-W%V-%u') # => #<Date: 1999-12-31>
Date.strptime('1999 52 5', '%Y %U %w') # => #<Date: 1999-12-31>
Date.strptime('1999 52 5', '%Y %W %u') # => #<Date: 1999-12-31>
Date.strptime('fri31dec99', '%a%d%b%y') # => #<Date: 1999-12-31>

limit 인자

문자열 인자를 파싱하는 일부 Date 싱글턴 메서드는 문자열 인자의 길이를 제한하는 선택적 키워드 인자 limit도 받아요.

limit이.

  • 음이 아닌 값: 문자열 길이가 limit보다 크면 ArgumentError 발생.
  • 다른 숫자 또는 nil: limit 무시.
  • 다른 비숫자: TypeError 발생.

상수

  • ABBR_DAYNAMES — 영어의 축약 요일 이름 문자열 배열. 첫 번째는 "Sun".
  • ABBR_MONTHNAMES — 영어의 축약 월 이름 문자열 배열. 첫 번째 요소는 nil.
  • DAYNAMES — 영어의 전체 요일 이름 문자열 배열. 첫 번째는 "Sunday".
  • ENGLAND — 영국과 식민지의 달력 개혁일의 율리우스 일수.
  • GREGORIAN — 선제적 그레고리력을 위한 달력 개혁일의 율리우스 일수.
  • ITALY — 이탈리아와 일부 가톨릭 국가의 달력 개혁일의 율리우스 일수.
  • JULIAN — 선제적 줄리안력을 위한 달력 개혁일의 율리우스 일수.
  • MONTHNAMES — 영어의 전체 월 이름 문자열 배열. 첫 번째 요소는 nil.

클래스 메서드

해시를 돌려주는 파싱 메서드 (_ 접두어)

이들은 문자열을 파싱해서 값의 해시를 돌려줘요.

  • _httpdate(string, limit: 128) → hash — HTTP 날짜 형식에서 파싱한 값의 해시. 관련: Date.httpdate.
  • _iso8601(string, limit: 128) → hash — ISO 8601 형식 날짜에서 파싱한 값의 해시. 관련: Date.iso8601.
  • _jisx0301(string, limit: 128) → hash — JIS X 0301 날짜 형식에서 파싱한 값의 해시. 관련: Date.jisx0301.
  • _parse(string, comp = true, limit: 128) → hash — 문자열에서 파싱한 값의 해시. 검증기가 아니에요. comp가 true이고 연도가 (0..99) 범위면 현재 세기를 붙여요.
Date._parse('2001-02-03') # => {:year=>2001, :mon=>2, :mday=>3}
Date._parse('01-02-03', true) # => {:year=>2001, :mon=>2, :mday=>3}
Date._parse('01-02-03', false) # => {:year=>1, :mon=>2, :mday=>3}
  • _rfc2822(string, limit: 128) → hash (_rfc822) — RFC 2822 날짜 형식에서 파싱한 값의 해시. 관련: Date.rfc2822.
  • _rfc3339(string, limit: 128) → hash — RFC 3339 형식에서 파싱한 값의 해시. 관련: Date.rfc3339.
  • _strptime(string, format = '%F') → hash — 주어진 형식에 따라 문자열에서 파싱한 값의 해시. Date.strftime과 달리 플래그와 너비를 지원하지 않아요. 관련: Date.strptime.
  • _xmlschema(string, limit: 128) → hash — XML 날짜 형식에서 파싱한 값의 해시. 관련: Date.xmlschema.

Date 객체를 돌려주는 생성 메서드

  • civil(*args)Date.new와 같아요.
  • commercial(cwyear = -4712, cweek = 1, cwday = 1, start = Date::ITALY) → date — 인자들로 새 Date 객체를 만들어요. cwyear는 연도(정수). cweek는 연도 안의 주 인덱스로 (1..53)이나 (-53..-1) 범위, 음수면 연말부터 거꾸로 세요. cwday는 주 안의 요일 인덱스로 (1..7)이나 (-7..-1) 범위, 1 또는 -7은 월요일.
Date.commercial(2022, 1, 1).to_s # => "2022-01-03"
Date.commercial(2022, 52, 1).to_s # => "2022-12-26"
  • gregorian_leap?(year) → true or false — 선제적 그레고리력에서 주어진 연도가 윤년이면 true를 돌려줘요: Date.gregorian_leap?(2000) # => true, Date.gregorian_leap?(2001) # => false. 관련: Date.julian_leap?.
  • httpdate(string = 'Mon, 01 Jan -4712 00:00:00 GMT', start = Date::ITALY, limit: 128) → date — HTTP 날짜 형식에서 파싱해 새 Date 객체를 만들어요.
  • iso8601(string = '-4712-01-01', start = Date::ITALY, limit: 128) → date — ISO 8601 형식 날짜에서 파싱해 새 Date 객체를 만들어요.
  • jd(jd = 0, start = Date::ITALY) → date — 인자들로 새 Date 객체를 만들어요. 반환된 날짜는 인자가 start 이상이면 그레고리력, 그 외에는 줄리안력이에요.
Date.jd(2451944).to_s # => "2001-02-03"
Date.jd(Date::ITALY).gregorian? # => true
Date.jd(Date::ITALY - 1).julian? # => true
  • jisx0301(string = '-4712-01-01', start = Date::ITALY, limit: 128) → date — JIS X 0301 형식에서 파싱해 새 Date 객체를 만들어요. 시대 표기 없는 연도의 레거시 형식에서는 Heisei로 가정돼요. Date.jisx0301('13.02.03') # => #<Date: 2001-02-03>
  • json_create(object)as_json 참고.
  • julian_leap?(year) → true or false — 선제적 줄리안력에서 주어진 연도가 윤년이면 true를 돌려줘요: Date.julian_leap?(1900) # => true, Date.julian_leap?(1901) # => false. 관련: Date.gregorian_leap?.
  • new(year = -4712, month = 1, mday = 1, start = Date::ITALY) → date — 인자들로 새 Date 객체를 만들어요. month는 (1..12)이나 (-12..-1) 범위, 음수면 연말부터 거꾸로 세요. mday는 해당 월의 일수 범위, 음수면 월말부터 거꾸로 세요.
Date.new(2022).to_s # => "2022-01-01"
Date.new(2022, 2).to_s # => "2022-02-01"
Date.new(2022, 2, 4).to_s # => "2022-02-04"
Date.new(2022, -11, 4).to_s # => "2022-02-04"
  • ordinal(year = -4712, yday = 1, start = Date::ITALY) → date — 인자들로 새 Date 객체를 만들어요. 양의 yday는 그 해의 n번째 날, 음의 yday는 연말부터 거꾸로 세요. yday가 0이거나 범위 밖이면 예외.
Date.ordinal(2001).to_s # => "2001-01-01"
Date.ordinal(2001, 14).to_s # => "2001-01-14"
Date.ordinal(2001, -14).to_s # => "2001-12-18"
  • parse(string = '-4712-01-01', comp = true, start = Date::ITALY, limit: 128) → date — 문자열에서 파싱해 새 Date 객체를 만들어요. 검증기가 아니에요. comp가 true이고 연도가 (0..99) 범위면 현재 세기를 붙여요.
Date.parse('2001-02-03') # => #<Date: 2001-02-03>
Date.parse('20010203') # => #<Date: 2001-02-03>
Date.parse('3rd Feb 2001') # => #<Date: 2001-02-03>
Date.parse('01-02-03', true) # => #<Date: 2001-02-03>
Date.parse('01-02-03', false) # => #<Date: 0001-02-03>
  • rfc2822(string = 'Mon, 1 Jan -4712 00:00:00 +0000', start = Date::ITALY, limit: 128) → date — RFC 2822 날짜 형식에서 파싱해 새 Date 객체를 만들어요.
  • rfc3339(string = '-4712-01-01T00:00:00+00:00', start = Date::ITALY, limit: 128) → date — RFC 3339 형식에서 파싱해 새 Date 객체를 만들어요.
  • strptime(string = '-4712-01-01', format = '%F', start = Date::ITALY) → date — 주어진 형식에 따라 문자열을 파싱해 새 Date 객체를 만들어요. Date.strftime과 달리 플래그와 너비를 지원하지 않아요.
Date.strptime('2001-02-03', '%Y-%m-%d') # => #<Date: 2001-02-03>
Date.strptime('2001-034', '%Y-%j') # => #<Date: 2001-02-03>
Date.strptime('2001-W05-6', '%G-W%V-%u') # => #<Date: 2001-02-03>
Date.strptime('sat3feb01', '%a%d%b%y') # => #<Date: 2001-02-03>
  • today(start = Date::ITALY) → date — 현재 날짜로 새 Date 객체를 만들어요: Date.today.to_s # => "2022-07-06"
  • valid_civil?(year, month, mday, start = Date::ITALY) → true or false — 인자들이 유효한 역법 날짜를 정의하면 true, 아니면 false를 돌려줘요.
Date.valid_date?(2001, 2, 3) # => true
Date.valid_date?(2001, 2, 29) # => false
Date.valid_date?(2001, 2, -1) # => true
  • valid_commercial?(cwyear, cweek, cwday, start = Date::ITALY) → true or false — 인자들이 유효한 상업용 날짜를 정의하면 true, 아니면 false를 돌려줘요: Date.valid_commercial?(2001, 5, 6) # => true, Date.valid_commercial?(2001, 5, 8) # => false
  • valid_jd?(jd, start = Date::ITALY) → true — 호환용으로 구현, jd가 유효하지 않지 않는 한(즉 Numeric이 아닌 경우) true를 돌려줘요.
  • valid_ordinal?(year, yday, start = Date::ITALY) → true or false — 인자들이 유효한 서수 날짜를 정의하면 true, 아니면 false를 돌려줘요: Date.valid_ordinal?(2001, 34) # => true, Date.valid_ordinal?(2001, 366) # => false
  • xmlschema(string = '-4712-01-01', start = Date::ITALY, limit: 128) → date — XML 날짜 형식에서 파싱해 새 Date 객체를 만들어요.

인스턴스 메서드

산술

  • d + other → dateother 일수 뒤를 가리키는 날짜 객체를 돌려줘요. other는 숫자여야 해요. 분수면 정밀도는 최대 나노초로 가정돼요.
Date.new(2001,2,3) + 1 #=> #<Date: 2001-02-04 ...>
DateTime.new(2001,2,3) + Rational(1,2) #=> #<DateTime: 2001-02-03T12:00:00+00:00 ...>
  • d - other → date or rational — other가 날짜 객체면 두 날짜의 차이를 돌려주고, 숫자면 other 일수 전을 가리키는 날짜 객체를 돌려줘요.
Date.new(2001,2,3) - 1 #=> #<Date: 2001-02-02 ...>
Date.new(2001,2,3) - Date.new(2001) #=> (33/1)
  • d << n → daten개월 전을 나타내는 새 Date 객체. 목표 월에 같은 날이 없으면 그 달의 마지막 날을 사용해요. 예: (Date.new(2001, 3, 31) << 1).to_s # => "2001-02-28"
  • d >> n → new_daten개월 뒤를 나타내는 새 Date 객체. 같은 규칙이에요. 예: (Date.new(2001, 1, 31) >> 1).to_s # => "2001-02-28"
  • self <=> other → -1, 0, 1 or nilselfother를 비교해서 -1(더 큰), 0(같음), 1(더 작은), nil(비교 불가)을 돌려줘요.
  • self === other → true, false, or nilselfother가 같은 날짜를 나타내면 true, 아니면 false, 비교 불가면 nil.
  • downto(min){|date| ... } → selfstep을 인자 min-1로 사용한 것과 같아요.
  • step(limit, step = 1){|date| ... } → self — 지정된 날짜들로 블록을 호출하고 self를 돌려줘요. 첫 dateself, 각 연속 datedate + step, 마지막은 limit(Date 객체)보다 앞이거나 같은 마지막 날짜예요. 블록이 없으면 Enumerator를 돌려줘요.
  • upto(max){|date| ... } → selfstep을 인자 max1로 사용한 것과 같아요.

달력/형식 접근

  • ajd → rational — 천문율리우스 일수. 오프셋에 의해 조정되지 않는 분수 숫자예요.
  • amjd → rational — 수정된 천문율리우스 일수(astronomical modified Julian day number). 분수 숫자.
  • asctime (ctime의 별칭) — 날짜를 asctime 형식 문자열로 돌려줘요.
  • cwday → integer — 상업용 날짜의 요일 인덱스. 1은 월요일. Date.new(2001, 2, 3).cwday # => 6
  • cweek → integer — 상업용 날짜의 주 인덱스. Date.new(2001, 2, 3).cweek # => 5
  • cwyear → integer — 상업용 날짜의 연도. Date.new(2000, 1, 1).cwyear # => 1999
  • day_fraction → rational — (Rational(0,1)…Rational(1,1)) 범위의 날짜의 분수 부분.
  • deconstruct_keys(array_of_names_or_nil) → hash — 패턴 매칭에 쓰이도록 이름/값 쌍의 해시를 돌려줘요. 가능한 키는 :year, :month, :day, :wday, :yday예요.
d = Date.new(2022, 10, 5)
case d
in year: ...2022
  puts "too old"
in wday: 1..5, month:
  puts "working day in month #{month}"
end
#=> prints "working day in month 10"
  • england → new_date — 인자 Date::ENGLANDDate#new_start를 사용한 것과 같아요.
  • friday? → true or falseself가 금요일이면 true.
  • gregorian → new_date — 인자 Date::GREGORIAN으로 Date#new_start를 사용한 것과 같아요.
  • gregorian? → true or false — 날짜가 달력 개혁일 이후(그 날 포함)면 true.
  • httpdate → string — 인자 '%a, %d %b %Y %T GMT'strftime을 사용한 것과 같아요: Date.new(2001, 2, 3).httpdate # => "Sat, 03 Feb 2001 00:00:00 GMT"
  • infinite? → false — false를 돌려줘요.
  • inspect → stringself의 문자열 표현.
  • iso8601 → string (xmlschema의 별칭) — '%Y-%m-%d'(줄여서 '%F')로 strftime한 것과 같아요: Date.new(2001, 2, 3).iso8601 # => "2001-02-03"
  • italy → new_date — 인자 Date::ITALYDate#new_start를 사용한 것과 같아요.
  • jd → integer — 율리우스 일수. 로컬 시간으로서 오프셋에 의해 조정되는 정수.
  • jisx0301 → string — JIS X 0301 형식의 문자열 표현: Date.new(2001, 2, 3).jisx0301 # => "H13.02.03"
  • julian → new_date — 인자 Date::JULIAN으로 Date#new_start를 사용한 것과 같아요.
  • julian? → true or false — 날짜가 달력 개혁일 이전이면 true.
  • ld → integer — 릴리안 일수(Lilian day number), 그레고리력 시작(1582-10-15) 이후의 일수.
  • leap? → true or false — 연도가 윤년이면 true: Date.new(2000).leap? # => true
  • mday (day의 별칭) — 월의 일수를 돌려줘요.
  • mjd → integer — 수정된 율리우스 일수. 로컬 시간으로서 오프셋에 의해 조정되는 정수.
  • mon → integer (month의 별칭) — (1..12) 범위의 월: Date.new(2001, 2, 3).mon # => 2
  • monday? → true or falseself가 월요일이면 true.
  • new_start(start = Date::ITALY]) → new_date — 주어진 start 값으로 self의 복사본을 돌려줘요: d0.new_start(Date::JULIAN).julian? # => true
  • next → new_date (succ의 별칭) — 다음 날을 나타내는 새 Date 객체.
  • next_day(n = 1) → new_dateDate#+에 인자 n을 사용한 것과 같아요.
  • next_month(n = 1) → new_date>>에 인자 n을 사용한 것과 같아요.
  • next_year(n = 1) → new_date>>에 인자 n * 12를 사용한 것과 같아요.
  • prev_day(n = 1) → new_dateDate#-에 인자 n을 사용한 것과 같아요.
  • prev_month(n = 1) → new_date<<에 인자 n을 사용한 것과 같아요.
  • prev_year(n = 1) → new_date<<에 인자 n * 12를 사용한 것과 같아요.
  • rfc2822 → string (rfc822의 별칭) — '%a, %-d %b %Y %T %z'strftime한 것과 같아요: Date.new(2001, 2, 3).rfc2822 # => "Sat, 3 Feb 2001 00:00:00 +0000"
  • rfc3339 → string'%FT%T%:z'strftime한 것과 같아요: Date.new(2001, 2, 3).rfc3339 # => "2001-02-03T00:00:00+00:00"
  • saturday? → true or falseself가 토요일이면 true.
  • start → float — 달력 개혁의 율리우스 시작 날짜를 돌려줘요.
  • strftime(format = '%F') → string — 주어진 format에 따라 self의 문자열 표현을 돌려줘요: Date.new(2001, 2, 3).strftime # => "2001-02-03"
  • sunday? → true or falseself가 일요일이면 true.
  • thursday? → true or falseself가 목요일이면 true.
  • to_date → selfself를 돌려줘요.
  • to_datetime → datetimeself와 같은 값의 DateTime을 돌려줘요.
  • to_json(*args)self를 나타내는 JSON 문자열.
  • to_s → string — ISO 8601 확장 날짜 형식('%Y-%m-%d')의 문자열 표현: Date.new(2001, 2, 3).to_s # => "2001-02-03"
  • to_time → timeself와 같은 값의 새 Time 객체. self가 줄리안 날짜면 변환을 위해 그레고리 날짜를 유도해요.
  • tuesday? → true or falseself가 화요일이면 true.
  • wday → integer — (0..6) 범위의 요일. 일요일이 0: Date.new(2001, 2, 3).wday # => 6
  • wednesday? → true or falseself가 수요일이면 true.
  • yday → integer — (1..366) 범위의 연중 일수: Date.new(2001, 2, 3).yday # => 34
  • year → integer — 연도: Date.new(2001, 2, 3).year # => 2001

더 알아보기