diff options
author | Tim Reichen <timreichen@users.noreply.github.com> | 2020-08-15 16:37:17 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-08-15 10:37:17 -0400 |
commit | 684eddcc6bf0c1446c9aba0cdf001c661c19ab24 (patch) | |
tree | 134f5f1609cf9f35295f841e27ba26d64c720795 /std/datetime/mod.ts | |
parent | b684df784ef0ecbdf8bc3b6015177b6829420f86 (diff) |
feat(std/datetime): generalise parser, add formatter (#6619)
Diffstat (limited to 'std/datetime/mod.ts')
-rw-r--r-- | std/datetime/mod.ts | 90 |
1 files changed, 12 insertions, 78 deletions
diff --git a/std/datetime/mod.ts b/std/datetime/mod.ts index fe6fe6b3c..e47fe9e01 100644 --- a/std/datetime/mod.ts +++ b/std/datetime/mod.ts @@ -1,7 +1,6 @@ // Copyright 2018-2020 the Deno authors. All rights reserved. MIT license. -import { assert } from "../_util/assert.ts"; -export type DateFormat = "mm-dd-yyyy" | "dd-mm-yyyy" | "yyyy-mm-dd"; +import { DateTimeFormatter } from "./formatter.ts"; export const SECOND = 1e3; export const MINUTE = SECOND * 60; @@ -20,92 +19,27 @@ enum Day { Sat, } -function execForce(reg: RegExp, pat: string): RegExpExecArray { - const v = reg.exec(pat); - assert(v != null); - return v; -} /** * Parse date from string using format string - * @param dateStr Date string + * @param dateString Date string * @param format Format string * @return Parsed date */ -export function parseDate(dateStr: string, format: DateFormat): Date { - let m, d, y: string; - let datePattern: RegExp; - - switch (format) { - case "mm-dd-yyyy": - datePattern = /^(\d{2})-(\d{2})-(\d{4})$/; - [, m, d, y] = execForce(datePattern, dateStr); - break; - case "dd-mm-yyyy": - datePattern = /^(\d{2})-(\d{2})-(\d{4})$/; - [, d, m, y] = execForce(datePattern, dateStr); - break; - case "yyyy-mm-dd": - datePattern = /^(\d{4})-(\d{2})-(\d{2})$/; - [, y, m, d] = execForce(datePattern, dateStr); - break; - default: - throw new Error("Invalid date format!"); - } - - return new Date(Number(y), Number(m) - 1, Number(d)); +export function parse(dateString: string, formatString: string): Date { + const formatter = new DateTimeFormatter(formatString); + const parts = formatter.parseToParts(dateString); + return formatter.partsToDate(parts); } -export type DateTimeFormat = - | "mm-dd-yyyy hh:mm" - | "dd-mm-yyyy hh:mm" - | "yyyy-mm-dd hh:mm" - | "hh:mm mm-dd-yyyy" - | "hh:mm dd-mm-yyyy" - | "hh:mm yyyy-mm-dd"; - /** - * Parse date & time from string using format string - * @param dateStr Date & time string + * Format date using format string + * @param date Date * @param format Format string - * @return Parsed date + * @return formatted date string */ -export function parseDateTime( - datetimeStr: string, - format: DateTimeFormat, -): Date { - let m, d, y, ho, mi: string; - let datePattern: RegExp; - - switch (format) { - case "mm-dd-yyyy hh:mm": - datePattern = /^(\d{2})-(\d{2})-(\d{4}) (\d{2}):(\d{2})$/; - [, m, d, y, ho, mi] = execForce(datePattern, datetimeStr); - break; - case "dd-mm-yyyy hh:mm": - datePattern = /^(\d{2})-(\d{2})-(\d{4}) (\d{2}):(\d{2})$/; - [, d, m, y, ho, mi] = execForce(datePattern, datetimeStr); - break; - case "yyyy-mm-dd hh:mm": - datePattern = /^(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2})$/; - [, y, m, d, ho, mi] = execForce(datePattern, datetimeStr); - break; - case "hh:mm mm-dd-yyyy": - datePattern = /^(\d{2}):(\d{2}) (\d{2})-(\d{2})-(\d{4})$/; - [, ho, mi, m, d, y] = execForce(datePattern, datetimeStr); - break; - case "hh:mm dd-mm-yyyy": - datePattern = /^(\d{2}):(\d{2}) (\d{2})-(\d{2})-(\d{4})$/; - [, ho, mi, d, m, y] = execForce(datePattern, datetimeStr); - break; - case "hh:mm yyyy-mm-dd": - datePattern = /^(\d{2}):(\d{2}) (\d{4})-(\d{2})-(\d{2})$/; - [, ho, mi, y, m, d] = execForce(datePattern, datetimeStr); - break; - default: - throw new Error("Invalid datetime format!"); - } - - return new Date(Number(y), Number(m) - 1, Number(d), Number(ho), Number(mi)); +export function format(date: Date, formatString: string): string { + const formatter = new DateTimeFormatter(formatString); + return formatter.format(date); } /** |