UNPKG

@onereach/time-interpreter

Version:

Convert dates, durations and time to canonical format (dates -> ISO 8601, durations -> milliseconds).

726 lines (607 loc) 29 kB
# timeInterpreter Parse a human readable time string into a canonical format: date -> ISO8601: 2020-11-11T00:00:00+00:00, 2020-11-11T00:00:00Z, datetime -> ISO8601: 2020-11-11T09:36:27+00:00, 2020-11-11T09:36:27Z, time -> HH:mm:ssZ, duration -> milliseconds timezone -> time offset - +00:00 # Table of contents * <a href="#usage">Usage</a> * <a href="#parse-date">Parse date</a> * <a href="#parse-timezone">Parse timezone</a> * <a href="#parse-time">Parse time</a> * <a href="#parse-duration">Parse duration</a> * <a href="#define-value-type-and-parse">Define value type and parse</a> * <a href="#defined-parsable-formats">Defined parsable formats</a> * <a href="#date">Date</a> * <a href="#datetime">Datetime</a> * <a href="#time">Time</a> * <a href="#duration">Duration</a> * <a href="#timezone">Timezone</a> ## Usage ```javascript const timeInterpreter = require("@onereach/time-interpreter"); const converter = new timeInterpreter(); ``` #### Parse date ```javascript // will be deprecated converter.formatDatetime( "date string", false /*ignore time*/, "input timezone", "output timezone" ); // optional: set timezones by name or time offset, default `Z` // Input timezone is a default (assumed) timezone and it will be applied if the input date/time doesn't include timezone data ``` Since `v1.0.21`: ```javascript converter.getISODatetime({ value: "date string", ignoreTime: false /*ignore time*/, inputTimezone: "input timezone", outputTimezone: "output timezone", assumedYear: 2022 }); ``` ```javascript let result = converter.formatDatetime("1995-02-04 10:00", false, "Europe/Kiev"); /* { "date": "1995-02-04T10:00:00+02:00", // ISO8601 string "timezoneOffset": "+02:00" // time offset } */ converter.formatDatetime("12-12-2020 10:20+06:00", false, "Europe/Kiev"); /* { "date": "12-12-2020T10:20:00+06:00", // ISO8601 string "timezoneOffset": "+06:00" // time offset } */ converter.formatDatetime("1995-02-04 10:00", false, "Europe/Kiev", "-03:00"); /* { "date": "1995-02-04T05:00:00-03:00", "timezoneOffset": "-03:00" } */ converter.formatDatetime("1995-02-04 10:00", true).date; // "1995-02-04T10:00:00Z" converter.formatDatetime("28OCT1990").date; // "1990-10-28T00:00:00Z" // ISO8601 duration converter.formatDatetime("PT444037H35M28S").date; // "2020-08-27T13:35:28Z" converter.formatDatetime( { year: 2010, month: 3, day: 5, hour: 15, minute: 10, second: 3, millisecond: 123, }, false, "UTC" ); // "2010-04-05T15:10:03+00:00" // Unix time converter.formatDatetime(1318874398); // "2011-10-17T17:59:58.000Z" converter.formatDatetime(1560211200000); // "2019-06-11T00:00:00.000Z" // Particular format: time span of 3 years 6 months 4 days 12 hours 30 minutes and 17 seconds, starting from August 9, 2005 18 hours 31 minutes 42 seconds converter.formatDatetime( "2005-08-09T18:31:42/P3Y6M4DT12H30M17S", false, "+02:00" ); /* { date: '2009-02-12T07:01:59+02:00', timezoneOffset: '+02:00', zoneName: '', offsetNum: 2 } */ // Output additional timezone data 1.0.8+ converter.formatDatetime("1995-02-04 10:00", false, "Europe/Kiev"); /* { "date": "1995-02-04T10:00:00+02:00", "timezoneOffset": "+02:00", "zoneName": "Europe/Kiev", "offsetNum": 2 } */ // Specify default year. It is used if the original date does not include year (default year current). 1.0.8+ converter.formatDatetime("11 August", true, "", "Europe/Kiev", 1999).date; // "1999-08-11" converter.formatDatetime("September 23rd", false, "GMT+0", "").date; // "2021-09-23T00:00:00+00:00" converter.formatDatetime( "sixteenth December", false, "Europe/Kiev", "GMT+0", 2020 ).date; // "2020-12-15T22:00:00+00:00" ``` #### Parse timezone ```javascript let timeOffset = converter.formatTimezone("+1"); // "+01:00" converter.formatTimezone("America/Denver"); // "-07:00" (or "-06:00") converter.formatTimezone("-0700"); // "-07:00" converter.formatTimezone("-180"); // "-03:00" // Specify 'true' as second param to output timezone object 1.0.8+ converter.formatTimezone("America/Denver", true); /* { "name": "America/Denver", "offsetNum": -7, "offsetText": "-07:00" } */ // Invalid value 1.0.8+ converter.formatTimezone("30"); // null converter.formatTimezone("Ukraine"); // null ``` #### Parse time If the time zone name is used to indicate the **input timezone**, and this zone has winter and summer time, then the time offset for the input time value is determined to rely on the current date. ```javascript converter.formatTime("time string", "input timezone"); // optional: set timezones by name or time offset, default `Z` let time = converter.formatTime("12:30:10 am", "Europe/Kiev"); /* { "time": "00:30:10+02:00", "timezoneOffset": "+02:00" } */ converter.formatTime("2020-11-06T06:30:00Z", "Europe/Kiev"); /* { "time": "06:30:00Z", "timezoneOffset": "+00:00" } */ converter.formatTime({ seconds: 2, minutes: 2, hours: 2 }, "Europe/Kiev"); /* { "time": "02:02:02+02:00", "timezoneOffset": "+02:00" } */ converter.formatTime("12-30-10").time; // "12:30:10" converter.formatTime("183142").time; // "18:31:42Z" converter.formatTime("283142").time; // as unix time in ms // "00:04:43Z" // Output additional timezone data 1.0.8+ converter.formatTime("12-30-10"); /* { "time": '12:30:10Z', "timezoneOffset": 'Z', "zoneName": '', "offsetNum": 0 } */ ``` #### Parse duration ```javascript let duration = converter.formatDuration("10.2019"); // number of days in October // 2678400000 converter.formatDuration("2w 1d5h"); // 1314000000 // ISO8601 duration converter.formatDuration("P2Y2M16DT2H2M2S"); // 69732122000 // Invalid converter.formatDuration("month"); // NaN // v1.0.19 converter.formatDuration("2d"); // {asMilliseconds: 172800000, asObject: {days: 2}, humanized: "2 days"} ``` ## Define value type and parse If you don't know what type of an input value: date, date/time or time, you can use ```converter.parse(value, input timezone, output timezone, input year, input date)```. **Input year** (YYYY) is a default year and it will be applied if the input date/time doesn't include year. **Input date** (in format `YYYY-MM-DD`) will be applied if the input value type of time. Default year - *current year*, default date - `null`, default input timezone - `GMT+0`. if **input date** is not indicated and the defined type of **value** is *time*, then the **output timezone** is ignored. If the defined type of **value** is *date*, then the time is set to `00:00:00` in input timezone (default `GMT+0`). If the time zone name is used to indicate the **input timezone**, and this zone has winter and summer time, and if **value** is time, then the time offset is determined to rely on the current date (unless otherwise specified). Method tries to defind first if the value is a date. If input value is a sequence of numbers (for example, `234567` or `"6453673"`) it will be parsed as unix time in seconds. If the value looks like these: `"12-30-00"`, `"20 45 50"`, `"16.50.00"`, - the method will try to parse it as a date *(MM-DD-YY, YY-MM-DD etc.)* and if it's invalid date the value will be parsed as a time *(hh mm ss)*. Values where separator is `"/"` are parsed only as a date. Values where separator is `":"` are parsed only as a time. ```javascript // Sinse v1.0.21 converter.getParsed({ value: "time/date/datetime", inputTimezone: "input timezone", outputTimezone: "output zone", assumedYear: "it is used if the original date does not include year (default year current)", assumedDate: "it is used if the input value is time (default undefined)" }); // will be deprecated let parsed = converter.parse("Feb-1st-2021, 12:30:00am, America/Los_Angeles, Monday"); /* { "time": { "hourMinute12": "12:30", "hourMinute24": "00:30", "hour12": 12, "hour24": 0, "amPm": "am", "minute": 30 }, "duration": 1612168200000, // milliseconds "iso": "2021-02-01T00:30:00-08:00", "date": { "dayOfWeek": "Monday", "isWeekend": false, "day": 1, "month": 2, "monthName": "February", "year": 2021 }, "timezone": { "name": "America/Los_Angeles", "offsetNum": -8, "offsetText": "-08:00" } }*/ converter.parse("12.30.00Z+0200 may-twenty-second"); /*{ "time": { "hourMinute12": "12:30", "hourMinute24": "12:30", "hour12": 12, "hour24": 12, "amPm": "pm", "minute": 30 }, "duration": 1621679400000, "iso": "2021-05-22T12:30:00+02:00", "date": { "dayOfWeek": "Saturday", "isWeekend": true, "day": 22, "month": 5, "monthName": "May", "year": 2021 }, "timezone": { "name": "", "offsetNum": 2, "offsetText": "+02:00" } }*/ converter.parse("Feb-1st 12:30"); /*{ "time": { "hourMinute12": "12:30", "hourMinute24": "12:30", "hour12": 12, "hour24": 12, "amPm": "pm", "minute": 30 }, "duration": 1612182600000, // milliseconds "iso": "2021-02-01T12:30:00+00:00", "date": { "dayOfWeek": "Monday", "isWeekend": false, "day": 1, "month": 2, "monthName": "February", "year": 2021 }, "timezone": { "name": "GMT+0", "offsetNum": 0, "offsetText": "+00:00" } }*/ converter.parse("twenty-one/Apr 10 30 00pm", "GMT+0", "Europe/Kiev", 2004, "2020-22-10"); /*{ "time": { "hourMinute12": "01:30", "hourMinute24": "01:30", "hour12": 1, "hour24": 1, "amPm": "am", "minute": 30 }, "duration": 1082586600000, // milliseconds "iso": "2004-04-22T01:30:00+03:00", "date": { "dayOfWeek": "Thursday", "isWeekend": false, "day": 22, "month": 4, "monthName": "April", "year": 2004 }, "timezone": { "name": "Europe/Kiev", "offsetNum": 3, "offsetText": "+03:00" } }*/ converter.parse("093042 PM"); /*{ "time": { "hourMinute12": "09:30", "hourMinute24": "21:30", "hour12": 9, "hour24": 21, "amPm": "pm", "minute": 30 }, "duration": 77442000, // milliseconds "iso": "21:30:42+00:00", "date": null, "timezone": { "name": "GMT+0", "offsetNum": 0, "offsetText": "+00:00" } }*/ converter.parse("093042 PM", "Europe/Kiev", "GMT+0", 2004, "2020-10-22"); /*{ "time": { "hourMinute12": "06:30", "hourMinute24": "18:30", "hour12": 6, "hour24": 18, "amPm": "pm", "minute": 30 }, "duration": 1603391442000, // milliseconds "iso": "2020-10-22T18:30:42+00:00", "date": { "dayOfWeek": "Thursday", "isWeekend": false, "day": 22, "month": 10, "monthName": "October", "year": 2020 }, "timezone": { "name": "GMT+0", "offsetNum": 0, "offsetText": "+00:00" } }*/ converter.parse("093042 PM", "America/Denver"); /*{ "time": { "hourMinute12": "09:30", "hourMinute24": "21:30", "hour12": 9, "hour24": 21, "amPm": "pm", "minute": 30 }, "duration": 77442000, // milliseconds "iso": "21:30:42-07:00", "date": null, "timezone": { "name": "America/Denver", "offsetNum": -7, "offsetText": "-07:00" } }*/ converter.parse(34567890, "America/Denver"); /*{ "time": { "hourMinute12": "02:11", "hourMinute24": "02:11", "hour12": 2, "hour24": 2, "amPm": "am", "minute": 11 }, "duration": 34593090000, "iso": "1971-02-05T02:11:30-07:00", "date": { "dayOfWeek": "Friday", "isWeekend": false, "day": 5, "month": 2, "monthName": "February", "year": 1971 }, "timezone": { "name": "America/Denver", "offsetNum": -7, "offsetText": "-07:00" } }*/ converter.parse({ days: 2, months: "2", years: "1999" }, "America/Denver"); /*{ "time": { hourMinute12: '12:00', hourMinute24: '00:00', hour12: 12, hour24: 0, amPm: 'am', minute: 0 }, "duration": 63087811200000, "iso": "1999-03-02", "date": { "dayOfWeek": "Tuesday", "isWeekend": false, "day": 2, "month": 3, "monthName": "March", "year": 1999 } }*/ converter.parse("Friday 7 MAY 2021", "America/Denver"); /*{ "time": { hourMinute12: '12:00', hourMinute24: '00:00', hour12: 12, hour24: 0, amPm: 'am', minute: 0 }, "duration": 1620345600000, "iso": "2021-05-07", "date": { "dayOfWeek": "Friday", "isWeekend": false, "day": 7, "month": 5, "monthName": "May", "year": 2021 } }*/ ``` ## Defined parsable formats ### date - date objects *(time units: "y", "M", "d", "h", "m", "s", "ms","year","month","day","hour","minute","second","millisecond", "years","months","days","date","hours","minutes","seconds","milliseconds")* ``` { day: 2, month: '5' }, { day: 2, month: '5', year: 2020 } ``` - number timestamp (as unix time *in seconds -> in milliseconds*) - string date (the detailed description below) All permutations, case insensitive match separated with '-', '.', '/', ' ' _(space)_ : - "2020 6 oct", "2020 6th oct", "Wed Jun 10 2020", "Friday, October 14, 1983" (week day: 'wed', 'wednesday'; month: 'oct', 'October') - "Apr/10/20" (handle as `'MMMM-DD-YY'`) - "10-13-sep" (handle as `'YY-DD-MMMM'`) - "10.sep.13" (handle as `'YY-MMMM-DD' -> 'DD-MMMM-YY'`) - "16.10.2020", "16/10/2020", "16-10-2020", "16 10 2020" (handle as `'DD-MM-YYYY' -> 'MM-DD-YYYY'`) - "2020-16-10", "2020.16.10", "2020/16/10", "2020 16 10" (handle as `'YYYY-MM-DD' -> 'YYYY-DD-MM'`) - "10/06/20", "10.6.20" (handle as `'MM-DD-YY' -> 'DD-MM-YY' -> 'YY-MM-DD' -> 'YY-DD-MM'`) - "10-2020", "10 2020", "10/2020", "10.2020", "2020-10" "2020 10" "2020.10" "2020/10" (as 1st October 2020) #### 1.0.8+ day + month (case insensitive), without year - "11 August", "September 24th" - "sixteenth December", "october tenth", "january twenty one", "thirty July", "twentieth august", "june twenty-second" - "sixteenth Dec", "oct tenth", "jan twenty one", "thirty Jul", "twentieth aug", "11 Aug", "Sep 24th" - "oct-tenth", "jan, twenty one", "twentieth-aug", "11.Aug", "Sep, 24th" Invalid date: - "16.13.2020", "30/16/20", "13-2020", "34 December" #### 1.0.9+ These formats can be parsable with ```converter.formatDatetime()``` and ```converter.parse()```. Case insensitive permutations of day, month and year (separated with '-', '.', '/', ' ' _(space)_ ): **day:** - "1", "01", "1st", "one", "first" - "3", "03", "3rd", "three", "third", "thirteen", "thirteenth" - "20", "20th", "twenty", "twentieth", "twenty one", "twenty first", "twenty-one", "twenty-first" **month:** - "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" - "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" **year** in format of 4 digits: "2021" Examples: - "twenty-one-Apr-2020", "September-twenty-one-2020", "twenty-one.Apr.2020", "September.twenty-one.2020", "twenty-one/Apr/2020", "September/twenty-one/2020", "twenty-one Apr 2020", "September twenty-one 2020", "2020-twenty-one-Apr", "2020-September-twenty-one", "2020.twenty-one.Apr", "2020.September.twenty-one", "2020/twenty-one/Apr", "2020/September/twenty-one", "2020 twenty-one Apr", "2020 September twenty-one", _etc._ - "three-february-2021", "three.february.2021", "three/february/2021", "three february 2021", _etc._ - "Feb-1st-2021", "2021-1st-Feb", "Feb.1st.2021", "2021.1st.Feb", "Feb/1st/2021", "2021/1st/Feb", "Feb 1st 2021", "2021 1st Feb", _etc._ - "2021-2-Mar", "may-5-2021", "2021.2.Mar", "may.5.2021", "2021/2/Mar", "may/5/2021", "2021 2 Mar", "may 5 2021", _etc._ - "2021-March-twenty-second", "March.twenty-second.2021", "2021/twenty-second/March", "twenty-second March 2021", _etc._ Date part combinated with weekday (case insensitive), time (case insensitive) and timezone (case sensitive). If the value contains both - *time offset* and *timezone name*, at the same time, then the *timezone name* is preferred. **weekday:** - "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" - "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" Examples: - "twenty-one-Apr-2020 Tuesday", "Tue twenty-one.Apr.2020", "twenty-one/Apr/2020 Tuesday", "Tuesday 2020 twenty-one Apr", "Tue April.twenty-one.2020", "2020/April/twenty-one Tue", _etc._ - "three-february-2021 Wednesday", "Wednesday three.february.2021", "Wed three/february/2021", "three february 2021 Wed", _etc._ - "Feb-1st-2021 Monday", "2021-1st-Feb Mon", "Monday Feb.1st.2021", "Mon 2021.1st.Feb", "Feb/1st/2021 Mon", "2021/1st/Feb Mon", "Feb 1st 2021 Monday", "Monday 2021 1st Feb", _etc._ - "Tuesday 2021-2-Mar", "may-2-2021 Sun", "Tue 2021.2.Mar", "may.2.2021 Sunday", "2021/2/Mar Tuesday", "may/2/2021 sun", "Tuesday 2021 2 Mar", "Sun may 2 2021", _etc._ - "Saturday 2021-may-twenty-second", "may.twenty-second.2021 Sat", "Sat 2021/twenty-second/may", "Sat twenty-second may 2021", _etc._ - _weekday can be separated with comma:_ - "may.twenty-second.2021, Sat", "Wednesday, three.february.2021", "twenty-one-Apr-2020,Tuesday", "Feb 1st 2021, Monday", "Mon,2021.1st.Feb", _etc._ ### datetime Can include time part (case insensitive) and timezone (case sensitive) or time offset: #### 1.0.0+ - "2020 oct 6th 10-30-10PM" *(date+time)* - "20-10-06 1:30:10 PM", "20/10/06 1:30:10 PM", "20.10.06 1:30:10 PM" *(date+time)* - "06-10-2020 1:30am", "06/10/2020 1:30am", "06.10.2020 1:30am" *(date+time)* - "1995-02-04 10:00 UTC+7" *(date+time)* - "Tue, 6 Oct 2020 13:30:00+0400" - "Fri, Oct 14, 1983 Indian/Kerguelen" - "Friday, October 14, 1983, 1:30 PM UTC" - "23:16, Tuesday, 9 April 2019" - "Wed September 2 2020 6pm" - "20050809T183142", "20150930 212421 -0400", "20050809T183142 -0330", "20150930 212421-0400", "20050809T183142-0330" #### 1.0.9+ Date + time or time + date (may include weekday or timezone name between these parts), where **date** is: - full year + month name + day *(simple number/ordered/as words)* separated with '-', '.', '/', ' ' _(space)_: `"2nd oct 2021"` - month name + day *(simple number/ordered/as words)* without year separated with '-', '.', '/', ' ' _(space)_: `"2nd oct", "first september"` - *"16.10.2020", "16/10/2020", "16-10-2020", "2020-16-10", "2020.16.10", "2020/16/10"* and where **time part** is: - "7pm", "7 am", "07pm", "07 am" - "123000" (hhmmss) - "123000pm" - _hours + minutes ( + seconds) separated with ':', '-', '.', ' ' (space) :_ - "12 30 am", "12-30 am", "12.30 am", "12:30 am", "12 30am", "12-30am", "12.30am", "12:30am", "7:45pm", "7.45 am" - "12 30 00 am", "12 30 00am", "12-30-00 am", "12-30-00am", "12.30.00 am", "12.30.00am", "12:30:00 am", "12:30:00am" - "12 30 00", "12 30", "12-30-00", "12-30", "12.30.00", "12.30", "12:30:00", "12:30" - "12 30 00+0200", "12 45 00-03:00", "12.30.00+0200", "12.45.00-03:00", "12.30.00+0200", "12.45.00-03:00", "12:30:00+0200", "12:45:00-03:00" - "12 30 00Z+0200", "12 45 00Z-03:00", "12.30.00Z+0200", "12.45.00Z-03:00", "12.30.00Z+0200", "12.45.00Z-03:00", "12:30:00Z+0200", "12:45:00Z-03:00" - "12 30+0200", "12 45-03:00", "12-30+0200", "12-45-03:00", "12.30+0200", "12.45-03:00", "12:30+0200", "12:45-03:00" - "12 30 00Z", "12-30-00Z", "12.30.00Z", "12:30:00Z" - "12 30 00.000Z", "12-30-00.000Z", "12.30.00.1236Z", "12:30:00.000Z" Examples: - _day-month-year + time_: - "twenty-one-Apr-2020 12:30 am", "7pm twenty-one.Apr.2020", "twenty-one/Apr/2020 123000pm", "12-30-00 2020 twenty-one Apr", "12.30 am April.twenty-one.2020", "2020/April/twenty-one 12 30am", - "three-february-2021 12:45:00-03:00", "12:30:00 am three.february.2021", "12-30am three/february/2021", "three february 2021 7 am", _etc._ - "Feb-1st-2021 7 am", "2021-1st-Feb 12.30.00+0200", "12 30 00 Feb.1st.2021", "123000pm 2021.1st.Feb", "Feb/1st/2021 123000", "2021/1st/Feb 12 30 am", "Feb 1st 2021 12-30 am", "12.30am 2021 1st Feb", _etc._ - "12 30 00Z 2021-2-Mar", "may-5-2021 12-30-00Z", "12:45:00-03:00 2021.2.Mar", "may.5.2021 12-30-00", "2021/2/Mar 12-30", _etc._ - "12.30 2021-may-twenty-second", "may.twenty-second.2021 12.30.00am", "12:30 2021/twenty-second/may", "12 30 00am twenty-second may 2021", _etc._ - _day-month-year + time + weekday_: - "twenty-one-Apr-2020 Tuesday 12:30 am", "Tue 7pm twenty-one.Apr.2020", "12.30.00am 2020/April/twenty-one Tue", _etc._ - "three-february-2021 12 30 am Wednesday", "Wednesday 12-30am three.february.2021", "Wed three/february/2021 12 30 30Z", "12:45:00Z-03:00 three february 2021 Wed", _etc._ - "Feb-1st-2021 12:30:00am Monday", "12:30:00 2021-1st-Feb Mon", "Monday 12:30 Feb.1st.2021", "12:30:00am Mon 2021.1st.Feb", _etc._ - _day-month + time_: - "twenty-one-Apr 12:30:00am", "12:30 twenty-one.Apr", "twenty-one/Apr 10 30 00pm", "7:30PM twenty-one Apr", "6 PM April.twenty-one", "16 30 three.february", "three/february 12:30pm", "Feb-1st 12:30", _etc._ - "12.30.00am 2-Mar", "may-5 7 am", "2.Mar 12-30-00Z", "may.5 12.30", "2/Mar 12-30", "may/5 123000am", "202100 2 Mar", "may 5 12.30", _etc._ - "12.30.00Z+0200 may-twenty-second", "may.twenty-second 12:30:00 am", "12.30 am twenty-second/may", "twenty-second may 12 30am", _etc._ - _weekday can be separated with comma:_ - "twenty-one-Apr, 12:30:00am", "12:30, twenty-one.Apr", "twenty-one/Apr,10 30 00pm", "7:30PM,twenty-one Apr", "Feb-1st-2021, 12:30:00am, Monday", "12:30:00, 2021-1st-Feb Mon", "Monday 12:30, Feb.1st.2021", "12:30:00am Mon,2021.1st.Feb", "three-february-2021,12:45:00-03:00", "12:30:00 am, three.february.2021", "12-30am, three/february/2021", "three february 2021,7 am", _etc._ Another date formats: - *"10/06/20"* (month number, day number, two digits of year, separated with '-', '.', '/') + **time** (separated with ":", may be *am/pm* time): `"20/10/06 1:30:10 PM", "20.10.06 11:30:10", "1:30:10am 20-10-06", "1:30:10+03:00 20-10-06"` - *"sep/10/20", "sep.12.12", "sep-12-12"* (month name, day number, two digits of year, separated with '-', '.', '/') + **time** (separated with ":", may be *am/pm* time): `"20/Apr/06 1:30:10 PM", "20.10.August 11:30:10", "1:30:10am nov-10-06", "1:30:10+03:00 20-july-06"` - **time** examples: `"7 pm", "7pm", "123000am", "123000 am", "12:30 am", "12:30am", "12:30:00 am", "12:30:00am", "123000", "12:30+0200", "12:45-03:00", "2:30:00", "12:30:00", "12:30:00.123Z", "12:30:00Z", "12:30", "12:30:00+01:00", "12:30:00Z+01:00"` **Timezone** from the list that **moment-timezone.js** provides Examples: - _day-month-year + time_: - "twenty-one-Apr-2020 12:30 am America/Los_Angeles", "America/Los_Angeles 7pm twenty-one.Apr.2020", "twenty-one/Apr/2020 America/Los_Angeles 123000pm", "12-30am three/february/2021 America/Los_Angeles", "three february 2021 7 am America/Los_Angeles", "America/Los_Angeles Feb-1st-2021 7 am", "Feb/1st/2021 America/Los_Angeles 123000", "2021/1st/Feb 12 30 am America/Los_Angeles", "may.5.2021 America/Los_Angeles 12-30-00", "America/Los_Angeles 2021/2/Mar 12-30", "12 30 00am America/Los_Angeles twenty-second may 2021", _etc._ - _day-month-year + time + weekday_: - "twenty-one-Apr-2020 Tuesday 12:30 am America/Los_Angeles", "Tue 7pm twenty-one.Apr.2020 America/Los_Angeles", "three-february-2021 America/Los_Angeles 12 30 am Wednesday", "Wednesday America/Los_Angeles 12-30am three.february.2021", "Feb-1st-2021 America/Los_Angeles 12:30:00am Monday", "America/Los_Angeles 12:30:00 1st-Feb-2021 Mon", "Monday 12:30 America/Los_Angeles Feb.1st.2021", _etc._ - _day-month + time_: - "twenty-one-Apr 12:30:00am America/Los_Angeles", "12:30 America/Los_Angeles twenty-one.Apr", "America/Los_Angeles twenty-one/Apr 10 30 00pm", "7:30PM America/Los_Angeles twenty-one Apr", "may.5 12.30 America/Los_Angeles", "may.twenty-second 12:30:00 am America/Los_Angeles", "12.30 am America/Los_Angeles twenty-second/may", "America/Los_Angeles twenty-second may 12 30am", _etc._ - _weekday can be separated with comma:_ - "twenty-one-Apr, 12:30:00am, America/Los_Angeles", "12:30 America/Los_Angeles, twenty-one.Apr", "twenty-one/Apr,10 30 00pm America/Los_Angeles", "7:30PM,America/Los_Angeles,twenty-one Apr", "Feb-1st-2021, 12:30:00am, America/Los_Angeles, Monday", "America/Los_Angeles,12:30:00, 1st-Feb-2021 Mon", "Monday 12:30, Feb.1st.2021, America/Los_Angeles", "12:30:00am Mon,2021.1st.Feb America/Los_Angeles", "America/Los_Angeles,three-february-2021,12:45:00-03:00", "12:30:00 am, three.february.2021, America/Los_Angeles", "America/Los_Angeles 12-30am, three/february/2021", "three february 2021,America/Los_Angeles, 7 am", _etc._ ### time Case insensitive match with separators (':', '-', '.', ' ' _(space)_): - `5422456` *(as unix time in ms)* - "13:02:14.171447" - "5hours 30 minutes", "6 h 45m", "13h 50 minutes" (time units: `h, hours, m, minutes, s, seconds, ms, milliseconds`) - "1831", "1334 America/Los_Angeles" (`hhmm`); "123000", "183142", "150000 America/Los_Angeles" (`hhmmss`). If the value is invalid time in these formats (*hhmmss*,*hhmm*) it'll be parsed as *unix time*. - "7pm", "7 am", "07pm", "07 am", "10PM America/Los_Angeles" - "123000pm", "093042PM", "093042 am", "093042PM America/Los_Angeles" - _hours + minutes ( + seconds) separated with ':', '-', '.', ' ' (space) :_ - "12 30 am", "12-30 am", "12.30 am", "12:30 am", "12 30am", "12-30am", "12.30am", "12:30am", "7:45pm", "7.45 am" - "12 30 00 am", "12 30 00am", "12-30-00 am", "12-30-00am", "12.30.00 am", "12.30.00am", "12:30:00 am", "12:30:00am" - "12 30 00", "12 30", "12-30-00", "12-30", "12.30.00", "12.30", "12:30:00", "12:30" - "12 30 00+0200", "12 45 00-03:00", "12.30.00+0200", "12.45.00-03:00", "12.30.00+0200", "12.45.00-03:00", "12:30:00+0200", "12:45:00-03:00" - "12 30 00Z+0200", "12 45 00Z-03:00", "12.30.00Z+0200", "12.45.00Z-03:00", "12.30.00Z+0200", "12.45.00Z-03:00", "12:30:00Z+0200", "12:45:00Z-03:00" - "12 30+0200", "12 45-03:00", "12-30+0200", "12-45-03:00", "12.30+0200", "12.45-03:00", "12:30+0200", "12:45-03:00" - "12 30 00Z", "12-30-00Z", "12.30.00Z", "12:30:00Z" - "12 30 00.000Z", "12-30-00.000Z", "12.30.00.000Z", "12:30:00.000Z" - *may include timezone name*: "12:30 America/Los_Angeles", "10.30.15PM Europe/Kiev" If the value contains both - *time offset* and *timezone name*, at the same time, then the *timezone name* is preferred. Invalid time: - "1:68:14 pm", "1:48-14 pm" - *non-space separator between time and am/pm*: "12:30-pm", "10.40.pm", "10.40.AM Europe/Kiev" - *am/pm time + time offset*: "7pm +01:00", "10:30:15am +01:00", "10 40AM +01:00" - "5hours 30 minutes 3 h 15 m" ### duration Case sensitive: - string: "2d", "2 weeks 1 days 5hours", "2w 1d5h" - object: ```json { "seconds": 2, "minutes": 2, "hours": 2, "days": 2, "weeks": 2, "months": "2", "years": "2" } ``` - duration of month: "10.2019" - milliseconds - ISO8601 duration: "PT2H35M28S" - time: "04:30:59", "4 23:59:59" Invalid duration string: - "2D", "2 Weeks 1 Days 5hours" ### timezone Case sensitive: - timezone name: "America/Denver" - timezone abbreviation: "MST" - time offset: "UTC+7", "+01:00", "-0700", "−2:30", "+01", "-7" - time offset in minutes: "-180", "+390" (from -720 to +840) Invalid values: - "+960", "-16" (out of time offset range) ## Library Integrations **moment-timezone.js** - dates and timezones parsing library.