diff --git a/lib/nepali_calendar/ad_calendar.rb b/lib/nepali_calendar/ad_calendar.rb index 640449d..6180088 100644 --- a/lib/nepali_calendar/ad_calendar.rb +++ b/lib/nepali_calendar/ad_calendar.rb @@ -28,29 +28,29 @@ def today end def beginning_of_week - date = { year: year, month: month, day: day, wday: wday, month_name: Date::MONTHNAMES[month], - wday_name: Date::DAYNAMES[wday] } + date = { year: year, month: month, day: day, wday: wday, month_name: Date::MONTHNAMES[month.to_i], + wday_name: Date::DAYNAMES[wday.to_i] } formatted_date = Date.parse(NepaliCalendar::Calendar.new('', date).to_s) formatted_date.beginning_of_week end def end_of_week - date = { year: year, month: month, day: day, wday: wday, month_name: Date::MONTHNAMES[month], - wday_name: Date::DAYNAMES[wday] } + date = { year: year, month: month, day: day, wday: wday, month_name: Date::MONTHNAMES[month.to_i], + wday_name: Date::DAYNAMES[wday.to_i] } formatted_date = Date.parse(NepaliCalendar::Calendar.new('', date).to_s) formatted_date.end_of_week end def beginning_of_month - date = { year: year, month: month, day: day, wday: wday, month_name: Date::MONTHNAMES[month], - wday_name: Date::DAYNAMES[wday] } + date = { year: year, month: month, day: day, wday: wday, month_name: Date::MONTHNAMES[month.to_i], + wday_name: Date::DAYNAMES[wday.to_i] } formatted_date = Date.parse(NepaliCalendar::Calendar.new('', date).to_s) formatted_date.beginning_of_month end def end_of_month - date = { year: year, month: month, day: day, wday: wday, month_name: Date::MONTHNAMES[month], - wday_name: Date::DAYNAMES[wday] } + date = { year: year, month: month, day: day, wday: wday, month_name: Date::MONTHNAMES[month.to_i], + wday_name: Date::DAYNAMES[wday.to_i] } formatted_date = Date.parse(NepaliCalendar::Calendar.new('', date).to_s) formatted_date.end_of_month end @@ -70,7 +70,7 @@ def self.travel_forward(days) ad = Date.parse(ref_date['bs_to_ad']['ad']) + days option = { year: ad.year, month: ad.month, day: ad.day, wday: ad.wday, - month_name: Date::MONTHNAMES[ad.month], wday_name: ad.strftime('%A') } + month_name: Date::MONTHNAMES[ad.month.to_i], wday_name: ad.strftime('%A') } new('', option) end @@ -111,5 +111,9 @@ def date_range start_date.end_of_month.end_of_week ] end + + def to_date + Date.new(year, month, day) + end end end diff --git a/lib/nepali_calendar/bs_calendar.rb b/lib/nepali_calendar/bs_calendar.rb index 54cd07d..0621b11 100644 --- a/lib/nepali_calendar/bs_calendar.rb +++ b/lib/nepali_calendar/bs_calendar.rb @@ -4,6 +4,7 @@ module NepaliCalendar class BsCalendar < NepaliCalendar::Calendar MONTHNAMES = %w[nil Baisakh Jestha Ashad Shrawn Bhadra Ashwin Kartik Mangshir Poush Magh Falgun Chaitra].freeze DAYNAMES = %w[nil Aitabar Sombar Mangalbar Budhbar Bihibar Sukrabar Sanibar].freeze + class << self def ad_to_bs(year, month, day) raise NepaliCalendar::Calendar::NilDateFieldsException unless valid_date_input?(year, month, day) @@ -29,6 +30,20 @@ def today end end + def date + # Convert nepali date to Ad date + date = self.to_ad + + # Create new date object with the Ad date + date_object = Date.new(date[:year], date[:month], date[:day]) + + # Get the week_day name, month name + weekday_name = DAYNAMES[date_object.wday + 1] + month_name = MONTHNAMES[@month] + + { weekday_name: weekday_name, month_name: month_name, day: @day, month: @month, year: @year } + end + def beginning_of_week date = { year: year, month: month, day: day, wday: wday } days = wday > 1 ? -(wday - 1) : 0 @@ -146,5 +161,29 @@ def date_range start_date.end_of_month.end_of_week ] end + + def to_ad + if !year || !month || !day + raise NilDateFieldsException + end + + if !NepaliCalendar::Calendar.valid_date_input?(year, month, day) + raise InvalidBSDateException + end + + ad_date = NepaliCalendar::Calendar.ref_date['bs_to_ad']['ad'] + bs_date = NepaliCalendar::Calendar.ref_date['bs_to_ad']['bs'] + + total_days = NepaliCalendar::Calendar.total_days_for_bs("#{year}/#{month}/#{day}", bs_date) + ad_date = Date.parse(ad_date) + total_days + { + year: ad_date.year, + month: ad_date.month, + day: ad_date.day, + wday: ad_date.wday, + month_name: I18n.t("date.month_names")[ad_date.month], + wday_name: I18n.t("date.day_names")[ad_date.wday], + } + end end end diff --git a/spec/nepali_calendar_spec.rb b/spec/nepali_calendar_spec.rb index 47de788..bfca960 100644 --- a/spec/nepali_calendar_spec.rb +++ b/spec/nepali_calendar_spec.rb @@ -102,6 +102,15 @@ d1 = NepaliCalendar::BsCalendar.ad_to_bs(2015, 10, 20).end_of_month expect(d1.class).to eq(NepaliCalendar::BsCalendar) end + + describe '#to_ad' do + let(:expected_date) { { year: 2023, month: 3, day: 7, wday: 2, month_name: "March", wday_name: "Tuesday" } } + let(:bs_calendar) { NepaliCalendar::BsCalendar.new(nil, { year: 2079, month: 11, day: 23 }) } + + it 'converts the date from the BS to the AD date' do + expect(bs_calendar.to_ad).to eq(expected_date) + end + end end context '#AdCalendar' do @@ -158,6 +167,23 @@ d1 = NepaliCalendar::AdCalendar.bs_to_ad(2076, 7, 15).end_of_month expect(d1).to eq(Date.parse('Sat, 30 Nov, 2019')) end + + describe '#to_date' do + it 'returns a Date object for a valid Ad date' do + ad_calendar = NepaliCalendar::AdCalendar.new(nil, { year: 2033, month: 12, day:12 }) + date = ad_calendar.to_date + expect(date).to be_a(Date) + expect(date.year).to eq(2033) + expect(date.month).to eq(12) + expect(date.day).to eq(12) + end + + it 'raises an error for an invalid date string' do + expect { ad_date.to_date('2022-02-31') }.to raise_error(ArgumentError) + expect { ad_date.to_date('2022-13-01') }.to raise_error(ArgumentError) + expect { ad_date.to_date('2022-01-') }.to raise_error(ArgumentError) + end + end end context '#FiscalYear' do