From 634d6af7a1506bb209f972ac75af375d0e523d48 Mon Sep 17 00:00:00 2001 From: Jacob Gee-Clarke Date: Thu, 9 Jul 2020 20:50:42 +0100 Subject: [PATCH] feat(std/datetime): Added weekOfYear (#6659) --- std/datetime/README.md | 10 ++++++++++ std/datetime/mod.ts | 24 ++++++++++++++++++++++++ std/datetime/test.ts | 17 +++++++++++++---- 3 files changed, 47 insertions(+), 4 deletions(-) diff --git a/std/datetime/README.md b/std/datetime/README.md index 6c29f65e49..ae6b6f133e 100644 --- a/std/datetime/README.md +++ b/std/datetime/README.md @@ -37,3 +37,13 @@ import { dayOfYear(new Date("2019-03-11T03:24:00")); // output: 70 currentDayOfYear(); // output: ** depends on when you run it :) ** ``` + +### weekOfYear + +- `weekOfYear(date: Date)` - Returns the week number of the provided date (1-53) + +```ts +import { weekOfYear } from "https://deno.land/std/datetime/mod.ts"; + +weekOfYear(new Date("2020-12-28T03:24:00")); // Returns 53 +``` diff --git a/std/datetime/mod.ts b/std/datetime/mod.ts index 99332e0467..4264645646 100644 --- a/std/datetime/mod.ts +++ b/std/datetime/mod.ts @@ -110,6 +110,30 @@ export function dayOfYear(date: Date): number { return Math.floor(diff / DAY); } +/** + * Get number of the week in the year (ISO-8601) + * @return Number of the week in year + */ +export function weekOfYear(date: Date): number { + const workingDate = new Date( + Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()) + ); + + // Set to nearest Thursday: current date + 4 - current day number + // Make Sunday's day number 7 + workingDate.setUTCDate( + workingDate.getUTCDate() + 4 - (workingDate.getUTCDay() || 7) + ); + + // Get first day of year + const yearStart = new Date(Date.UTC(workingDate.getUTCFullYear(), 0, 1)); + + // return the calculated full weeks to nearest Thursday + return Math.ceil( + ((workingDate.valueOf() - yearStart.valueOf()) / 86400000 + 1) / 7 + ); +} + /** * Get number of current day in year * @return Number of current day in year diff --git a/std/datetime/test.ts b/std/datetime/test.ts index dc4c7278e5..ef4b5dd58e 100644 --- a/std/datetime/test.ts +++ b/std/datetime/test.ts @@ -81,16 +81,25 @@ Deno.test({ Deno.test({ name: "[std/datetime] DayOfYear", fn: () => { - assertEquals(1, datetime.dayOfYear(new Date("2019-01-01T03:24:00"))); - assertEquals(70, datetime.dayOfYear(new Date("2019-03-11T03:24:00"))); - assertEquals(365, datetime.dayOfYear(new Date("2019-12-31T03:24:00"))); + assertEquals(datetime.dayOfYear(new Date("2019-01-01T03:24:00")), 1); + assertEquals(datetime.dayOfYear(new Date("2019-03-11T03:24:00")), 70); + assertEquals(datetime.dayOfYear(new Date("2019-12-31T03:24:00")), 365); }, }); Deno.test({ name: "[std/datetime] currentDayOfYear", fn: () => { - assertEquals(datetime.currentDayOfYear(), datetime.dayOfYear(new Date())); + assertEquals(datetime.dayOfYear(new Date()), datetime.currentDayOfYear()); + }, +}); + +Deno.test({ + name: "[std/datetime] WeekOfYear", + fn: () => { + assertEquals(datetime.weekOfYear(new Date("2020-01-05T03:24:00")), 1); + assertEquals(datetime.weekOfYear(new Date("2020-12-28T03:24:00")), 53); // 53 weeks in 2020 + assertEquals(datetime.weekOfYear(new Date("2020-06-28T03:24:00")), 26); }, });