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

Commit

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

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

### Decade helpers

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

open Js.Date;

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

test(
"returns the date with the time set to 00:00:00 and the date set to the first day of a week year",
() => {
let date = makeWithYMD(~year=2020., ~month=4., ~date=10., ());
let expectedDate =
makeWithYMDHMS(
~year=2019.,
~month=11.,
~date=29.,
~hours=0.,
~minutes=0.,
~seconds=0.,
(),
);

date |> ReDate.startOfWeekYear |> expect |> toEqual(expectedDate);
},
);

test("allows to specify which day is the first day of the week", () => {
let date = makeWithYMD(~year=2020., ~month=4., ~date=10., ());
let expectedDate =
setHoursMSMs(
makeWithYMD(~year=2019., ~month=11., ~date=30., ()),
~hours=0.,
~minutes=0.,
~seconds=0.,
~milliseconds=0.,
(),
)
|> fromFloat;
let startOfWeekYear' = ReDate.startOfWeekYear(~weekStartsOn=Monday);

date |> startOfWeekYear' |> expect |> toEqual(expectedDate);
});
});
19 changes: 19 additions & 0 deletions docs/week_numbering.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,3 +18,22 @@ let getWeekYear' = ReDate.getWeekYear(~weekStartsOn=Monday);
date |> getWeekYear';
```

#### startOfWeekYear

> Return the start of a local week-numbering year.
`let startOfWeekYear: (~weekStartsOn: day=?, Js.Date.t) => Js.Date.t`

```reason
let date = Js.Date.makeWithYMD(~year=2018., ~month=0., ~date=12., ());
date |> ReDate.startOfWeekYear;
```

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

let startOfWeekYear = (~weekStartsOn=Sunday, date) => {
let year = date |> getWeekYear(~weekStartsOn);
year |> makeDateWithY |> startOfWeek(~weekStartsOn);
};

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

Expand Down Expand Up @@ -684,6 +689,8 @@ let differenceInYears = Internal.differenceIn(Years);

let getWeekYear = Internal.getWeekYear;

let startOfWeekYear = Internal.startOfWeekYear;

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

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

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

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

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

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

0 comments on commit 44feed5

Please sign in to comment.