diff options
| author | Vincent LE GOFF <g_n_s@hotmail.fr> | 2019-03-11 16:00:30 +0100 |
|---|---|---|
| committer | Ryan Dahl <ry@tinyclouds.org> | 2019-03-11 11:00:30 -0400 |
| commit | 8127cfb9ea7ffc35d9486bea37fd4c407dd80268 (patch) | |
| tree | 8b5529330b8414d5c52e074bb66c038ca5171cb2 | |
| parent | 1870a8ec72ef6febd7795a3ff4cb61d78f6eccb5 (diff) | |
Datetime module improvement (denoland/deno_std#259)
Original: https://github.com/denoland/deno_std/commit/5852cd251b249ff19bda15f5eb29ac32b2176928
| -rw-r--r-- | datetime/mod.ts | 96 | ||||
| -rw-r--r-- | datetime/test.ts | 14 |
2 files changed, 66 insertions, 44 deletions
diff --git a/datetime/mod.ts b/datetime/mod.ts index 96ed3a860..1e75ba4dc 100644 --- a/datetime/mod.ts +++ b/datetime/mod.ts @@ -10,18 +10,23 @@ export type DateFormat = "mm-dd-yyyy" | "dd-mm-yyyy" | "yyyy-mm-dd"; */ export function parseDate(dateStr: string, format: DateFormat): Date { let m, d, y: string; + let datePattern: RegExp; - if (format === "mm-dd-yyyy") { - const datePattern = /^(\d{2})-(\d{2})-(\d{4})$/; - [, m, d, y] = datePattern.exec(dateStr)!; - } else if (format === "dd-mm-yyyy") { - const datePattern = /^(\d{2})-(\d{2})-(\d{4})$/; - [, d, m, y] = datePattern.exec(dateStr)!; - } else if (format === "yyyy-mm-dd") { - const datePattern = /^(\d{4})-(\d{2})-(\d{2})$/; - [, y, m, d] = datePattern.exec(dateStr)!; - } else { - throw new Error("Invalid date format!"); + switch (format) { + case "mm-dd-yyyy": + datePattern = /^(\d{2})-(\d{2})-(\d{4})$/; + [, m, d, y] = datePattern.exec(dateStr)!; + break; + case "dd-mm-yyyy": + datePattern = /^(\d{2})-(\d{2})-(\d{4})$/; + [, d, m, y] = datePattern.exec(dateStr)!; + break; + case "yyyy-mm-dd": + datePattern = /^(\d{4})-(\d{2})-(\d{2})$/; + [, y, m, d] = datePattern.exec(dateStr)!; + break; + default: + throw new Error("Invalid date format!"); } return new Date(Number(y), Number(m) - 1, Number(d)); @@ -47,42 +52,59 @@ export function parseDateTime( format: DateTimeFormat ): Date { let m, d, y, ho, mi: string; + let datePattern: RegExp; - if (format === "mm-dd-yyyy hh:mm") { - const datePattern = /^(\d{2})-(\d{2})-(\d{4}) (\d{2}):(\d{2})$/; - [, m, d, y, ho, mi] = datePattern.exec(datetimeStr)!; - } else if (format === "dd-mm-yyyy hh:mm") { - const datePattern = /^(\d{2})-(\d{2})-(\d{4}) (\d{2}):(\d{2})$/; - [, d, m, y, ho, mi] = datePattern.exec(datetimeStr)!; - } else if (format === "yyyy-mm-dd hh:mm") { - const datePattern = /^(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2})$/; - [, y, m, d, ho, mi] = datePattern.exec(datetimeStr)!; - } else if (format === "hh:mm mm-dd-yyyy") { - const datePattern = /^(\d{2}):(\d{2}) (\d{2})-(\d{2})-(\d{4})$/; - [, ho, mi, m, d, y] = datePattern.exec(datetimeStr)!; - } else if (format === "hh:mm dd-mm-yyyy") { - const datePattern = /^(\d{2}):(\d{2}) (\d{2})-(\d{2})-(\d{4})$/; - [, ho, mi, d, m, y] = datePattern.exec(datetimeStr)!; - } else if (format === "hh:mm yyyy-mm-dd") { - const datePattern = /^(\d{2}):(\d{2}) (\d{4})-(\d{2})-(\d{2})$/; - [, ho, mi, y, m, d] = datePattern.exec(datetimeStr)!; - } else { - throw new Error("Invalid datetime format!"); + switch (format) { + case "mm-dd-yyyy hh:mm": + datePattern = /^(\d{2})-(\d{2})-(\d{4}) (\d{2}):(\d{2})$/; + [, m, d, y, ho, mi] = datePattern.exec(datetimeStr)!; + break; + case "dd-mm-yyyy hh:mm": + datePattern = /^(\d{2})-(\d{2})-(\d{4}) (\d{2}):(\d{2})$/; + [, d, m, y, ho, mi] = datePattern.exec(datetimeStr)!; + break; + case "yyyy-mm-dd hh:mm": + datePattern = /^(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2})$/; + [, y, m, d, ho, mi] = datePattern.exec(datetimeStr)!; + break; + case "hh:mm mm-dd-yyyy": + datePattern = /^(\d{2}):(\d{2}) (\d{2})-(\d{2})-(\d{4})$/; + [, ho, mi, m, d, y] = datePattern.exec(datetimeStr)!; + break; + case "hh:mm dd-mm-yyyy": + datePattern = /^(\d{2}):(\d{2}) (\d{2})-(\d{2})-(\d{4})$/; + [, ho, mi, d, m, y] = datePattern.exec(datetimeStr)!; + break; + case "hh:mm yyyy-mm-dd": + datePattern = /^(\d{2}):(\d{2}) (\d{4})-(\d{2})-(\d{2})$/; + [, ho, mi, y, m, d] = datePattern.exec(datetimeStr)!; + break; + default: + throw new Error("Invalid datetime format!"); } return new Date(Number(y), Number(m) - 1, Number(d), Number(ho), Number(mi)); } /** + * Get number of the day in the year + * @return {number} Number of the day in year + */ +export function dayOfYear(date: Date): any { + const dayMs = 1000 * 60 * 60 * 24; + const yearStart = new Date(date.getFullYear(), 0, 0); + const diff = + date.getTime() - + yearStart.getTime() + + (yearStart.getTimezoneOffset() - date.getTimezoneOffset()) * 60 * 1000; + return Math.floor(diff / dayMs); +} + +/** * Get number of current day in year * * @return {number} Number of current day in year */ export function currentDayOfYear(): number { - return ( - Math.ceil(new Date().getTime() / 86400000) - - Math.floor( - new Date().setFullYear(new Date().getFullYear(), 0, 1) / 86400000 - ) - ); + return dayOfYear(new Date()); } diff --git a/datetime/test.ts b/datetime/test.ts index f11e2b15a..1a5ad22e4 100644 --- a/datetime/test.ts +++ b/datetime/test.ts @@ -65,12 +65,12 @@ test(function invalidParseDateFormatThrows() { } }); +test(function DayOfYear() { + 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"))); +}); + test(function currentDayOfYear() { - assertEquals( - datetime.currentDayOfYear(), - Math.ceil(new Date().getTime() / 86400000) - - Math.floor( - new Date().setFullYear(new Date().getFullYear(), 0, 1) / 86400000 - ) - ); + assertEquals(datetime.currentDayOfYear(), datetime.dayOfYear(new Date())); }); |
