Skip to content
This repository has been archived by the owner on Mar 27, 2024. It is now read-only.

Commit

Permalink
Add getWeekYear helper
Browse files Browse the repository at this point in the history
  • Loading branch information
mobily committed Feb 2, 2020
1 parent d0b82a9 commit 8f6a9e3
Show file tree
Hide file tree
Showing 5 changed files with 68 additions and 1 deletion.
2 changes: 1 addition & 1 deletion STATUS.md
Original file line number Diff line number Diff line change
Expand Up @@ -137,7 +137,7 @@

### Week-numbering year helpers

- [ ] `getWeekYear`
- [x] `getWeekYear`
- [ ] `setWeekYear`
- [ ] `startOfWeekYear`

Expand Down
20 changes: 20 additions & 0 deletions __tests__/getWeekYear_test.re
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
open Jest;

open Js.Date;

describe("getWeekYear", () => {
open ExpectJs;

test("returns the local week-numbering year of the given date", () => {
let date = makeWithYMD(~year=2019., ~month=11., ~date=29., ());

date |> ReDate.getWeekYear |> expect |> toEqual(2020.);
});

test("allows to specify which day is the first day of the week", () => {
let date = makeWithYMD(~year=2019., ~month=11., ~date=23., ());
let getWeekYear' = ReDate.getWeekYear(~weekStartsOn=Monday);

date |> getWeekYear' |> expect |> toEqual(2019.);
});
});
20 changes: 20 additions & 0 deletions docs/week_numbering.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# Week numbering helpers

#### getWeekYear

> Get the local week-numbering year of the given date.
`let getWeekYear: (~weekStartsOn: day=?, Js.Date.t) => float`

```reason
let date = Js.Date.makeWithYMD(~year=2018., ~month=4., ~date=10., ());
date |> ReDate.getWeekYear;
```

```reason
let date = Js.Date.makeWithYMD(~year=2018., ~month=10., ~date=14., ());
let getWeekYear' = ReDate.getWeekYear(~weekStartsOn=Monday);
date |> getWeekYear';
```
23 changes: 23 additions & 0 deletions src/ReDate.re
Original file line number Diff line number Diff line change
Expand Up @@ -270,6 +270,25 @@ module Internal = {
|> startOrEndOfWeek(weekStartsOn)
|> makeDateWithStartOfDayHours;

let getWeekYear = (~weekStartsOn=Sunday, date) => {
let year = date |> Js.Date.getFullYear |> int_of_float;
let currentYear =
year |> float_of_int |> makeDateWithY |> startOfWeek(~weekStartsOn);
let nextYear =
year
|> succ
|> float_of_int
|> makeDateWithY
|> startOfWeek(~weekStartsOn);

Js.Date.(
date |> getTime >= (nextYear |> getTime)
? year |> succ
: date |> getTime >= (currentYear |> getTime) ? year : year |> pred
)
|> float_of_int;
};

let isLeap = year =>
year mod 400 === 0 || year mod 4 === 0 && year mod 100 !== 0;

Expand Down Expand Up @@ -661,6 +680,10 @@ let differenceInCalendarYears = Internal.differenceIn(CalendarYears);

let differenceInYears = Internal.differenceIn(Years);

/* β€”β€”[Week-numbering year helpers]β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€” */

let getWeekYear = Internal.getWeekYear;

/* β€”β€”[Interval helpers]β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€” */

let isWithinInterval = (interval, date) => {
Expand Down
4 changes: 4 additions & 0 deletions src/ReDate.rei
Original file line number Diff line number Diff line change
Expand Up @@ -213,6 +213,10 @@ let differenceInCalendarYears: (Js.Date.t, Js.Date.t) => int;

let differenceInYears: (Js.Date.t, Js.Date.t) => int;

/* β€”β€”[Week-numbering year helpers]β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€” */

let getWeekYear: (~weekStartsOn: day=?, Js.Date.t) => float;

/* β€”β€”[Interval helpers]β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€” */

let isWithinInterval: (interval, Js.Date.t) => bool;
Expand Down

0 comments on commit 8f6a9e3

Please sign in to comment.