return now()->as_date();
}
- add_months :: (d: Date, days: i32) -> Date {
+ add_months :: (d: Date, months: i32) -> Date {
nd := d;
- nd.month += 1;
- if nd.month >= 12 {
- nd.month = 0;
+ nd.month += months;
+ while nd.month >= 12 {
+ nd.month -= 12;
nd.year += 1;
}
+ while nd.month < 0 {
+ nd.month += 12;
+ nd.year -= 1;
+ }
+
return nd;
}
return nd;
}
+ day_of_week :: (d: Date) -> i32 {
+ if d.year < 1700 do return -1;
+
+ #persist month_key := i32.[
+ 0, 3, 3, 6, 1, 4, 6, 2, 5, 0, 3, 5
+ ];
+
+ #persist century_key := i32.[
+ 4, 2, 0, 6, 4, 2, 0
+ ];
+
+ dig := d.year % 100;
+ dig += dig / 4;
+ dig += month_key[d.month];
+ dig += century_key[(d.year / 100) - 17];
+ dig += d.day;
+
+ if d.year % 4 == 0 && (d.year % 100 != 0 || d.year % 400 == 0) {
+ if d.month == 0 || d.month == 1 {
+ dig -= 1;
+ }
+ }
+
+ return dig % 7;
+ }
+
is_before :: (d1, d2: Date) -> bool {
if d1.year != d2.year do return d1.year < d2.year;
if d1.month != d2.month do return d1.month < d2.month;