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) # => falsevalid_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) # => falsexmlschema(string = '-4712-01-01', start = Date::ITALY, limit: 128) → date— XML 날짜 형식에서 파싱해 새Date객체를 만들어요.
인스턴스 메서드
산술
d + other → date—other일수 뒤를 가리키는 날짜 객체를 돌려줘요. 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 → date—n개월 전을 나타내는 새Date객체. 목표 월에 같은 날이 없으면 그 달의 마지막 날을 사용해요. 예:(Date.new(2001, 3, 31) << 1).to_s # => "2001-02-28"d >> n → new_date—n개월 뒤를 나타내는 새Date객체. 같은 규칙이에요. 예:(Date.new(2001, 1, 31) >> 1).to_s # => "2001-02-28"self <=> other → -1, 0, 1 or nil—self와other를 비교해서 -1(더 큰), 0(같음), 1(더 작은), nil(비교 불가)을 돌려줘요.self === other → true, false, or nil—self와other가 같은 날짜를 나타내면 true, 아니면 false, 비교 불가면 nil.downto(min){|date| ... } → self—step을 인자min과-1로 사용한 것과 같아요.step(limit, step = 1){|date| ... } → self— 지정된 날짜들로 블록을 호출하고self를 돌려줘요. 첫date는self, 각 연속date는date + step, 마지막은limit(Date 객체)보다 앞이거나 같은 마지막 날짜예요. 블록이 없으면Enumerator를 돌려줘요.upto(max){|date| ... } → self—step을 인자max와1로 사용한 것과 같아요.
달력/형식 접근
ajd → rational— 천문율리우스 일수. 오프셋에 의해 조정되지 않는 분수 숫자예요.amjd → rational— 수정된 천문율리우스 일수(astronomical modified Julian day number). 분수 숫자.asctime(ctime의 별칭) — 날짜를 asctime 형식 문자열로 돌려줘요.cwday → integer— 상업용 날짜의 요일 인덱스. 1은 월요일.Date.new(2001, 2, 3).cwday # => 6cweek → integer— 상업용 날짜의 주 인덱스.Date.new(2001, 2, 3).cweek # => 5cwyear → integer— 상업용 날짜의 연도.Date.new(2000, 1, 1).cwyear # => 1999day_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::ENGLAND로Date#new_start를 사용한 것과 같아요.friday? → true or false—self가 금요일이면 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 → string—self의 문자열 표현.iso8601 → string(xmlschema의 별칭) —'%Y-%m-%d'(줄여서'%F')로strftime한 것과 같아요:Date.new(2001, 2, 3).iso8601 # => "2001-02-03"italy → new_date— 인자Date::ITALY로Date#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? # => truemday(day의 별칭) — 월의 일수를 돌려줘요.mjd → integer— 수정된 율리우스 일수. 로컬 시간으로서 오프셋에 의해 조정되는 정수.mon → integer(month의 별칭) — (1..12) 범위의 월:Date.new(2001, 2, 3).mon # => 2monday? → true or false—self가 월요일이면 true.new_start(start = Date::ITALY]) → new_date— 주어진start값으로self의 복사본을 돌려줘요:d0.new_start(Date::JULIAN).julian? # => truenext → new_date(succ의 별칭) — 다음 날을 나타내는 새Date객체.next_day(n = 1) → new_date—Date#+에 인자n을 사용한 것과 같아요.next_month(n = 1) → new_date—>>에 인자n을 사용한 것과 같아요.next_year(n = 1) → new_date—>>에 인자n * 12를 사용한 것과 같아요.prev_day(n = 1) → new_date—Date#-에 인자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 false—self가 토요일이면 true.start → float— 달력 개혁의 율리우스 시작 날짜를 돌려줘요.strftime(format = '%F') → string— 주어진format에 따라self의 문자열 표현을 돌려줘요:Date.new(2001, 2, 3).strftime # => "2001-02-03"sunday? → true or false—self가 일요일이면 true.thursday? → true or false—self가 목요일이면 true.to_date → self—self를 돌려줘요.to_datetime → datetime—self와 같은 값의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 → time—self와 같은 값의 새Time객체.self가 줄리안 날짜면 변환을 위해 그레고리 날짜를 유도해요.tuesday? → true or false—self가 화요일이면 true.wday → integer— (0..6) 범위의 요일. 일요일이 0:Date.new(2001, 2, 3).wday # => 6wednesday? → true or false—self가 수요일이면 true.yday → integer— (1..366) 범위의 연중 일수:Date.new(2001, 2, 3).yday # => 34year → integer— 연도:Date.new(2001, 2, 3).year # => 2001
더 알아보기
- DateTime — 날짜와 시간을 함께 다루는
Date의 서브클래스 - 날짜와 시간의 형식](https://docs.ruby-lang.org/en/3.3/strftime_rdoc.html) —
strftime형식