Repository: d3/d3-time-format Branch: main Commit: 9c473e0500ce Files: 58 Total size: 93.8 KB Directory structure: gitextract_q3exi_fy/ ├── .eslintrc.json ├── .github/ │ ├── eslint.json │ └── workflows/ │ └── node.js.yml ├── .gitignore ├── LICENSE ├── README.md ├── locale/ │ ├── ar-EG.json │ ├── ar-SY.json │ ├── ca-ES.json │ ├── cs-CZ.json │ ├── da-DK.json │ ├── de-CH.json │ ├── de-DE.json │ ├── en-CA.json │ ├── en-GB.json │ ├── en-US.json │ ├── es-ES.json │ ├── es-MX.json │ ├── fa-IR.json │ ├── fi-FI.json │ ├── fr-CA.json │ ├── fr-FR.json │ ├── he-IL.json │ ├── hr-HR.json │ ├── hu-HU.json │ ├── it-IT.json │ ├── ja-JP.json │ ├── ko-KR.json │ ├── mk-MK.json │ ├── nb-NO.json │ ├── nl-BE.json │ ├── nl-NL.json │ ├── pl-PL.json │ ├── pt-BR.json │ ├── ru-RU.json │ ├── sv-SE.json │ ├── tr-TR.json │ ├── uk-UA.json │ ├── vi-VN.json │ ├── zh-CN.json │ └── zh-TW.json ├── package.json ├── rollup.config.js ├── src/ │ ├── defaultLocale.js │ ├── index.js │ ├── isoFormat.js │ ├── isoParse.js │ └── locale.js └── test/ ├── .eslintrc.json ├── date.js ├── defaultLocale-test.js ├── format-test.js ├── isoFormat-test.js ├── isoParse-test.js ├── locale-test.js ├── parse-test.js ├── utcFormat-test.js └── utcParse-test.js ================================================ FILE CONTENTS ================================================ ================================================ FILE: .eslintrc.json ================================================ { "extends": "eslint:recommended", "parserOptions": { "sourceType": "module", "ecmaVersion": 8 }, "env": { "es6": true }, "rules": { "no-cond-assign": 0 } } ================================================ FILE: .github/eslint.json ================================================ { "problemMatcher": [ { "owner": "eslint-compact", "pattern": [ { "regexp": "^(.+):\\sline\\s(\\d+),\\scol\\s(\\d+),\\s(Error|Warning|Info)\\s-\\s(.+)\\s\\((.+)\\)$", "file": 1, "line": 2, "column": 3, "severity": 4, "message": 5, "code": 6 } ] } ] } ================================================ FILE: .github/workflows/node.js.yml ================================================ # https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions name: Node.js CI on: push: branches: [ main ] pull_request: branches: [ main ] jobs: build: runs-on: ubuntu-latest strategy: matrix: node-version: [14.x] steps: - uses: actions/checkout@v2 - name: Use Node.js ${{ matrix.node-version }} uses: actions/setup-node@v1 with: node-version: ${{ matrix.node-version }} - run: yarn --frozen-lockfile - run: | echo ::add-matcher::.github/eslint.json yarn run eslint src test --format=compact - run: yarn test ================================================ FILE: .gitignore ================================================ *.sublime-workspace .DS_Store dist/ node_modules npm-debug.log ================================================ FILE: LICENSE ================================================ Copyright 2010-2021 Mike Bostock Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ================================================ FILE: README.md ================================================ # d3-time-format This module can be used to parse or format [dates](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date) in a variety of locale-specific representations. ## Resources - [Documentation](https://d3js.org/d3-time-format) - [Releases](https://github.com/d3/d3-time-format/releases) - [Getting help](https://d3js.org/community) ================================================ FILE: locale/ar-EG.json ================================================ { "dateTime": "%x, %X", "date": "%-d/%-m/%Y", "time": "%-I:%M:%S %p", "periods": ["ص", "م"], "days": ["الأحد", "الإثنين", "الثلاثاء", "الأربعاء", "الخميس", "الجمعة", "السبت"], "shortDays": ["أحد", "إثنين", "ثلاثاء", "أربعاء", "خميس", "جمعة", "سبت"], "months": ["يناير", "فبراير", "مارس", "أبريل", "مايو", "يونيو", "يوليو", "أغسطس", "سبتمبر", "أكتوبر", "نوفمبر", "ديسمبر"], "shortMonths": ["يناير", "فبراير", "مارس", "أبريل", "مايو", "يونيو", "يوليو", "أغسطس", "سبتمبر", "أكتوبر", "نوفمبر", "ديسمبر"] } ================================================ FILE: locale/ar-SY.json ================================================ { "dateTime": "%x, %X", "date": "%-d/%-m/%Y", "time": "%-I:%M:%S %p", "periods": ["ص", "م"], "days": ["الأحد", "الإثنين", "الثلاثاء", "الأربعاء", "الخميس", "الجمعة", "السبت"], "shortDays": ["أحد", "إثنين", "ثلاثاء", "أربعاء", "خميس", "جمعة", "سبت"], "months": ["كانون الثاني", "شباط", "آذار", "نيسان", "أيار", "حزيران", "تموز", "آب", "أيلول", "تشرين الأول", "تشرين الثاني", "كانون الأول"], "shortMonths": ["ك٢", "شباط", "آذار", "نيسان", "أيار", "حزيران", "تموز", "آب", "أيلول", "ت١", "ت٢", "ك١"] } ================================================ FILE: locale/ca-ES.json ================================================ { "dateTime": "%A, %e de %B de %Y, %X", "date": "%d/%m/%Y", "time": "%H:%M:%S", "periods": ["AM", "PM"], "days": ["diumenge", "dilluns", "dimarts", "dimecres", "dijous", "divendres", "dissabte"], "shortDays": ["dg.", "dl.", "dt.", "dc.", "dj.", "dv.", "ds."], "months": ["gener", "febrer", "març", "abril", "maig", "juny", "juliol", "agost", "setembre", "octubre", "novembre", "desembre"], "shortMonths": ["gen.", "febr.", "març", "abr.", "maig", "juny", "jul.", "ag.", "set.", "oct.", "nov.", "des."] } ================================================ FILE: locale/cs-CZ.json ================================================ { "dateTime": "%A,%e.%B %Y, %X", "date": "%-d.%-m.%Y", "time": "%H:%M:%S", "periods": ["AM", "PM"], "days": ["neděle", "pondělí", "úterý", "středa", "čvrtek", "pátek", "sobota"], "shortDays": ["ne.", "po.", "út.", "st.", "čt.", "pá.", "so."], "months": ["leden", "únor", "březen", "duben", "květen", "červen", "červenec", "srpen", "září", "říjen", "listopad", "prosinec"], "shortMonths": ["led", "úno", "břez", "dub", "kvě", "čer", "červ", "srp", "zář", "říj", "list", "pros"] } ================================================ FILE: locale/da-DK.json ================================================ { "dateTime": "%A den %d %B %Y %X", "date": "%d-%m-%Y", "time": "%H:%M:%S", "periods": ["AM", "PM"], "days": ["søndag", "mandag", "tirsdag", "onsdag", "torsdag", "fredag", "lørdag"], "shortDays": ["søn", "man", "tir", "ons", "tor", "fre", "lør"], "months": ["januar", "februar", "marts", "april", "maj", "juni", "juli", "august", "september", "oktober", "november", "december"], "shortMonths": ["jan", "feb", "mar", "apr", "maj", "jun", "jul", "aug", "sep", "okt", "nov", "dec"] } ================================================ FILE: locale/de-CH.json ================================================ { "dateTime": "%A, der %e. %B %Y, %X", "date": "%d.%m.%Y", "time": "%H:%M:%S", "periods": ["AM", "PM"], "days": ["Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"], "shortDays": ["So", "Mo", "Di", "Mi", "Do", "Fr", "Sa"], "months": ["Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"], "shortMonths": ["Jan", "Feb", "Mrz", "Apr", "Mai", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dez"] } ================================================ FILE: locale/de-DE.json ================================================ { "dateTime": "%A, der %e. %B %Y, %X", "date": "%d.%m.%Y", "time": "%H:%M:%S", "periods": ["AM", "PM"], "days": ["Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"], "shortDays": ["So", "Mo", "Di", "Mi", "Do", "Fr", "Sa"], "months": ["Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"], "shortMonths": ["Jan", "Feb", "Mrz", "Apr", "Mai", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dez"] } ================================================ FILE: locale/en-CA.json ================================================ { "dateTime": "%a %b %e %X %Y", "date": "%Y-%m-%d", "time": "%H:%M:%S", "periods": ["AM", "PM"], "days": ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], "shortDays": ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], "months": ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], "shortMonths": ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"] } ================================================ FILE: locale/en-GB.json ================================================ { "dateTime": "%a %e %b %X %Y", "date": "%d/%m/%Y", "time": "%H:%M:%S", "periods": ["AM", "PM"], "days": ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], "shortDays": ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], "months": ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], "shortMonths": ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"] } ================================================ FILE: locale/en-US.json ================================================ { "dateTime": "%x, %X", "date": "%-m/%-d/%Y", "time": "%-I:%M:%S %p", "periods": ["AM", "PM"], "days": ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], "shortDays": ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], "months": ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], "shortMonths": ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"] } ================================================ FILE: locale/es-ES.json ================================================ { "dateTime": "%A, %e de %B de %Y, %X", "date": "%d/%m/%Y", "time": "%H:%M:%S", "periods": ["AM", "PM"], "days": ["domingo", "lunes", "martes", "miércoles", "jueves", "viernes", "sábado"], "shortDays": ["dom", "lun", "mar", "mié", "jue", "vie", "sáb"], "months": ["enero", "febrero", "marzo", "abril", "mayo", "junio", "julio", "agosto", "septiembre", "octubre", "noviembre", "diciembre"], "shortMonths": ["ene", "feb", "mar", "abr", "may", "jun", "jul", "ago", "sep", "oct", "nov", "dic"] } ================================================ FILE: locale/es-MX.json ================================================ { "dateTime": "%x, %X", "date": "%d/%m/%Y", "time": "%-I:%M:%S %p", "periods": ["AM", "PM"], "days": ["domingo", "lunes", "martes", "miércoles", "jueves", "viernes", "sábado"], "shortDays": ["dom", "lun", "mar", "mié", "jue", "vie", "sáb"], "months": ["enero", "febrero", "marzo", "abril", "mayo", "junio", "julio", "agosto", "septiembre", "octubre", "noviembre", "diciembre"], "shortMonths": ["ene", "feb", "mar", "abr", "may", "jun", "jul", "ago", "sep", "oct", "nov", "dic"] } ================================================ FILE: locale/fa-IR.json ================================================ { "dateTime": "%x, %X", "date": "%-d/%-m/%Y", "time": "%-I:%M:%S %p", "periods": ["صبح", "عصر"], "days": ["یکشنبه", "دوشنبه", "سه شنبه", "چهارشنبه", "پنجشنبه", "جمعه", "شنبه"], "shortDays": ["یکشنبه", "دوشنبه", "سه شنبه", "چهارشنبه", "پنجشنبه", "جمعه", "شنبه"], "months": ["ژانویه", "فوریه", "مارس", "آوریل", "مه", "ژوئن", "ژوئیه", "اوت", "سپتامبر", "اکتبر", "نوامبر", "دسامبر"], "shortMonths": ["ژانویه", "فوریه", "مارس", "آوریل", "مه", "ژوئن", "ژوئیه", "اوت", "سپتامبر", "اکتبر", "نوامبر", "دسامبر"] } ================================================ FILE: locale/fi-FI.json ================================================ { "dateTime": "%A, %-d. %Bta %Y klo %X", "date": "%-d.%-m.%Y", "time": "%H:%M:%S", "periods": ["a.m.", "p.m."], "days": ["sunnuntai", "maanantai", "tiistai", "keskiviikko", "torstai", "perjantai", "lauantai"], "shortDays": ["Su", "Ma", "Ti", "Ke", "To", "Pe", "La"], "months": ["tammikuu", "helmikuu", "maaliskuu", "huhtikuu", "toukokuu", "kesäkuu", "heinäkuu", "elokuu", "syyskuu", "lokakuu", "marraskuu", "joulukuu"], "shortMonths": ["Tammi", "Helmi", "Maalis", "Huhti", "Touko", "Kesä", "Heinä", "Elo", "Syys", "Loka", "Marras", "Joulu"] } ================================================ FILE: locale/fr-CA.json ================================================ { "dateTime": "%a %e %b %Y %X", "date": "%Y-%m-%d", "time": "%H:%M:%S", "periods": ["", ""], "days": ["dimanche", "lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi"], "shortDays": ["dim", "lun", "mar", "mer", "jeu", "ven", "sam"], "months": ["janvier", "février", "mars", "avril", "mai", "juin", "juillet", "août", "septembre", "octobre", "novembre", "décembre"], "shortMonths": ["jan", "fév", "mar", "avr", "mai", "jui", "jul", "aoû", "sep", "oct", "nov", "déc"] } ================================================ FILE: locale/fr-FR.json ================================================ { "dateTime": "%A %e %B %Y à %X", "date": "%d/%m/%Y", "time": "%H:%M:%S", "periods": ["AM", "PM"], "days": ["dimanche", "lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi"], "shortDays": ["dim.", "lun.", "mar.", "mer.", "jeu.", "ven.", "sam."], "months": ["janvier", "février", "mars", "avril", "mai", "juin", "juillet", "août", "septembre", "octobre", "novembre", "décembre"], "shortMonths": ["janv.", "févr.", "mars", "avr.", "mai", "juin", "juil.", "août", "sept.", "oct.", "nov.", "déc."] } ================================================ FILE: locale/he-IL.json ================================================ { "dateTime": "%A, %e ב%B %Y %X", "date": "%d.%m.%Y", "time": "%H:%M:%S", "periods": ["AM", "PM"], "days": ["ראשון", "שני", "שלישי", "רביעי", "חמישי", "שישי", "שבת"], "shortDays": ["א׳", "ב׳", "ג׳", "ד׳", "ה׳", "ו׳", "ש׳"], "months": ["ינואר", "פברואר", "מרץ", "אפריל", "מאי", "יוני", "יולי", "אוגוסט", "ספטמבר", "אוקטובר", "נובמבר", "דצמבר"], "shortMonths": ["ינו׳", "פבר׳", "מרץ", "אפר׳", "מאי", "יוני", "יולי", "אוג׳", "ספט׳", "אוק׳", "נוב׳", "דצמ׳"] } ================================================ FILE: locale/hr-HR.json ================================================ { "dateTime": "%A, %e. %B %Y., %X", "date": "%d. %m. %Y.", "time": "%H:%M:%S", "periods": ["AM", "PM"], "days": ["Nedjelja", "Ponedjeljak", "Utorak", "Srijeda", "Četvtrak", "Petak", "Subota"], "shortDays": ["Ne", "Po", "Ut", "Sr", "Če", "Pe", "Su"], "months": ["Siječanj", "Veljača", "Ožujak", "Travanj", "Svibanj", "Lipanj", "Srpanj", "Kolovoz", "Rujan", "Listopad", "Studeni", "Prosinac"], "shortMonths": ["Sij", "Velj", "Ožu", "Tra", "Svi", "Lip", "Srp", "Kol", "Ruj", "Lis", "Stu", "Pro"] } ================================================ FILE: locale/hu-HU.json ================================================ { "dateTime": "%Y. %B %-e., %A %X", "date": "%Y. %m. %d.", "time": "%H:%M:%S", "periods": ["de.", "du."], "days": ["vasárnap", "hétfő", "kedd", "szerda", "csütörtök", "péntek", "szombat"], "shortDays": ["V", "H", "K", "Sze", "Cs", "P", "Szo"], "months": ["január", "február", "március", "április", "május", "június", "július", "augusztus", "szeptember", "október", "november", "december"], "shortMonths": ["jan.", "feb.", "már.", "ápr.", "máj.", "jún.", "júl.", "aug.", "szept.", "okt.", "nov.", "dec."] } ================================================ FILE: locale/it-IT.json ================================================ { "dateTime": "%A %e %B %Y, %X", "date": "%d/%m/%Y", "time": "%H:%M:%S", "periods": ["AM", "PM"], "days": ["Domenica", "Lunedì", "Martedì", "Mercoledì", "Giovedì", "Venerdì", "Sabato"], "shortDays": ["Dom", "Lun", "Mar", "Mer", "Gio", "Ven", "Sab"], "months": ["Gennaio", "Febbraio", "Marzo", "Aprile", "Maggio", "Giugno", "Luglio", "Agosto", "Settembre", "Ottobre", "Novembre", "Dicembre"], "shortMonths": ["Gen", "Feb", "Mar", "Apr", "Mag", "Giu", "Lug", "Ago", "Set", "Ott", "Nov", "Dic"] } ================================================ FILE: locale/ja-JP.json ================================================ { "dateTime": "%x %a %X", "date": "%Y/%m/%d", "time": "%H:%M:%S", "periods": ["AM", "PM"], "days": ["日曜日", "月曜日", "火曜日", "水曜日", "木曜日", "金曜日", "土曜日"], "shortDays": ["日", "月", "火", "水", "木", "金", "土"], "months": ["1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月"], "shortMonths": ["1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月"] } ================================================ FILE: locale/ko-KR.json ================================================ { "dateTime": "%Y/%m/%d %a %X", "date": "%Y/%m/%d", "time": "%H:%M:%S", "periods": ["오전", "오후"], "days": ["일요일", "월요일", "화요일", "수요일", "목요일", "금요일", "토요일"], "shortDays": ["일", "월", "화", "수", "목", "금", "토"], "months": ["1월", "2월", "3월", "4월", "5월", "6월", "7월", "8월", "9월", "10월", "11월", "12월"], "shortMonths": ["1월", "2월", "3월", "4월", "5월", "6월", "7월", "8월", "9월", "10월", "11월", "12월"] } ================================================ FILE: locale/mk-MK.json ================================================ { "dateTime": "%A, %e %B %Y г. %X", "date": "%d.%m.%Y", "time": "%H:%M:%S", "periods": ["AM", "PM"], "days": ["недела", "понеделник", "вторник", "среда", "четврток", "петок", "сабота"], "shortDays": ["нед", "пон", "вто", "сре", "чет", "пет", "саб"], "months": ["јануари", "февруари", "март", "април", "мај", "јуни", "јули", "август", "септември", "октомври", "ноември", "декември"], "shortMonths": ["јан", "фев", "мар", "апр", "мај", "јун", "јул", "авг", "сеп", "окт", "ное", "дек"] } ================================================ FILE: locale/nb-NO.json ================================================ { "dateTime": "%A den %d. %B %Y %X", "date": "%d.%m.%Y", "time": "%H:%M:%S", "periods": ["AM", "PM"], "days": ["søndag", "mandag", "tirsdag", "onsdag", "torsdag", "fredag", "lørdag"], "shortDays": ["søn", "man", "tir", "ons", "tor", "fre", "lør"], "months": ["januar", "februar", "mars", "april", "mai", "juni", "juli", "august", "september", "oktober", "november", "desember"], "shortMonths": ["jan", "feb", "mars", "apr", "mai", "juni", "juli", "aug", "sep", "okt", "nov", "des"] } ================================================ FILE: locale/nl-BE.json ================================================ { "dateTime": "%a %e %B %Y %X", "date": "%d/%m/%Y", "time": "%H:%M:%S", "periods": ["AM", "PM"], "days": ["zondag", "maandag", "dinsdag", "woensdag", "donderdag", "vrijdag", "zaterdag"], "shortDays": ["zo", "ma", "di", "wo", "do", "vr", "za"], "months": ["januari", "februari", "maart", "april", "mei", "juni", "juli", "augustus", "september", "oktober", "november", "december"], "shortMonths": ["jan", "feb", "mrt", "apr", "mei", "jun", "jul", "aug", "sep", "okt", "nov", "dec"] } ================================================ FILE: locale/nl-NL.json ================================================ { "dateTime": "%a %e %B %Y %X", "date": "%d-%m-%Y", "time": "%H:%M:%S", "periods": ["AM", "PM"], "days": ["zondag", "maandag", "dinsdag", "woensdag", "donderdag", "vrijdag", "zaterdag"], "shortDays": ["zo", "ma", "di", "wo", "do", "vr", "za"], "months": ["januari", "februari", "maart", "april", "mei", "juni", "juli", "augustus", "september", "oktober", "november", "december"], "shortMonths": ["jan", "feb", "mrt", "apr", "mei", "jun", "jul", "aug", "sep", "okt", "nov", "dec"] } ================================================ FILE: locale/pl-PL.json ================================================ { "dateTime": "%A, %e %B %Y, %X", "date": "%d/%m/%Y", "time": "%H:%M:%S", "periods": ["AM", "PM"], "days": ["Niedziela", "Poniedziałek", "Wtorek", "Środa", "Czwartek", "Piątek", "Sobota"], "shortDays": ["Niedz.", "Pon.", "Wt.", "Śr.", "Czw.", "Pt.", "Sob."], "months": ["Styczeń", "Luty", "Marzec", "Kwiecień", "Maj", "Czerwiec", "Lipiec", "Sierpień", "Wrzesień", "Październik", "Listopad", "Grudzień"], "shortMonths": ["Stycz.", "Luty", "Marz.", "Kwie.", "Maj", "Czerw.", "Lipc.", "Sierp.", "Wrz.", "Paźdz.", "Listop.", "Grudz."] } ================================================ FILE: locale/pt-BR.json ================================================ { "dateTime": "%A, %e de %B de %Y. %X", "date": "%d/%m/%Y", "time": "%H:%M:%S", "periods": ["AM", "PM"], "days": ["Domingo", "Segunda", "Terça", "Quarta", "Quinta", "Sexta", "Sábado"], "shortDays": ["Dom", "Seg", "Ter", "Qua", "Qui", "Sex", "Sáb"], "months": ["Janeiro", "Fevereiro", "Março", "Abril", "Maio", "Junho", "Julho", "Agosto", "Setembro", "Outubro", "Novembro", "Dezembro"], "shortMonths": ["Jan", "Fev", "Mar", "Abr", "Mai", "Jun", "Jul", "Ago", "Set", "Out", "Nov", "Dez"] } ================================================ FILE: locale/ru-RU.json ================================================ { "dateTime": "%A, %e %B %Y г. %X", "date": "%d.%m.%Y", "time": "%H:%M:%S", "periods": ["AM", "PM"], "days": ["воскресенье", "понедельник", "вторник", "среда", "четверг", "пятница", "суббота"], "shortDays": ["вс", "пн", "вт", "ср", "чт", "пт", "сб"], "months": ["января", "февраля", "марта", "апреля", "мая", "июня", "июля", "августа", "сентября", "октября", "ноября", "декабря"], "shortMonths": ["янв", "фев", "мар", "апр", "май", "июн", "июл", "авг", "сен", "окт", "ноя", "дек"] } ================================================ FILE: locale/sv-SE.json ================================================ { "dateTime": "%A den %d %B %Y %X", "date": "%Y-%m-%d", "time": "%H:%M:%S", "periods": ["fm", "em"], "days": ["Söndag", "Måndag", "Tisdag", "Onsdag", "Torsdag", "Fredag", "Lördag"], "shortDays": ["Sön", "Mån", "Tis", "Ons", "Tor", "Fre", "Lör"], "months": ["Januari", "Februari", "Mars", "April", "Maj", "Juni", "Juli", "Augusti", "September", "Oktober", "November", "December"], "shortMonths": ["Jan", "Feb", "Mar", "Apr", "Maj", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dec"] } ================================================ FILE: locale/tr-TR.json ================================================ { "dateTime": "%a %e %b %X %Y", "date": "%d/%m/%Y", "time": "%H:%M:%S", "periods": ["AM", "PM"], "days": ["Pazar", "Pazartesi", "Salı", "Çarşamba", "Perşembe", "Cuma", "Cumartesi"], "shortDays": ["Paz", "Pzt", "Sal", "Çar", "Per", "Cum", "Cmt"], "months": ["Ocak", "Şubat", "Mart", "Nisan", "Mayıs", "Haziran", "Temmuz", "Ağustos", "Eylül", "Ekim", "Kasım", "Aralık"], "shortMonths": ["Oca", "Şub", "Mar", "Nis", "May", "Haz", "Tem", "Ağu", "Eyl", "Eki", "Kas", "Ara"] } ================================================ FILE: locale/uk-UA.json ================================================ { "dateTime": "%A, %e %B %Y р. %X", "date": "%d.%m.%Y", "time": "%H:%M:%S", "periods": ["дп", "пп"], "days": ["неділя", "понеділок", "вівторок", "середа", "четвер", "п'ятниця", "субота"], "shortDays": ["нд", "пн", "вт", "ср", "чт", "пт", "сб"], "months": ["січня", "лютого", "березня", "квітня", "травня", "червня", "липня", "серпня", "вересня", "жовтня", "листопада", "грудня"], "shortMonths": ["січ.", "лют.", "бер.", "квіт.", "трав.", "черв.", "лип.", "серп.", "вер.", "жовт.", "лист.", "груд."] } ================================================ FILE: locale/vi-VN.json ================================================ { "dateTime": "%a, %e %b, %Y %H:%M", "date": "%d/%m/%Y", "time": "%H:%M:%S", "periods": ["AM", "PM"], "days": ["Chủ nhật", "Thứ hai", "Thứ ba", "Thứ tư", "Thứ năm", "Thứ sáu", "Thứ bảy"], "shortDays": ["CN", "Thứ 2", "Thứ 3", "Thứ 4", "Thứ 5", "Thứ 6", "Thứ 7"], "months": ["Tháng một", "Tháng hai", "Tháng ba", "Tháng tư", "Tháng năm", "Tháng sáu", "Tháng bảy", "Tháng tám", "Tháng chín", "Tháng mười", "Tháng mười một", "Tháng mười hai"], "shortMonths": ["Tháng 1", "Tháng 2", "Tháng 3", "Tháng 4", "Tháng 5", "Tháng 6", "Tháng 7", "Tháng 8", "Tháng 9", "Tháng 10", "Tháng 11", "Tháng 12"] } ================================================ FILE: locale/zh-CN.json ================================================ { "dateTime": "%x %A %X", "date": "%Y年%-m月%-d日", "time": "%H:%M:%S", "periods": ["上午", "下午"], "days": ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"], "shortDays": ["周日", "周一", "周二", "周三", "周四", "周五", "周六"], "months": ["一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"], "shortMonths": ["一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"] } ================================================ FILE: locale/zh-TW.json ================================================ { "dateTime": "%x %A %X", "date": "%Y年%-m月%-d日", "time": "%H:%M:%S", "periods": ["上午", "下午"], "days": ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"], "shortDays": ["日", "一", "二", "三", "四", "五", "六"], "months": ["一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"], "shortMonths": ["1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月"] } ================================================ FILE: package.json ================================================ { "name": "d3-time-format", "version": "4.1.0", "description": "A JavaScript time formatter and parser inspired by strftime and strptime.", "homepage": "https://d3js.org/d3-time-format/", "repository": { "type": "git", "url": "https://github.com/d3/d3-time-format.git" }, "keywords": [ "d3", "d3-module", "time", "format", "strftime", "strptime" ], "license": "ISC", "author": { "name": "Mike Bostock", "url": "http://bost.ocks.org/mike" }, "type": "module", "files": [ "dist/**/*.js", "src/**/*.js", "locale/*.json" ], "module": "src/index.js", "main": "src/index.js", "jsdelivr": "dist/d3-time-format.min.js", "unpkg": "dist/d3-time-format.min.js", "exports": { ".": { "umd": "./dist/d3-time-format.min.js", "default": "./src/index.js" }, "./locale/*": "./locale/*.json" }, "sideEffects": [ "./src/defaultLocale.js" ], "dependencies": { "d3-time": "1 - 3" }, "devDependencies": { "eslint": "8", "mocha": "9", "rollup": "2", "rollup-plugin-terser": "7" }, "scripts": { "test": "TZ=America/Los_Angeles mocha 'test/**/*-test.js' && eslint src test", "prepublishOnly": "rm -rf dist && yarn test && rollup -c", "postpublish": "git push && git push --tags && cd ../d3.github.com && git pull && cp ../${npm_package_name}/dist/${npm_package_name}.js ${npm_package_name}.v${npm_package_version%%.*}.js && cp ../${npm_package_name}/dist/${npm_package_name}.min.js ${npm_package_name}.v${npm_package_version%%.*}.min.js && git add ${npm_package_name}.v${npm_package_version%%.*}.js ${npm_package_name}.v${npm_package_version%%.*}.min.js && git commit -m \"${npm_package_name} ${npm_package_version}\" && git push && cd -" }, "engines": { "node": ">=12" } } ================================================ FILE: rollup.config.js ================================================ import {readFileSync} from "fs"; import {terser} from "rollup-plugin-terser"; import * as meta from "./package.json"; // Extract copyrights from the LICENSE. const copyright = readFileSync("./LICENSE", "utf-8") .split(/\n/g) .filter(line => /^Copyright\s+/.test(line)) .map(line => line.replace(/^Copyright\s+/, "")) .join(", "); const config = { input: "src/index.js", external: Object.keys(meta.dependencies || {}).filter(key => /^d3-/.test(key)), output: { file: `dist/${meta.name}.js`, name: "d3", format: "umd", indent: false, extend: true, banner: `// ${meta.homepage} v${meta.version} Copyright ${copyright}`, globals: Object.assign({}, ...Object.keys(meta.dependencies || {}).filter(key => /^d3-/.test(key)).map(key => ({[key]: "d3"}))) }, plugins: [] }; export default [ config, { ...config, output: { ...config.output, file: `dist/${meta.name}.min.js` }, plugins: [ ...config.plugins, terser({ output: { preamble: config.output.banner } }) ] } ]; ================================================ FILE: src/defaultLocale.js ================================================ import formatLocale from "./locale.js"; var locale; export var timeFormat; export var timeParse; export var utcFormat; export var utcParse; defaultLocale({ dateTime: "%x, %X", date: "%-m/%-d/%Y", time: "%-I:%M:%S %p", periods: ["AM", "PM"], days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], shortDays: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], shortMonths: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"] }); export default function defaultLocale(definition) { locale = formatLocale(definition); timeFormat = locale.format; timeParse = locale.parse; utcFormat = locale.utcFormat; utcParse = locale.utcParse; return locale; } ================================================ FILE: src/index.js ================================================ export {default as timeFormatDefaultLocale, timeFormat, timeParse, utcFormat, utcParse} from "./defaultLocale.js"; export {default as timeFormatLocale} from "./locale.js"; export {default as isoFormat} from "./isoFormat.js"; export {default as isoParse} from "./isoParse.js"; ================================================ FILE: src/isoFormat.js ================================================ import {utcFormat} from "./defaultLocale.js"; export var isoSpecifier = "%Y-%m-%dT%H:%M:%S.%LZ"; function formatIsoNative(date) { return date.toISOString(); } var formatIso = Date.prototype.toISOString ? formatIsoNative : utcFormat(isoSpecifier); export default formatIso; ================================================ FILE: src/isoParse.js ================================================ import {isoSpecifier} from "./isoFormat.js"; import {utcParse} from "./defaultLocale.js"; function parseIsoNative(string) { var date = new Date(string); return isNaN(date) ? null : date; } var parseIso = +new Date("2000-01-01T00:00:00.000Z") ? parseIsoNative : utcParse(isoSpecifier); export default parseIso; ================================================ FILE: src/locale.js ================================================ import { timeDay, timeSunday, timeMonday, timeThursday, timeYear, utcDay, utcSunday, utcMonday, utcThursday, utcYear } from "d3-time"; function localDate(d) { if (0 <= d.y && d.y < 100) { var date = new Date(-1, d.m, d.d, d.H, d.M, d.S, d.L); date.setFullYear(d.y); return date; } return new Date(d.y, d.m, d.d, d.H, d.M, d.S, d.L); } function utcDate(d) { if (0 <= d.y && d.y < 100) { var date = new Date(Date.UTC(-1, d.m, d.d, d.H, d.M, d.S, d.L)); date.setUTCFullYear(d.y); return date; } return new Date(Date.UTC(d.y, d.m, d.d, d.H, d.M, d.S, d.L)); } function newDate(y, m, d) { return {y: y, m: m, d: d, H: 0, M: 0, S: 0, L: 0}; } export default function formatLocale(locale) { var locale_dateTime = locale.dateTime, locale_date = locale.date, locale_time = locale.time, locale_periods = locale.periods, locale_weekdays = locale.days, locale_shortWeekdays = locale.shortDays, locale_months = locale.months, locale_shortMonths = locale.shortMonths; var periodRe = formatRe(locale_periods), periodLookup = formatLookup(locale_periods), weekdayRe = formatRe(locale_weekdays), weekdayLookup = formatLookup(locale_weekdays), shortWeekdayRe = formatRe(locale_shortWeekdays), shortWeekdayLookup = formatLookup(locale_shortWeekdays), monthRe = formatRe(locale_months), monthLookup = formatLookup(locale_months), shortMonthRe = formatRe(locale_shortMonths), shortMonthLookup = formatLookup(locale_shortMonths); var formats = { "a": formatShortWeekday, "A": formatWeekday, "b": formatShortMonth, "B": formatMonth, "c": null, "d": formatDayOfMonth, "e": formatDayOfMonth, "f": formatMicroseconds, "g": formatYearISO, "G": formatFullYearISO, "H": formatHour24, "I": formatHour12, "j": formatDayOfYear, "L": formatMilliseconds, "m": formatMonthNumber, "M": formatMinutes, "p": formatPeriod, "q": formatQuarter, "Q": formatUnixTimestamp, "s": formatUnixTimestampSeconds, "S": formatSeconds, "u": formatWeekdayNumberMonday, "U": formatWeekNumberSunday, "V": formatWeekNumberISO, "w": formatWeekdayNumberSunday, "W": formatWeekNumberMonday, "x": null, "X": null, "y": formatYear, "Y": formatFullYear, "Z": formatZone, "%": formatLiteralPercent }; var utcFormats = { "a": formatUTCShortWeekday, "A": formatUTCWeekday, "b": formatUTCShortMonth, "B": formatUTCMonth, "c": null, "d": formatUTCDayOfMonth, "e": formatUTCDayOfMonth, "f": formatUTCMicroseconds, "g": formatUTCYearISO, "G": formatUTCFullYearISO, "H": formatUTCHour24, "I": formatUTCHour12, "j": formatUTCDayOfYear, "L": formatUTCMilliseconds, "m": formatUTCMonthNumber, "M": formatUTCMinutes, "p": formatUTCPeriod, "q": formatUTCQuarter, "Q": formatUnixTimestamp, "s": formatUnixTimestampSeconds, "S": formatUTCSeconds, "u": formatUTCWeekdayNumberMonday, "U": formatUTCWeekNumberSunday, "V": formatUTCWeekNumberISO, "w": formatUTCWeekdayNumberSunday, "W": formatUTCWeekNumberMonday, "x": null, "X": null, "y": formatUTCYear, "Y": formatUTCFullYear, "Z": formatUTCZone, "%": formatLiteralPercent }; var parses = { "a": parseShortWeekday, "A": parseWeekday, "b": parseShortMonth, "B": parseMonth, "c": parseLocaleDateTime, "d": parseDayOfMonth, "e": parseDayOfMonth, "f": parseMicroseconds, "g": parseYear, "G": parseFullYear, "H": parseHour24, "I": parseHour24, "j": parseDayOfYear, "L": parseMilliseconds, "m": parseMonthNumber, "M": parseMinutes, "p": parsePeriod, "q": parseQuarter, "Q": parseUnixTimestamp, "s": parseUnixTimestampSeconds, "S": parseSeconds, "u": parseWeekdayNumberMonday, "U": parseWeekNumberSunday, "V": parseWeekNumberISO, "w": parseWeekdayNumberSunday, "W": parseWeekNumberMonday, "x": parseLocaleDate, "X": parseLocaleTime, "y": parseYear, "Y": parseFullYear, "Z": parseZone, "%": parseLiteralPercent }; // These recursive directive definitions must be deferred. formats.x = newFormat(locale_date, formats); formats.X = newFormat(locale_time, formats); formats.c = newFormat(locale_dateTime, formats); utcFormats.x = newFormat(locale_date, utcFormats); utcFormats.X = newFormat(locale_time, utcFormats); utcFormats.c = newFormat(locale_dateTime, utcFormats); function newFormat(specifier, formats) { return function(date) { var string = [], i = -1, j = 0, n = specifier.length, c, pad, format; if (!(date instanceof Date)) date = new Date(+date); while (++i < n) { if (specifier.charCodeAt(i) === 37) { string.push(specifier.slice(j, i)); if ((pad = pads[c = specifier.charAt(++i)]) != null) c = specifier.charAt(++i); else pad = c === "e" ? " " : "0"; if (format = formats[c]) c = format(date, pad); string.push(c); j = i + 1; } } string.push(specifier.slice(j, i)); return string.join(""); }; } function newParse(specifier, Z) { return function(string) { var d = newDate(1900, undefined, 1), i = parseSpecifier(d, specifier, string += "", 0), week, day; if (i != string.length) return null; // If a UNIX timestamp is specified, return it. if ("Q" in d) return new Date(d.Q); if ("s" in d) return new Date(d.s * 1000 + ("L" in d ? d.L : 0)); // If this is utcParse, never use the local timezone. if (Z && !("Z" in d)) d.Z = 0; // The am-pm flag is 0 for AM, and 1 for PM. if ("p" in d) d.H = d.H % 12 + d.p * 12; // If the month was not specified, inherit from the quarter. if (d.m === undefined) d.m = "q" in d ? d.q : 0; // Convert day-of-week and week-of-year to day-of-year. if ("V" in d) { if (d.V < 1 || d.V > 53) return null; if (!("w" in d)) d.w = 1; if ("Z" in d) { week = utcDate(newDate(d.y, 0, 1)), day = week.getUTCDay(); week = day > 4 || day === 0 ? utcMonday.ceil(week) : utcMonday(week); week = utcDay.offset(week, (d.V - 1) * 7); d.y = week.getUTCFullYear(); d.m = week.getUTCMonth(); d.d = week.getUTCDate() + (d.w + 6) % 7; } else { week = localDate(newDate(d.y, 0, 1)), day = week.getDay(); week = day > 4 || day === 0 ? timeMonday.ceil(week) : timeMonday(week); week = timeDay.offset(week, (d.V - 1) * 7); d.y = week.getFullYear(); d.m = week.getMonth(); d.d = week.getDate() + (d.w + 6) % 7; } } else if ("W" in d || "U" in d) { if (!("w" in d)) d.w = "u" in d ? d.u % 7 : "W" in d ? 1 : 0; day = "Z" in d ? utcDate(newDate(d.y, 0, 1)).getUTCDay() : localDate(newDate(d.y, 0, 1)).getDay(); d.m = 0; d.d = "W" in d ? (d.w + 6) % 7 + d.W * 7 - (day + 5) % 7 : d.w + d.U * 7 - (day + 6) % 7; } // If a time zone is specified, all fields are interpreted as UTC and then // offset according to the specified time zone. if ("Z" in d) { d.H += d.Z / 100 | 0; d.M += d.Z % 100; return utcDate(d); } // Otherwise, all fields are in local time. return localDate(d); }; } function parseSpecifier(d, specifier, string, j) { var i = 0, n = specifier.length, m = string.length, c, parse; while (i < n) { if (j >= m) return -1; c = specifier.charCodeAt(i++); if (c === 37) { c = specifier.charAt(i++); parse = parses[c in pads ? specifier.charAt(i++) : c]; if (!parse || ((j = parse(d, string, j)) < 0)) return -1; } else if (c != string.charCodeAt(j++)) { return -1; } } return j; } function parsePeriod(d, string, i) { var n = periodRe.exec(string.slice(i)); return n ? (d.p = periodLookup.get(n[0].toLowerCase()), i + n[0].length) : -1; } function parseShortWeekday(d, string, i) { var n = shortWeekdayRe.exec(string.slice(i)); return n ? (d.w = shortWeekdayLookup.get(n[0].toLowerCase()), i + n[0].length) : -1; } function parseWeekday(d, string, i) { var n = weekdayRe.exec(string.slice(i)); return n ? (d.w = weekdayLookup.get(n[0].toLowerCase()), i + n[0].length) : -1; } function parseShortMonth(d, string, i) { var n = shortMonthRe.exec(string.slice(i)); return n ? (d.m = shortMonthLookup.get(n[0].toLowerCase()), i + n[0].length) : -1; } function parseMonth(d, string, i) { var n = monthRe.exec(string.slice(i)); return n ? (d.m = monthLookup.get(n[0].toLowerCase()), i + n[0].length) : -1; } function parseLocaleDateTime(d, string, i) { return parseSpecifier(d, locale_dateTime, string, i); } function parseLocaleDate(d, string, i) { return parseSpecifier(d, locale_date, string, i); } function parseLocaleTime(d, string, i) { return parseSpecifier(d, locale_time, string, i); } function formatShortWeekday(d) { return locale_shortWeekdays[d.getDay()]; } function formatWeekday(d) { return locale_weekdays[d.getDay()]; } function formatShortMonth(d) { return locale_shortMonths[d.getMonth()]; } function formatMonth(d) { return locale_months[d.getMonth()]; } function formatPeriod(d) { return locale_periods[+(d.getHours() >= 12)]; } function formatQuarter(d) { return 1 + ~~(d.getMonth() / 3); } function formatUTCShortWeekday(d) { return locale_shortWeekdays[d.getUTCDay()]; } function formatUTCWeekday(d) { return locale_weekdays[d.getUTCDay()]; } function formatUTCShortMonth(d) { return locale_shortMonths[d.getUTCMonth()]; } function formatUTCMonth(d) { return locale_months[d.getUTCMonth()]; } function formatUTCPeriod(d) { return locale_periods[+(d.getUTCHours() >= 12)]; } function formatUTCQuarter(d) { return 1 + ~~(d.getUTCMonth() / 3); } return { format: function(specifier) { var f = newFormat(specifier += "", formats); f.toString = function() { return specifier; }; return f; }, parse: function(specifier) { var p = newParse(specifier += "", false); p.toString = function() { return specifier; }; return p; }, utcFormat: function(specifier) { var f = newFormat(specifier += "", utcFormats); f.toString = function() { return specifier; }; return f; }, utcParse: function(specifier) { var p = newParse(specifier += "", true); p.toString = function() { return specifier; }; return p; } }; } var pads = {"-": "", "_": " ", "0": "0"}, numberRe = /^\s*\d+/, // note: ignores next directive percentRe = /^%/, requoteRe = /[\\^$*+?|[\]().{}]/g; function pad(value, fill, width) { var sign = value < 0 ? "-" : "", string = (sign ? -value : value) + "", length = string.length; return sign + (length < width ? new Array(width - length + 1).join(fill) + string : string); } function requote(s) { return s.replace(requoteRe, "\\$&"); } function formatRe(names) { return new RegExp("^(?:" + names.map(requote).join("|") + ")", "i"); } function formatLookup(names) { return new Map(names.map((name, i) => [name.toLowerCase(), i])); } function parseWeekdayNumberSunday(d, string, i) { var n = numberRe.exec(string.slice(i, i + 1)); return n ? (d.w = +n[0], i + n[0].length) : -1; } function parseWeekdayNumberMonday(d, string, i) { var n = numberRe.exec(string.slice(i, i + 1)); return n ? (d.u = +n[0], i + n[0].length) : -1; } function parseWeekNumberSunday(d, string, i) { var n = numberRe.exec(string.slice(i, i + 2)); return n ? (d.U = +n[0], i + n[0].length) : -1; } function parseWeekNumberISO(d, string, i) { var n = numberRe.exec(string.slice(i, i + 2)); return n ? (d.V = +n[0], i + n[0].length) : -1; } function parseWeekNumberMonday(d, string, i) { var n = numberRe.exec(string.slice(i, i + 2)); return n ? (d.W = +n[0], i + n[0].length) : -1; } function parseFullYear(d, string, i) { var n = numberRe.exec(string.slice(i, i + 4)); return n ? (d.y = +n[0], i + n[0].length) : -1; } function parseYear(d, string, i) { var n = numberRe.exec(string.slice(i, i + 2)); return n ? (d.y = +n[0] + (+n[0] > 68 ? 1900 : 2000), i + n[0].length) : -1; } function parseZone(d, string, i) { var n = /^(Z)|([+-]\d\d)(?::?(\d\d))?/.exec(string.slice(i, i + 6)); return n ? (d.Z = n[1] ? 0 : -(n[2] + (n[3] || "00")), i + n[0].length) : -1; } function parseQuarter(d, string, i) { var n = numberRe.exec(string.slice(i, i + 1)); return n ? (d.q = n[0] * 3 - 3, i + n[0].length) : -1; } function parseMonthNumber(d, string, i) { var n = numberRe.exec(string.slice(i, i + 2)); return n ? (d.m = n[0] - 1, i + n[0].length) : -1; } function parseDayOfMonth(d, string, i) { var n = numberRe.exec(string.slice(i, i + 2)); return n ? (d.d = +n[0], i + n[0].length) : -1; } function parseDayOfYear(d, string, i) { var n = numberRe.exec(string.slice(i, i + 3)); return n ? (d.m = 0, d.d = +n[0], i + n[0].length) : -1; } function parseHour24(d, string, i) { var n = numberRe.exec(string.slice(i, i + 2)); return n ? (d.H = +n[0], i + n[0].length) : -1; } function parseMinutes(d, string, i) { var n = numberRe.exec(string.slice(i, i + 2)); return n ? (d.M = +n[0], i + n[0].length) : -1; } function parseSeconds(d, string, i) { var n = numberRe.exec(string.slice(i, i + 2)); return n ? (d.S = +n[0], i + n[0].length) : -1; } function parseMilliseconds(d, string, i) { var n = numberRe.exec(string.slice(i, i + 3)); return n ? (d.L = +n[0], i + n[0].length) : -1; } function parseMicroseconds(d, string, i) { var n = numberRe.exec(string.slice(i, i + 6)); return n ? (d.L = Math.floor(n[0] / 1000), i + n[0].length) : -1; } function parseLiteralPercent(d, string, i) { var n = percentRe.exec(string.slice(i, i + 1)); return n ? i + n[0].length : -1; } function parseUnixTimestamp(d, string, i) { var n = numberRe.exec(string.slice(i)); return n ? (d.Q = +n[0], i + n[0].length) : -1; } function parseUnixTimestampSeconds(d, string, i) { var n = numberRe.exec(string.slice(i)); return n ? (d.s = +n[0], i + n[0].length) : -1; } function formatDayOfMonth(d, p) { return pad(d.getDate(), p, 2); } function formatHour24(d, p) { return pad(d.getHours(), p, 2); } function formatHour12(d, p) { return pad(d.getHours() % 12 || 12, p, 2); } function formatDayOfYear(d, p) { return pad(1 + timeDay.count(timeYear(d), d), p, 3); } function formatMilliseconds(d, p) { return pad(d.getMilliseconds(), p, 3); } function formatMicroseconds(d, p) { return formatMilliseconds(d, p) + "000"; } function formatMonthNumber(d, p) { return pad(d.getMonth() + 1, p, 2); } function formatMinutes(d, p) { return pad(d.getMinutes(), p, 2); } function formatSeconds(d, p) { return pad(d.getSeconds(), p, 2); } function formatWeekdayNumberMonday(d) { var day = d.getDay(); return day === 0 ? 7 : day; } function formatWeekNumberSunday(d, p) { return pad(timeSunday.count(timeYear(d) - 1, d), p, 2); } function dISO(d) { var day = d.getDay(); return (day >= 4 || day === 0) ? timeThursday(d) : timeThursday.ceil(d); } function formatWeekNumberISO(d, p) { d = dISO(d); return pad(timeThursday.count(timeYear(d), d) + (timeYear(d).getDay() === 4), p, 2); } function formatWeekdayNumberSunday(d) { return d.getDay(); } function formatWeekNumberMonday(d, p) { return pad(timeMonday.count(timeYear(d) - 1, d), p, 2); } function formatYear(d, p) { return pad(d.getFullYear() % 100, p, 2); } function formatYearISO(d, p) { d = dISO(d); return pad(d.getFullYear() % 100, p, 2); } function formatFullYear(d, p) { return pad(d.getFullYear() % 10000, p, 4); } function formatFullYearISO(d, p) { var day = d.getDay(); d = (day >= 4 || day === 0) ? timeThursday(d) : timeThursday.ceil(d); return pad(d.getFullYear() % 10000, p, 4); } function formatZone(d) { var z = d.getTimezoneOffset(); return (z > 0 ? "-" : (z *= -1, "+")) + pad(z / 60 | 0, "0", 2) + pad(z % 60, "0", 2); } function formatUTCDayOfMonth(d, p) { return pad(d.getUTCDate(), p, 2); } function formatUTCHour24(d, p) { return pad(d.getUTCHours(), p, 2); } function formatUTCHour12(d, p) { return pad(d.getUTCHours() % 12 || 12, p, 2); } function formatUTCDayOfYear(d, p) { return pad(1 + utcDay.count(utcYear(d), d), p, 3); } function formatUTCMilliseconds(d, p) { return pad(d.getUTCMilliseconds(), p, 3); } function formatUTCMicroseconds(d, p) { return formatUTCMilliseconds(d, p) + "000"; } function formatUTCMonthNumber(d, p) { return pad(d.getUTCMonth() + 1, p, 2); } function formatUTCMinutes(d, p) { return pad(d.getUTCMinutes(), p, 2); } function formatUTCSeconds(d, p) { return pad(d.getUTCSeconds(), p, 2); } function formatUTCWeekdayNumberMonday(d) { var dow = d.getUTCDay(); return dow === 0 ? 7 : dow; } function formatUTCWeekNumberSunday(d, p) { return pad(utcSunday.count(utcYear(d) - 1, d), p, 2); } function UTCdISO(d) { var day = d.getUTCDay(); return (day >= 4 || day === 0) ? utcThursday(d) : utcThursday.ceil(d); } function formatUTCWeekNumberISO(d, p) { d = UTCdISO(d); return pad(utcThursday.count(utcYear(d), d) + (utcYear(d).getUTCDay() === 4), p, 2); } function formatUTCWeekdayNumberSunday(d) { return d.getUTCDay(); } function formatUTCWeekNumberMonday(d, p) { return pad(utcMonday.count(utcYear(d) - 1, d), p, 2); } function formatUTCYear(d, p) { return pad(d.getUTCFullYear() % 100, p, 2); } function formatUTCYearISO(d, p) { d = UTCdISO(d); return pad(d.getUTCFullYear() % 100, p, 2); } function formatUTCFullYear(d, p) { return pad(d.getUTCFullYear() % 10000, p, 4); } function formatUTCFullYearISO(d, p) { var day = d.getUTCDay(); d = (day >= 4 || day === 0) ? utcThursday(d) : utcThursday.ceil(d); return pad(d.getUTCFullYear() % 10000, p, 4); } function formatUTCZone() { return "+0000"; } function formatLiteralPercent() { return "%"; } function formatUnixTimestamp(d) { return +d; } function formatUnixTimestampSeconds(d) { return Math.floor(+d / 1000); } ================================================ FILE: test/.eslintrc.json ================================================ { "extends": "eslint:recommended", "parserOptions": { "sourceType": "module", "ecmaVersion": 8 }, "env": { "es6": true, "mocha": true } } ================================================ FILE: test/date.js ================================================ export function local(year, month, day, hours, minutes, seconds, milliseconds) { if (year == null) year = 0; if (month == null) month = 0; if (day == null) day = 1; if (hours == null) hours = 0; if (minutes == null) minutes = 0; if (seconds == null) seconds = 0; if (milliseconds == null) milliseconds = 0; if (0 <= year && year < 100) { const date = new Date(-1, month, day, hours, minutes, seconds, milliseconds); date.setFullYear(year); return date; } return new Date(year, month, day, hours, minutes, seconds, milliseconds); } export function utc(year, month, day, hours, minutes, seconds, milliseconds) { if (year == null) year = 0; if (month == null) month = 0; if (day == null) day = 1; if (hours == null) hours = 0; if (minutes == null) minutes = 0; if (seconds == null) seconds = 0; if (milliseconds == null) milliseconds = 0; if (0 <= year && year < 100) { const date = new Date(Date.UTC(-1, month, day, hours, minutes, seconds, milliseconds)); date.setUTCFullYear(year); return date; } return new Date(Date.UTC(year, month, day, hours, minutes, seconds, milliseconds)); } ================================================ FILE: test/defaultLocale-test.js ================================================ import assert from "assert"; import {readFileSync} from "fs"; import {timeFormat, timeFormatDefaultLocale, timeParse, utcFormat, utcParse} from "../src/index.js"; const enUs = JSON.parse(readFileSync("./locale/en-US.json")); const frFr = JSON.parse(readFileSync("./locale/fr-FR.json")); it("timeFormat(specifier) defaults to en-US", () => { assert.strictEqual(timeFormat("%c")(new Date(2000, 0, 1)), "1/1/2000, 12:00:00 AM"); }); it("timeParse(specifier) defaults to en-US", () => { assert.strictEqual(+timeParse("%c")("1/1/2000, 12:00:00 AM"), +new Date(2000, 0, 1)); }); it("utcFormat(specifier) defaults to en-US", () => { assert.strictEqual(utcFormat("%c")(new Date(Date.UTC(2000, 0, 1))), "1/1/2000, 12:00:00 AM"); }); it("utcParse(specifier) defaults to en-US", () => { assert.strictEqual(+utcParse("%c")("1/1/2000, 12:00:00 AM"), +new Date(Date.UTC(2000, 0, 1))); }); it("timeFormatDefaultLocale(definition) returns the new default locale", () => { const locale = timeFormatDefaultLocale(frFr); try { assert.strictEqual(locale.format("%c")(new Date(2000, 0, 1)), "samedi 1 janvier 2000 à 00:00:00"); } finally { timeFormatDefaultLocale(enUs); } }); it("timeFormatDefaultLocale(definition) affects timeFormat", () => { const locale = timeFormatDefaultLocale(frFr); try { assert.strictEqual(timeFormat, locale.format); assert.strictEqual(timeFormat("%c")(new Date(2000, 0, 1)), "samedi 1 janvier 2000 à 00:00:00"); } finally { timeFormatDefaultLocale(enUs); } }); it("timeFormatDefaultLocale(definition) affects timeParse", () => { const locale = timeFormatDefaultLocale(frFr); try { assert.strictEqual(timeParse, locale.parse); assert.strictEqual(+timeParse("%c")("samedi 1 janvier 2000 à 00:00:00"), +new Date(2000, 0, 1)); } finally { timeFormatDefaultLocale(enUs); } }); it("timeFormatDefaultLocale(definition) affects utcFormat", () => { const locale = timeFormatDefaultLocale(frFr); try { assert.strictEqual(utcFormat, locale.utcFormat); assert.strictEqual(utcFormat("%c")(new Date(Date.UTC(2000, 0, 1))), "samedi 1 janvier 2000 à 00:00:00"); } finally { timeFormatDefaultLocale(enUs); } }); it("timeFormatDefaultLocale(definition) affects utcParse", () => { const locale = timeFormatDefaultLocale(frFr); try { assert.strictEqual(utcParse, locale.utcParse); assert.strictEqual(+utcParse("%c")("samedi 1 janvier 2000 à 00:00:00"), +new Date(Date.UTC(2000, 0, 1))); } finally { timeFormatDefaultLocale(enUs); } }); ================================================ FILE: test/format-test.js ================================================ import assert from "assert"; import {timeSecond, timeMinute, timeHour, timeDay, timeMonth, timeWeek, timeYear} from "d3-time"; import {timeFormat} from "../src/index.js"; import {local} from "./date.js"; const formatMillisecond = timeFormat(".%L"), formatSecond = timeFormat(":%S"), formatMinute = timeFormat("%I:%M"), formatHour = timeFormat("%I %p"), formatDay = timeFormat("%a %d"), formatWeek = timeFormat("%b %d"), formatMonth = timeFormat("%B"), formatYear = timeFormat("%Y"); function multi(d) { return (timeSecond(d) < d ? formatMillisecond : timeMinute(d) < d ? formatSecond : timeHour(d) < d ? formatMinute : timeDay(d) < d ? formatHour : timeMonth(d) < d ? (timeWeek(d) < d ? formatDay : formatWeek) : timeYear(d) < d ? formatMonth : formatYear)(d); } it("timeFormat(date) coerces the specified date to a Date", () => { const f = timeFormat("%c"); assert.strictEqual(f(+local(1990, 0, 1)), "1/1/1990, 12:00:00 AM"); assert.strictEqual(f(+local(1990, 0, 2)), "1/2/1990, 12:00:00 AM"); assert.strictEqual(f(+local(1990, 0, 3)), "1/3/1990, 12:00:00 AM"); assert.strictEqual(f(+local(1990, 0, 4)), "1/4/1990, 12:00:00 AM"); assert.strictEqual(f(+local(1990, 0, 5)), "1/5/1990, 12:00:00 AM"); assert.strictEqual(f(+local(1990, 0, 6)), "1/6/1990, 12:00:00 AM"); assert.strictEqual(f(+local(1990, 0, 7)), "1/7/1990, 12:00:00 AM"); }); it("timeFormat(\"%a\")(date) formats abbreviated weekdays", () => { const f = timeFormat("%a"); assert.strictEqual(f(local(1990, 0, 1)), "Mon"); assert.strictEqual(f(local(1990, 0, 2)), "Tue"); assert.strictEqual(f(local(1990, 0, 3)), "Wed"); assert.strictEqual(f(local(1990, 0, 4)), "Thu"); assert.strictEqual(f(local(1990, 0, 5)), "Fri"); assert.strictEqual(f(local(1990, 0, 6)), "Sat"); assert.strictEqual(f(local(1990, 0, 7)), "Sun"); }); it("timeFormat(\"%A\")(date) formats weekdays", () => { const f = timeFormat("%A"); assert.strictEqual(f(local(1990, 0, 1)), "Monday"); assert.strictEqual(f(local(1990, 0, 2)), "Tuesday"); assert.strictEqual(f(local(1990, 0, 3)), "Wednesday"); assert.strictEqual(f(local(1990, 0, 4)), "Thursday"); assert.strictEqual(f(local(1990, 0, 5)), "Friday"); assert.strictEqual(f(local(1990, 0, 6)), "Saturday"); assert.strictEqual(f(local(1990, 0, 7)), "Sunday"); }); it("timeFormat(\"%b\")(date) formats abbreviated months", () => { const f = timeFormat("%b"); assert.strictEqual(f(local(1990, 0, 1)), "Jan"); assert.strictEqual(f(local(1990, 1, 1)), "Feb"); assert.strictEqual(f(local(1990, 2, 1)), "Mar"); assert.strictEqual(f(local(1990, 3, 1)), "Apr"); assert.strictEqual(f(local(1990, 4, 1)), "May"); assert.strictEqual(f(local(1990, 5, 1)), "Jun"); assert.strictEqual(f(local(1990, 6, 1)), "Jul"); assert.strictEqual(f(local(1990, 7, 1)), "Aug"); assert.strictEqual(f(local(1990, 8, 1)), "Sep"); assert.strictEqual(f(local(1990, 9, 1)), "Oct"); assert.strictEqual(f(local(1990, 10, 1)), "Nov"); assert.strictEqual(f(local(1990, 11, 1)), "Dec"); }); it("timeFormat(\"%B\")(date) formats months", () => { const f = timeFormat("%B"); assert.strictEqual(f(local(1990, 0, 1)), "January"); assert.strictEqual(f(local(1990, 1, 1)), "February"); assert.strictEqual(f(local(1990, 2, 1)), "March"); assert.strictEqual(f(local(1990, 3, 1)), "April"); assert.strictEqual(f(local(1990, 4, 1)), "May"); assert.strictEqual(f(local(1990, 5, 1)), "June"); assert.strictEqual(f(local(1990, 6, 1)), "July"); assert.strictEqual(f(local(1990, 7, 1)), "August"); assert.strictEqual(f(local(1990, 8, 1)), "September"); assert.strictEqual(f(local(1990, 9, 1)), "October"); assert.strictEqual(f(local(1990, 10, 1)), "November"); assert.strictEqual(f(local(1990, 11, 1)), "December"); }); it("timeFormat(\"%c\")(date) formats localized dates and times", () => { const f = timeFormat("%c"); assert.strictEqual(f(local(1990, 0, 1)), "1/1/1990, 12:00:00 AM"); }); it("timeFormat(\"%d\")(date) formats zero-padded dates", () => { const f = timeFormat("%d"); assert.strictEqual(f(local(1990, 0, 1)), "01"); }); it("timeFormat(\"%e\")(date) formats space-padded dates", () => { const f = timeFormat("%e"); assert.strictEqual(f(local(1990, 0, 1)), " 1"); }); it("timeFormat(\"%g\")(date) formats zero-padded two-digit ISO 8601 years", () => { const f = timeFormat("%g"); assert.strictEqual(f(local(2018, 11, 30, 0)), "18"); // Sunday assert.strictEqual(f(local(2018, 11, 31, 0)), "19"); // Monday assert.strictEqual(f(local(2019, 0, 1, 0)), "19"); }); it("timeFormat(\"%G\")(date) formats zero-padded four-digit ISO 8601 years", () => { const f = timeFormat("%G"); assert.strictEqual(f(local(2018, 11, 30, 0)), "2018"); // Sunday assert.strictEqual(f(local(2018, 11, 31, 0)), "2019"); // Monday assert.strictEqual(f(local(2019, 0, 1, 0)), "2019"); }); it("timeFormat(\"%H\")(date) formats zero-padded hours (24)", () => { const f = timeFormat("%H"); assert.strictEqual(f(local(1990, 0, 1, 0)), "00"); assert.strictEqual(f(local(1990, 0, 1, 13)), "13"); }); it("timeFormat(\"%I\")(date) formats zero-padded hours (12)", () => { const f = timeFormat("%I"); assert.strictEqual(f(local(1990, 0, 1, 0)), "12"); assert.strictEqual(f(local(1990, 0, 1, 13)), "01"); }); it("timeFormat(\"%j\")(date) formats zero-padded day of year numbers", () => { const f = timeFormat("%j"); assert.strictEqual(f(local(1990, 0, 1)), "001"); assert.strictEqual(f(local(1990, 5, 1)), "152"); assert.strictEqual(f(local(2010, 2, 13)), "072"); assert.strictEqual(f(local(2010, 2, 14)), "073"); // DST begins assert.strictEqual(f(local(2010, 2, 15)), "074"); assert.strictEqual(f(local(2010, 10, 6)), "310"); assert.strictEqual(f(local(2010, 10, 7)), "311"); // DST ends assert.strictEqual(f(local(2010, 10, 8)), "312"); }); it("timeFormat(\"%m\")(date) formats zero-padded months", () => { const f = timeFormat("%m"); assert.strictEqual(f(local(1990, 0, 1)), "01"); assert.strictEqual(f(local(1990, 9, 1)), "10"); }); it("timeFormat(\"%M\")(date) formats zero-padded minutes", () => { const f = timeFormat("%M"); assert.strictEqual(f(local(1990, 0, 1, 0, 0)), "00"); assert.strictEqual(f(local(1990, 0, 1, 0, 32)), "32"); }); it("timeFormat(\"%p\")(date) formats AM or PM", () => { const f = timeFormat("%p"); assert.strictEqual(f(local(1990, 0, 1, 0)), "AM"); assert.strictEqual(f(local(1990, 0, 1, 13)), "PM"); }); it("timeFormat(\"%q\")(date) formats quarters", () => { const f = timeFormat("%q"); assert.strictEqual(f(local(1990, 0, 1)), "1"); assert.strictEqual(f(local(1990, 3, 1)), "2"); assert.strictEqual(f(local(1990, 6, 1)), "3"); assert.strictEqual(f(local(1990, 9, 1)), "4"); }); it("timeFormat(\"%S\")(date) formats zero-padded seconds", () => { const f = timeFormat("%S"); assert.strictEqual(f(local(1990, 0, 1, 0, 0, 0)), "00"); assert.strictEqual(f(local(1990, 0, 1, 0, 0, 32)), "32"); const f2 = timeFormat("%0S"); assert.strictEqual(f2(local(1990, 0, 1, 0, 0, 0)), "00"); assert.strictEqual(f2(local(1990, 0, 1, 0, 0, 32)), "32"); }); it("timeFormat(\"%_S\")(date) formats space-padded seconds", () => { const f = timeFormat("%_S"); assert.strictEqual(f(local(1990, 0, 1, 0, 0, 0)), " 0"); assert.strictEqual(f(local(1990, 0, 1, 0, 0, 3)), " 3"); assert.strictEqual(f(local(1990, 0, 1, 0, 0, 32)), "32"); }); it("timeFormat(\"-S\")(date) formats no-padded seconds", () => { const f = timeFormat("%-S"); assert.strictEqual(f(local(1990, 0, 1, 0, 0, 0)), "0"); assert.strictEqual(f(local(1990, 0, 1, 0, 0, 3)), "3"); assert.strictEqual(f(local(1990, 0, 1, 0, 0, 32)), "32"); }); it("timeFormat(\"%L\")(date) formats zero-padded milliseconds", () => { const f = timeFormat("%L"); assert.strictEqual(f(local(1990, 0, 1, 0, 0, 0, 0)), "000"); assert.strictEqual(f(local(1990, 0, 1, 0, 0, 0, 432)), "432"); }); it("timeFormat(\"%u\")(date) formats week day numbers", () => { const f = timeFormat("%u"); assert.strictEqual(f(local(1990, 0, 1, 0)), "1"); assert.strictEqual(f(local(1990, 0, 7, 0)), "7"); assert.strictEqual(f(local(2010, 2, 13, 23)), "6"); }); it("timeFormat(\"%f\")(date) formats zero-padded microseconds", () => { const f = timeFormat("%f"); assert.strictEqual(f(local(1990, 0, 1, 0, 0, 0, 0)), "000000"); assert.strictEqual(f(local(1990, 0, 1, 0, 0, 0, 432)), "432000"); }); it("timeFormat(\"%U\")(date) formats zero-padded week numbers", () => { const f = timeFormat("%U"); assert.strictEqual(f(local(1990, 0, 1, 0)), "00"); assert.strictEqual(f(local(1990, 5, 1, 0)), "21"); assert.strictEqual(f(local(2010, 2, 13, 23)), "10"); assert.strictEqual(f(local(2010, 2, 14, 0)), "11"); // DST begins assert.strictEqual(f(local(2010, 2, 15, 0)), "11"); assert.strictEqual(f(local(2010, 10, 6, 23)), "44"); assert.strictEqual(f(local(2010, 10, 7, 0)), "45"); // DST ends assert.strictEqual(f(local(2010, 10, 8, 0)), "45"); assert.strictEqual(f(local(2012, 0, 1, 0)), "01"); // Sunday! }); it("timeFormat(\"%W\")(date) formats zero-padded week numbers", () => { const f = timeFormat("%W"); assert.strictEqual(f(local(1990, 0, 1, 0)), "01"); // Monday! assert.strictEqual(f(local(1990, 5, 1, 0)), "22"); assert.strictEqual(f(local(2010, 2, 15, 0)), "11"); assert.strictEqual(f(local(2010, 10, 8, 0)), "45"); }); it("timeFormat(\"%V\")(date) formats zero-padded ISO 8601 week numbers", () => { const f = timeFormat("%V"); assert.strictEqual(f(local(1990, 0, 1, 0)), "01"); assert.strictEqual(f(local(1990, 5, 1, 0)), "22"); assert.strictEqual(f(local(2010, 2, 13, 23)), "10"); assert.strictEqual(f(local(2010, 2, 14, 0)), "10"); // DST begins assert.strictEqual(f(local(2010, 2, 15, 0)), "11"); assert.strictEqual(f(local(2010, 10, 6, 23)), "44"); assert.strictEqual(f(local(2010, 10, 7, 0)), "44"); // DST ends assert.strictEqual(f(local(2010, 10, 8, 0)), "45"); assert.strictEqual(f(local(2015, 11, 31, 0)), "53"); assert.strictEqual(f(local(2016, 0, 1, 0)), "53"); }); it("timeFormat(\"%x\")(date) formats localized dates", () => { const f = timeFormat("%x"); assert.strictEqual(f(local(1990, 0, 1)), "1/1/1990"); assert.strictEqual(f(local(2010, 5, 1)), "6/1/2010"); }); it("timeFormat(\"%X\")(date) formats localized times", () => { const f = timeFormat("%X"); assert.strictEqual(f(local(1990, 0, 1, 0, 0, 0)), "12:00:00 AM"); assert.strictEqual(f(local(1990, 0, 1, 13, 34, 59)), "1:34:59 PM"); }); it("timeFormat(\"%y\")(date) formats zero-padded two-digit years", () => { const f = timeFormat("%y"); assert.strictEqual(f(local(+1990, 0, 1)), "90"); assert.strictEqual(f(local(+2002, 0, 1)), "02"); assert.strictEqual(f(local(-2, 0, 1)), "-02"); }); it("timeFormat(\"%Y\")(date) formats zero-padded four-digit years", () => { const f = timeFormat("%Y"); assert.strictEqual(f(local( 123, 0, 1)), "0123"); assert.strictEqual(f(local( 1990, 0, 1)), "1990"); assert.strictEqual(f(local( 2002, 0, 1)), "2002"); assert.strictEqual(f(local(10002, 0, 1)), "0002"); assert.strictEqual(f(local( -2, 0, 1)), "-0002"); }); it("timeFormat(\"%Z\")(date) formats time zones", () => { const f = timeFormat("%Z"); assert.strictEqual(f(local(1990, 0, 1)), "-0800"); }); it("timeFormat(\"%%\")(date) formats literal percent signs", () => { const f = timeFormat("%%"); assert.strictEqual(f(local(1990, 0, 1)), "%"); }); it("timeFormat(…) can be used to create a conditional multi-format", () => { assert.strictEqual(multi(local(1990, 0, 1, 0, 0, 0, 12)), ".012"); assert.strictEqual(multi(local(1990, 0, 1, 0, 0, 1, 0)), ":01"); assert.strictEqual(multi(local(1990, 0, 1, 0, 1, 0, 0)), "12:01"); assert.strictEqual(multi(local(1990, 0, 1, 1, 0, 0, 0)), "01 AM"); assert.strictEqual(multi(local(1990, 0, 2, 0, 0, 0, 0)), "Tue 02"); assert.strictEqual(multi(local(1990, 1, 1, 0, 0, 0, 0)), "February"); assert.strictEqual(multi(local(1990, 0, 1, 0, 0, 0, 0)), "1990"); }); ================================================ FILE: test/isoFormat-test.js ================================================ import assert from "assert"; import {isoFormat} from "../src/index.js"; import {utc} from "./date.js"; it("isoFormat(date) returns an ISO 8601 UTC string", () => { assert.strictEqual(isoFormat(utc(1990, 0, 1, 0, 0, 0)), "1990-01-01T00:00:00.000Z"); assert.strictEqual(isoFormat(utc(2011, 11, 31, 23, 59, 59)), "2011-12-31T23:59:59.000Z"); }); ================================================ FILE: test/isoParse-test.js ================================================ import assert from "assert"; import {isoParse} from "../src/index.js"; import {utc} from "./date.js"; it("isoParse as ISO 8601", () => { assert.deepStrictEqual(isoParse("1990-01-01T00:00:00.000Z"), utc(1990, 0, 1, 0, 0, 0)); assert.deepStrictEqual(isoParse("2011-12-31T23:59:59.000Z"), utc(2011, 11, 31, 23, 59, 59)); assert.strictEqual(isoParse("1990-01-01T00:00:00.000X"), null); }); ================================================ FILE: test/locale-test.js ================================================ import assert from "assert"; import {readdirSync, readFileSync} from "fs"; import {join} from "path"; import {timeFormatLocale} from "../src/index.js"; it("locale data is valid", () => { for (const localePath of readdirSync("locale")) { if (!/\.json$/i.test(localePath)) continue; const locale = JSON.parse(readFileSync(join("locale", localePath), "utf8")); assert.deepStrictEqual(Object.keys(locale).sort(), ["date", "dateTime", "days", "months", "periods", "shortDays", "shortMonths", "time"]); timeFormatLocale(locale); } }); ================================================ FILE: test/parse-test.js ================================================ import assert from "assert"; import {readFileSync} from "fs"; import {timeFormatLocale, timeParse} from "../src/index.js"; import {local} from "./date.js"; const fiFi = JSON.parse(readFileSync("./locale/fi-FI.json")); it("parse(string) coerces the specified string to a string", () => { const p = timeParse("%c"); assert.deepStrictEqual(p({toString: function() { return "1/1/1990, 12:00:00 AM"; }}), local(1990, 0, 1)); assert.deepStrictEqual(p({toString: function() { return "1/2/1990, 12:00:00 AM"; }}), local(1990, 0, 2)); assert.deepStrictEqual(p({toString: function() { return "1/3/1990, 12:00:00 AM"; }}), local(1990, 0, 3)); assert.deepStrictEqual(p({toString: function() { return "1/4/1990, 12:00:00 AM"; }}), local(1990, 0, 4)); assert.deepStrictEqual(p({toString: function() { return "1/5/1990, 12:00:00 AM"; }}), local(1990, 0, 5)); assert.deepStrictEqual(p({toString: function() { return "1/6/1990, 12:00:00 AM"; }}), local(1990, 0, 6)); assert.deepStrictEqual(p({toString: function() { return "1/7/1990, 12:00:00 AM"; }}), local(1990, 0, 7)); }); it("timeParse(specifier) coerces the specified specifier to a string", () => { const p = timeParse({toString: function() { return "%c"; }}); assert.deepStrictEqual(p("1/1/1990, 12:00:00 AM"), local(1990, 0, 1)); }); it("timeParse(\"%a %m/%d/%Y\")(date) parses abbreviated weekday and date", () => { const p = timeParse("%a %m/%d/%Y"); assert.deepStrictEqual(p("Sun 01/01/1990"), local(1990, 0, 1)); assert.deepStrictEqual(p("Wed 02/03/1991"), local(1991, 1, 3)); assert.strictEqual(p("XXX 03/10/2010"), null); }); it("timeParse(\"%A %m/%d/%Y\")(date) parses weekday and date", () => { const p = timeParse("%A %m/%d/%Y"); assert.deepStrictEqual(p("Sunday 01/01/1990"), local(1990, 0, 1)); assert.deepStrictEqual(p("Wednesday 02/03/1991"), local(1991, 1, 3)); assert.strictEqual(p("Caturday 03/10/2010"), null); }); it("timeParse(\"%U %Y\")(date) parses week number (Sunday) and year", () => { const p = timeParse("%U %Y"); assert.deepStrictEqual(p("00 1990"), local(1989, 11, 31)); assert.deepStrictEqual(p("05 1991"), local(1991, 1, 3)); assert.deepStrictEqual(p("01 1995"), local(1995, 0, 1)); }); it("timeParse(\"%a %U %Y\")(date) parses abbreviated weekday, week number (Sunday) and year", () => { const p = timeParse("%a %U %Y"); assert.deepStrictEqual(p("Mon 00 1990"), local(1990, 0, 1)); assert.deepStrictEqual(p("Sun 05 1991"), local(1991, 1, 3)); assert.deepStrictEqual(p("Sun 01 1995"), local(1995, 0, 1)); assert.strictEqual(p("XXX 03 2010"), null); }); it("timeParse(\"%A %U %Y\")(date) parses weekday, week number (Sunday) and year", () => { const p = timeParse("%A %U %Y"); assert.deepStrictEqual(p("Monday 00 1990"), local(1990, 0, 1)); assert.deepStrictEqual(p("Sunday 05 1991"), local(1991, 1, 3)); assert.deepStrictEqual(p("Sunday 01 1995"), local(1995, 0, 1)); assert.strictEqual(p("Caturday 03 2010"), null); }); it("timeParse(\"%w %U %Y\")(date) parses numeric weekday (Sunday), week number (Sunday) and year", () => { const p = timeParse("%w %U %Y"); assert.deepStrictEqual(p("1 00 1990"), local(1990, 0, 1)); assert.deepStrictEqual(p("0 05 1991"), local(1991, 1, 3)); assert.deepStrictEqual(p("0 01 1995"), local(1995, 0, 1)); assert.strictEqual(p("X 03 2010"), null); }); it("timeParse(\"%w %V %G\")(date) parses numeric weekday, week number (ISO) and corresponding year", () => { const p = timeParse("%w %V %G"); assert.deepStrictEqual(p("1 01 1990"), local(1990, 0, 1)); assert.deepStrictEqual(p("0 05 1991"), local(1991, 1, 3)); assert.deepStrictEqual(p("4 53 1992"), local(1992, 11, 31)); assert.deepStrictEqual(p("0 52 1994"), local(1995, 0, 1)); assert.deepStrictEqual(p("0 01 1995"), local(1995, 0, 8)); assert.deepStrictEqual(p("1 01 2018"), local(2018, 0, 1)); assert.deepStrictEqual(p("1 01 2019"), local(2018, 11, 31)); }); it("timeParse(\"%w %V %g\")(date) parses numeric weekday, week number (ISO) and corresponding two-digits year", () => { const p = timeParse("%w %V %g"); assert.deepStrictEqual(p("1 01 90"), local(1990, 0, 1)); assert.deepStrictEqual(p("0 05 91"), local(1991, 1, 3)); assert.deepStrictEqual(p("4 53 92"), local(1992, 11, 31)); assert.deepStrictEqual(p("0 52 94"), local(1995, 0, 1)); assert.deepStrictEqual(p("0 01 95"), local(1995, 0, 8)); assert.deepStrictEqual(p("1 01 18"), local(2018, 0, 1)); assert.deepStrictEqual(p("1 01 19"), local(2018, 11, 31)); }); it("timeParse(\"%V %g\")(date) parses week number (ISO) and corresponding two-digits year", () => { const p = timeParse("%V %g"); assert.deepStrictEqual(p("01 90"), local(1990, 0, 1)); assert.deepStrictEqual(p("05 91"), local(1991, 0, 28)); assert.deepStrictEqual(p("53 92"), local(1992, 11, 28)); assert.deepStrictEqual(p("52 94"), local(1994, 11, 26)); assert.deepStrictEqual(p("01 95"), local(1995, 0, 2)); assert.deepStrictEqual(p("01 18"), local(2018, 0, 1)); assert.deepStrictEqual(p("01 19"), local(2018, 11, 31)); }); it("timeParse(\"%u %U %Y\")(date) parses numeric weekday (Monday), week number (Monday) and year", () => { const p = timeParse("%u %W %Y"); assert.deepStrictEqual(p("1 00 1990"), local(1989, 11, 25)); assert.deepStrictEqual(p("1 01 1990"), local(1990, 0, 1)); assert.deepStrictEqual(p("1 05 1991"), local(1991, 1, 4)); assert.deepStrictEqual(p("7 00 1995"), local(1995, 0, 1)); assert.deepStrictEqual(p("1 01 1995"), local(1995, 0, 2)); assert.strictEqual(p("X 03 2010"), null); }); it("timeParse(\"%W %Y\")(date) parses week number (Monday) and year", () => { const p = timeParse("%W %Y"); assert.deepStrictEqual(p("01 1990"), local(1990, 0, 1)); assert.deepStrictEqual(p("04 1991"), local(1991, 0, 28)); assert.deepStrictEqual(p("00 1995"), local(1994, 11, 26)); }); it("timeParse(\"%a %W %Y\")(date) parses abbreviated weekday, week number (Monday) and year", () => { const p = timeParse("%a %W %Y"); assert.deepStrictEqual(p("Mon 01 1990"), local(1990, 0, 1)); assert.deepStrictEqual(p("Sun 04 1991"), local(1991, 1, 3)); assert.deepStrictEqual(p("Sun 00 1995"), local(1995, 0, 1)); assert.strictEqual(p("XXX 03 2010"), null); }); it("timeParse(\"%A %W %Y\")(date) parses weekday, week number (Monday) and year", () => { const p = timeParse("%A %W %Y"); assert.deepStrictEqual(p("Monday 01 1990"), local(1990, 0, 1)); assert.deepStrictEqual(p("Sunday 04 1991"), local(1991, 1, 3)); assert.deepStrictEqual(p("Sunday 00 1995"), local(1995, 0, 1)); assert.strictEqual(p("Caturday 03 2010"), null); }); it("timeParse(\"%w %W %Y\")(date) parses numeric weekday (Sunday), week number (Monday) and year", () => { const p = timeParse("%w %W %Y"); assert.deepStrictEqual(p("1 01 1990"), local(1990, 0, 1)); assert.deepStrictEqual(p("0 04 1991"), local(1991, 1, 3)); assert.deepStrictEqual(p("0 00 1995"), local(1995, 0, 1)); assert.strictEqual(p("X 03 2010"), null); }); it("timeParse(\"%u %W %Y\")(date) parses numeric weekday (Monday), week number (Monday) and year", () => { const p = timeParse("%u %W %Y"); assert.deepStrictEqual(p("1 01 1990"), local(1990, 0, 1)); assert.deepStrictEqual(p("7 04 1991"), local(1991, 1, 3)); assert.deepStrictEqual(p("7 00 1995"), local(1995, 0, 1)); assert.strictEqual(p("X 03 2010"), null); }); it("timeParse(\"%m/%d/%y\")(date) parses month, date and two-digit year", () => { const p = timeParse("%m/%d/%y"); assert.deepStrictEqual(p("02/03/69"), local(1969, 1, 3)); assert.deepStrictEqual(p("01/01/90"), local(1990, 0, 1)); assert.deepStrictEqual(p("02/03/91"), local(1991, 1, 3)); assert.deepStrictEqual(p("02/03/68"), local(2068, 1, 3)); assert.strictEqual(p("03/10/2010"), null); }); it("timeParse(\"%x\")(date) parses locale date", () => { const p = timeParse("%x"); assert.deepStrictEqual(p("1/1/1990"), local(1990, 0, 1)); assert.deepStrictEqual(p("2/3/1991"), local(1991, 1, 3)); assert.deepStrictEqual(p("3/10/2010"), local(2010, 2, 10)); }); it("timeParse(\"%b %d, %Y\")(date) parses abbreviated month, date and year", () => { const p = timeParse("%b %d, %Y"); assert.deepStrictEqual(p("jan 01, 1990"), local(1990, 0, 1)); assert.deepStrictEqual(p("feb 2, 2010"), local(2010, 1, 2)); assert.strictEqual(p("jan. 1, 1990"), null); }); it("timeParse(\"%B %d, %Y\")(date) parses month, date and year", () => { const p = timeParse("%B %d, %Y"); assert.deepStrictEqual(p("january 01, 1990"), local(1990, 0, 1)); assert.deepStrictEqual(p("February 2, 2010"), local(2010, 1, 2)); assert.strictEqual(p("jan 1, 1990"), null); }); it("timeParse(\"%j %m/%d/%Y\")(date) parses day of year and date", () => { const p = timeParse("%j %m/%d/%Y"); assert.deepStrictEqual(p("001 01/01/1990"), local(1990, 0, 1)); assert.deepStrictEqual(p("034 02/03/1991"), local(1991, 1, 3)); assert.strictEqual(p("2012 03/10/2010"), null); }); it("timeParse(\"%c\")(date) parses locale date and time", () => { const p = timeParse("%c"); assert.deepStrictEqual(p("1/1/1990, 12:00:00 AM"), local(1990, 0, 1)); }); it("timeParse(\"%H:%M:%S\")(date) parses twenty-four hour, minute and second", () => { const p = timeParse("%H:%M:%S"); assert.deepStrictEqual(p("00:00:00"), local(1900, 0, 1, 0, 0, 0)); assert.deepStrictEqual(p("11:59:59"), local(1900, 0, 1, 11, 59, 59)); assert.deepStrictEqual(p("12:00:00"), local(1900, 0, 1, 12, 0, 0)); assert.deepStrictEqual(p("12:00:01"), local(1900, 0, 1, 12, 0, 1)); assert.deepStrictEqual(p("23:59:59"), local(1900, 0, 1, 23, 59, 59)); }); it("timeParse(\"%X\")(date) parses locale time", () => { const p = timeParse("%X"); assert.deepStrictEqual(p("12:00:00 AM"), local(1900, 0, 1, 0, 0, 0)); assert.deepStrictEqual(p("11:59:59 AM"), local(1900, 0, 1, 11, 59, 59)); assert.deepStrictEqual(p("12:00:00 PM"), local(1900, 0, 1, 12, 0, 0)); assert.deepStrictEqual(p("12:00:01 PM"), local(1900, 0, 1, 12, 0, 1)); assert.deepStrictEqual(p("11:59:59 PM"), local(1900, 0, 1, 23, 59, 59)); }); it("timeParse(\"%L\")(date) parses milliseconds", () => { const p = timeParse("%L"); assert.deepStrictEqual(p("432"), local(1900, 0, 1, 0, 0, 0, 432)); }); it("timeParse(\"%f\")(date) parses microseconds", () => { const p = timeParse("%f"); assert.deepStrictEqual(p("432000"), local(1900, 0, 1, 0, 0, 0, 432)); }); it("timeParse(\"%I:%M:%S %p\")(date) parses twelve hour, minute and second", () => { const p = timeParse("%I:%M:%S %p"); assert.deepStrictEqual(p("12:00:00 am"), local(1900, 0, 1, 0, 0, 0)); assert.deepStrictEqual(p("11:59:59 AM"), local(1900, 0, 1, 11, 59, 59)); assert.deepStrictEqual(p("12:00:00 pm"), local(1900, 0, 1, 12, 0, 0)); assert.deepStrictEqual(p("12:00:01 pm"), local(1900, 0, 1, 12, 0, 1)); assert.deepStrictEqual(p("11:59:59 PM"), local(1900, 0, 1, 23, 59, 59)); }); it("timeParse(\"%I %p\")(date) parses period in non-English locales", () => { const p = timeFormatLocale(fiFi).parse("%I:%M:%S %p"); assert.deepStrictEqual(p("12:00:00 a.m."), local(1900, 0, 1, 0, 0, 0)); assert.deepStrictEqual(p("11:59:59 A.M."), local(1900, 0, 1, 11, 59, 59)); assert.deepStrictEqual(p("12:00:00 p.m."), local(1900, 0, 1, 12, 0, 0)); assert.deepStrictEqual(p("12:00:01 p.m."), local(1900, 0, 1, 12, 0, 1)); assert.deepStrictEqual(p("11:59:59 P.M."), local(1900, 0, 1, 23, 59, 59)); }); it("timeParse(\"%Y %q\")(date) parses quarters", () => { const p = timeParse("%Y %q"); assert.deepStrictEqual(p("1990 1"), local(1990, 0, 1)); assert.deepStrictEqual(p("1990 2"), local(1990, 3, 1)); assert.deepStrictEqual(p("1990 3"), local(1990, 6, 1)); assert.deepStrictEqual(p("1990 4"), local(1990, 9, 1)); }); it("timeParse(\"%Y %q %m\")(date) gives the month number priority", () => { const p = timeParse("%Y %q %m"); assert.deepStrictEqual(p("1990 1 2"), local(1990, 1, 1)); assert.deepStrictEqual(p("1990 2 5"), local(1990, 4, 1)); assert.deepStrictEqual(p("1990 3 8"), local(1990, 7, 1)); assert.deepStrictEqual(p("1990 4 9"), local(1990, 8, 1)); }); it("timeParse(\"%% %m/%d/%Y\")(date) parses literal %", () => { const p = timeParse("%% %m/%d/%Y"); assert.deepStrictEqual(p("% 01/01/1990"), local(1990, 0, 1)); assert.deepStrictEqual(p("% 02/03/1991"), local(1991, 1, 3)); assert.strictEqual(p("%% 03/10/2010"), null); }); it("timeParse(\"%m/%d/%Y %Z\")(date) parses timezone offset", () => { const p = timeParse("%m/%d/%Y %Z"); assert.deepStrictEqual(p("01/02/1990 +0000"), local(1990, 0, 1, 16)); assert.deepStrictEqual(p("01/02/1990 +0100"), local(1990, 0, 1, 15)); assert.deepStrictEqual(p("01/02/1990 +0130"), local(1990, 0, 1, 14, 30)); assert.deepStrictEqual(p("01/02/1990 -0100"), local(1990, 0, 1, 17)); assert.deepStrictEqual(p("01/02/1990 -0130"), local(1990, 0, 1, 17, 30)); assert.deepStrictEqual(p("01/02/1990 -0800"), local(1990, 0, 2, 0)); }); it("timeParse(\"%m/%d/%Y %Z\")(date) parses timezone offset in the form '+-hh:mm'", () => { const p = timeParse("%m/%d/%Y %Z"); assert.deepStrictEqual(p("01/02/1990 +01:30"), local(1990, 0, 1, 14, 30)); assert.deepStrictEqual(p("01/02/1990 -01:30"), local(1990, 0, 1, 17, 30)); }); it("timeParse(\"%m/%d/%Y %Z\")(date) parses timezone offset in the form '+-hh'", () => { const p = timeParse("%m/%d/%Y %Z"); assert.deepStrictEqual(p("01/02/1990 +01"), local(1990, 0, 1, 15)); assert.deepStrictEqual(p("01/02/1990 -01"), local(1990, 0, 1, 17)); }); it("timeParse(\"%m/%d/%Y %Z\")(date) parses timezone offset in the form 'Z'", () => { const p = timeParse("%m/%d/%Y %Z"); assert.deepStrictEqual(p("01/02/1990 Z"), local(1990, 0, 1, 16)); }); it("timeParse(\"%-m/%0d/%_Y\")(date) ignores optional padding modifier, skipping zeroes and spaces", () => { const p = timeParse("%-m/%0d/%_Y"); assert.deepStrictEqual(p("01/ 1/1990"), local(1990, 0, 1)); }); it("timeParse(\"%b %d, %Y\")(date) doesn't crash when given weird strings", () => { try { Object.prototype.foo = 10; const p = timeParse("%b %d, %Y"); assert.strictEqual(p("foo 1, 1990"), null); } finally { delete Object.prototype.foo; } }); ================================================ FILE: test/utcFormat-test.js ================================================ import assert from "assert"; import {utcSecond, utcMinute, utcHour, utcDay, utcMonth, utcWeek, utcYear} from "d3-time"; import {utcFormat} from "../src/index.js"; import {utc} from "./date.js"; const formatMillisecond = utcFormat(".%L"), formatSecond = utcFormat(":%S"), formatMinute = utcFormat("%I:%M"), formatHour = utcFormat("%I %p"), formatDay = utcFormat("%a %d"), formatWeek = utcFormat("%b %d"), formatMonth = utcFormat("%B"), formatYear = utcFormat("%Y"); function multi(d) { return (utcSecond(d) < d ? formatMillisecond : utcMinute(d) < d ? formatSecond : utcHour(d) < d ? formatMinute : utcDay(d) < d ? formatHour : utcMonth(d) < d ? (utcWeek(d) < d ? formatDay : formatWeek) : utcYear(d) < d ? formatMonth : formatYear)(d); } it("utcFormat(\"%a\")(date) formats abbreviated weekdays", () => { const f = utcFormat("%a"); assert.strictEqual(f(utc(1990, 0, 1)), "Mon"); assert.strictEqual(f(utc(1990, 0, 2)), "Tue"); assert.strictEqual(f(utc(1990, 0, 3)), "Wed"); assert.strictEqual(f(utc(1990, 0, 4)), "Thu"); assert.strictEqual(f(utc(1990, 0, 5)), "Fri"); assert.strictEqual(f(utc(1990, 0, 6)), "Sat"); assert.strictEqual(f(utc(1990, 0, 7)), "Sun"); }); it("utcFormat(\"%A\")(date) formats weekdays", () => { const f = utcFormat("%A"); assert.strictEqual(f(utc(1990, 0, 1)), "Monday"); assert.strictEqual(f(utc(1990, 0, 2)), "Tuesday"); assert.strictEqual(f(utc(1990, 0, 3)), "Wednesday"); assert.strictEqual(f(utc(1990, 0, 4)), "Thursday"); assert.strictEqual(f(utc(1990, 0, 5)), "Friday"); assert.strictEqual(f(utc(1990, 0, 6)), "Saturday"); assert.strictEqual(f(utc(1990, 0, 7)), "Sunday"); }); it("utcFormat(\"%b\")(date) formats abbreviated months", () => { const f = utcFormat("%b"); assert.strictEqual(f(utc(1990, 0, 1)), "Jan"); assert.strictEqual(f(utc(1990, 1, 1)), "Feb"); assert.strictEqual(f(utc(1990, 2, 1)), "Mar"); assert.strictEqual(f(utc(1990, 3, 1)), "Apr"); assert.strictEqual(f(utc(1990, 4, 1)), "May"); assert.strictEqual(f(utc(1990, 5, 1)), "Jun"); assert.strictEqual(f(utc(1990, 6, 1)), "Jul"); assert.strictEqual(f(utc(1990, 7, 1)), "Aug"); assert.strictEqual(f(utc(1990, 8, 1)), "Sep"); assert.strictEqual(f(utc(1990, 9, 1)), "Oct"); assert.strictEqual(f(utc(1990, 10, 1)), "Nov"); assert.strictEqual(f(utc(1990, 11, 1)), "Dec"); }); it("utcFormat(\"%B\")(date) formats months", () => { const f = utcFormat("%B"); assert.strictEqual(f(utc(1990, 0, 1)), "January"); assert.strictEqual(f(utc(1990, 1, 1)), "February"); assert.strictEqual(f(utc(1990, 2, 1)), "March"); assert.strictEqual(f(utc(1990, 3, 1)), "April"); assert.strictEqual(f(utc(1990, 4, 1)), "May"); assert.strictEqual(f(utc(1990, 5, 1)), "June"); assert.strictEqual(f(utc(1990, 6, 1)), "July"); assert.strictEqual(f(utc(1990, 7, 1)), "August"); assert.strictEqual(f(utc(1990, 8, 1)), "September"); assert.strictEqual(f(utc(1990, 9, 1)), "October"); assert.strictEqual(f(utc(1990, 10, 1)), "November"); assert.strictEqual(f(utc(1990, 11, 1)), "December"); }); it("utcFormat(\"%c\")(date) formats localized dates and times", () => { const f = utcFormat("%c"); assert.strictEqual(f(utc(1990, 0, 1)), "1/1/1990, 12:00:00 AM"); }); it("utcFormat(\"%d\")(date) formats zero-padded dates", () => { const f = utcFormat("%d"); assert.strictEqual(f(utc(1990, 0, 1)), "01"); }); it("utcFormat(\"%e\")(date) formats space-padded dates", () => { const f = utcFormat("%e"); assert.strictEqual(f(utc(1990, 0, 1)), " 1"); }); it("timeFormat(\"%g\")(date) formats zero-padded two-digit ISO 8601 years", () => { const f = utcFormat("%g"); assert.strictEqual(f(utc(2018, 11, 30, 0)), "18"); // Sunday assert.strictEqual(f(utc(2018, 11, 31, 0)), "19"); // Monday assert.strictEqual(f(utc(2019, 0, 1, 0)), "19"); }); it("utcFormat(\"%G\")(date) formats zero-padded four-digit ISO 8601 years", () => { const f = utcFormat("%G"); assert.strictEqual(f(utc(2018, 11, 30, 0)), "2018"); // Sunday assert.strictEqual(f(utc(2018, 11, 31, 0)), "2019"); // Monday assert.strictEqual(f(utc(2019, 0, 1, 0)), "2019"); }); it("utcFormat(\"%H\")(date) formats zero-padded hours (24)", () => { const f = utcFormat("%H"); assert.strictEqual(f(utc(1990, 0, 1, 0)), "00"); assert.strictEqual(f(utc(1990, 0, 1, 13)), "13"); }); it("utcFormat(\"%I\")(date) formats zero-padded hours (12)", () => { const f = utcFormat("%I"); assert.strictEqual(f(utc(1990, 0, 1, 0)), "12"); assert.strictEqual(f(utc(1990, 0, 1, 13)), "01"); }); it("utcFormat(\"%j\")(date) formats zero-padded day of year numbers", () => { const f = utcFormat("%j"); assert.strictEqual(f(utc(1990, 0, 1)), "001"); assert.strictEqual(f(utc(1990, 5, 1)), "152"); assert.strictEqual(f(utc(2010, 2, 13)), "072"); assert.strictEqual(f(utc(2010, 2, 14)), "073"); // DST begins assert.strictEqual(f(utc(2010, 2, 15)), "074"); assert.strictEqual(f(utc(2010, 10, 6)), "310"); assert.strictEqual(f(utc(2010, 10, 7)), "311"); // DST ends assert.strictEqual(f(utc(2010, 10, 8)), "312"); }); it("utcFormat(\"%m\")(date) formats zero-padded months", () => { const f = utcFormat("%m"); assert.strictEqual(f(utc(1990, 0, 1)), "01"); assert.strictEqual(f(utc(1990, 9, 1)), "10"); }); it("utcFormat(\"%M\")(date) formats zero-padded minutes", () => { const f = utcFormat("%M"); assert.strictEqual(f(utc(1990, 0, 1, 0, 0)), "00"); assert.strictEqual(f(utc(1990, 0, 1, 0, 32)), "32"); }); it("utcFormat(\"%p\")(date) formats AM or PM", () => { const f = utcFormat("%p"); assert.strictEqual(f(utc(1990, 0, 1, 0)), "AM"); assert.strictEqual(f(utc(1990, 0, 1, 13)), "PM"); }); it("utcFormat(\"%q\")(date) formats quarters", () => { const f = utcFormat("%q"); assert.strictEqual(f(utc(1990, 0, 1)), "1"); assert.strictEqual(f(utc(1990, 3, 1)), "2"); assert.strictEqual(f(utc(1990, 6, 1)), "3"); assert.strictEqual(f(utc(1990, 9, 1)), "4"); }); it("utcFormat(\"%Q\")(date) formats UNIX timestamps", () => { const f = utcFormat("%Q"); assert.strictEqual(f(utc(1970, 0, 1, 0, 0, 0)), "0"); assert.strictEqual(f(utc(1990, 0, 1, 0, 0, 0)), "631152000000"); assert.strictEqual(f(utc(1990, 0, 1, 12, 34, 56)), "631197296000"); }); it("utcFormat(\"%s\")(date) formats UNIX timetamps in seconds", () => { const f = utcFormat("%s"); assert.strictEqual(f(utc(1970, 0, 1, 0, 0, 0)), "0"); assert.strictEqual(f(utc(1990, 0, 1, 0, 0, 0)), "631152000"); assert.strictEqual(f(utc(1990, 0, 1, 12, 34, 56)), "631197296"); }); it("utcFormat(\"%s.%L\")(date) formats UNIX timetamps in seconds and milliseconds", () => { const f = utcFormat("%s.%L"); assert.strictEqual(f(utc(1990, 0, 1, 0, 0, 0, 123)), "631152000.123"); assert.strictEqual(f(utc(1990, 0, 1, 12, 34, 56, 789)), "631197296.789"); }); it("utcFormat(\"%s.%f\")(date) formats UNIX timetamps in seconds and microseconds", () => { const f = utcFormat("%s.%f"); assert.strictEqual(f(utc(1990, 0, 1, 0, 0, 0, 123)), "631152000.123000"); assert.strictEqual(f(utc(1990, 0, 1, 12, 34, 56, 789)), "631197296.789000"); }); it("utcFormat(\"%S\")(date) formats zero-padded seconds", () => { const f = utcFormat("%S"); assert.strictEqual(f(utc(1990, 0, 1, 0, 0, 0)), "00"); assert.strictEqual(f(utc(1990, 0, 1, 0, 0, 32)), "32"); const f2 = utcFormat("%0S"); assert.strictEqual(f2(utc(1990, 0, 1, 0, 0, 0)), "00"); assert.strictEqual(f2(utc(1990, 0, 1, 0, 0, 32)), "32"); }); it("utcFormat(\"%_S\")(date) formats space-padded seconds", () => { const f = utcFormat("%_S"); assert.strictEqual(f(utc(1990, 0, 1, 0, 0, 0)), " 0"); assert.strictEqual(f(utc(1990, 0, 1, 0, 0, 3)), " 3"); assert.strictEqual(f(utc(1990, 0, 1, 0, 0, 32)), "32"); }); it("utcFormat(\"-S\")(date) formats no-padded seconds", () => { const f = utcFormat("%-S"); assert.strictEqual(f(utc(1990, 0, 1, 0, 0, 0)), "0"); assert.strictEqual(f(utc(1990, 0, 1, 0, 0, 3)), "3"); assert.strictEqual(f(utc(1990, 0, 1, 0, 0, 32)), "32"); }); it("utcFormat(\"%L\")(date) formats zero-padded milliseconds", () => { const f = utcFormat("%L"); assert.strictEqual(f(utc(1990, 0, 1, 0, 0, 0, 0)), "000"); assert.strictEqual(f(utc(1990, 0, 1, 0, 0, 0, 432)), "432"); }); it("utcFormat(\"%u\")(date) formats week day numbers", () => { const f = utcFormat("%u"); assert.strictEqual(f(utc(1990, 0, 1, 0)), "1"); assert.strictEqual(f(utc(1990, 0, 7, 0)), "7"); assert.strictEqual(f(utc(2010, 2, 13, 23)), "6"); }); it("utcFormat(\"%f\")(date) formats zero-padded microseconds", () => { const f = utcFormat("%f"); assert.strictEqual(f(utc(1990, 0, 1, 0, 0, 0, 0)), "000000"); assert.strictEqual(f(utc(1990, 0, 1, 0, 0, 0, 432)), "432000"); }); it("utcFormat(\"%U\")(date) formats zero-padded week numbers", () => { const f = utcFormat("%U"); assert.strictEqual(f(utc(1990, 0, 1, 0)), "00"); assert.strictEqual(f(utc(1990, 5, 1, 0)), "21"); assert.strictEqual(f(utc(2010, 2, 13, 23)), "10"); assert.strictEqual(f(utc(2010, 2, 14, 0)), "11"); // DST begins assert.strictEqual(f(utc(2010, 2, 15, 0)), "11"); assert.strictEqual(f(utc(2010, 10, 6, 23)), "44"); assert.strictEqual(f(utc(2010, 10, 7, 0)), "45"); // DST ends assert.strictEqual(f(utc(2010, 10, 8, 0)), "45"); assert.strictEqual(f(utc(2012, 0, 1, 0)), "01"); // Sunday! }); it("utcFormat(\"%W\")(date) formats zero-padded week numbers", () => { const f = utcFormat("%W"); assert.strictEqual(f(utc(1990, 0, 1, 0)), "01"); // Monday! assert.strictEqual(f(utc(1990, 5, 1, 0)), "22"); assert.strictEqual(f(utc(2010, 2, 15, 0)), "11"); assert.strictEqual(f(utc(2010, 10, 8, 0)), "45"); }); it("utcFormat(\"%V\")(date) formats zero-padded ISO 8601 week numbers", () => { const f = utcFormat("%V"); assert.strictEqual(f(utc(1990, 0, 1, 0)), "01"); assert.strictEqual(f(utc(1990, 5, 1, 0)), "22"); assert.strictEqual(f(utc(2010, 2, 13, 23)), "10"); assert.strictEqual(f(utc(2010, 2, 14, 0)), "10"); // DST begins assert.strictEqual(f(utc(2010, 2, 15, 0)), "11"); assert.strictEqual(f(utc(2010, 10, 6, 23)), "44"); assert.strictEqual(f(utc(2010, 10, 7, 0)), "44"); // DST ends assert.strictEqual(f(utc(2010, 10, 8, 0)), "45"); assert.strictEqual(f(utc(2015, 11, 31, 0)), "53"); assert.strictEqual(f(utc(2016, 0, 1, 0)), "53"); }); it("utcFormat(\"%x\")(date) formats localized dates", () => { const f = utcFormat("%x"); assert.strictEqual(f(utc(1990, 0, 1)), "1/1/1990"); assert.strictEqual(f(utc(2010, 5, 1)), "6/1/2010"); }); it("utcFormat(\"%X\")(date) formats localized times", () => { const f = utcFormat("%X"); assert.strictEqual(f(utc(1990, 0, 1, 0, 0, 0)), "12:00:00 AM"); assert.strictEqual(f(utc(1990, 0, 1, 13, 34, 59)), "1:34:59 PM"); }); it("utcFormat(\"%y\")(date) formats zero-padded two-digit years", () => { const f = utcFormat("%y"); assert.strictEqual(f(utc(+1990, 0, 1)), "90"); assert.strictEqual(f(utc(+2002, 0, 1)), "02"); assert.strictEqual(f(utc(-2, 0, 1)), "-02"); }); it("utcFormat(\"%Y\")(date) formats zero-padded four-digit years", () => { const f = utcFormat("%Y"); assert.strictEqual(f(utc( 123, 0, 1)), "0123"); assert.strictEqual(f(utc( 1990, 0, 1)), "1990"); assert.strictEqual(f(utc( 2002, 0, 1)), "2002"); assert.strictEqual(f(utc(10002, 0, 1)), "0002"); assert.strictEqual(f(utc( -2, 0, 1)), "-0002"); }); it("utcFormat(\"%Z\")(date) formats time zones", () => { const f = utcFormat("%Z"); assert.strictEqual(f(utc(1990, 0, 1)), "+0000"); }); it("utcFormat(\"%%\")(date) formats literal percent signs", () => { const f = utcFormat("%%"); assert.strictEqual(f(utc(1990, 0, 1)), "%"); }); it("utcFormat(…) can be used to create a conditional multi-format", () => { assert.strictEqual(multi(utc(1990, 0, 1, 0, 0, 0, 12)), ".012"); assert.strictEqual(multi(utc(1990, 0, 1, 0, 0, 1, 0)), ":01"); assert.strictEqual(multi(utc(1990, 0, 1, 0, 1, 0, 0)), "12:01"); assert.strictEqual(multi(utc(1990, 0, 1, 1, 0, 0, 0)), "01 AM"); assert.strictEqual(multi(utc(1990, 0, 2, 0, 0, 0, 0)), "Tue 02"); assert.strictEqual(multi(utc(1990, 1, 1, 0, 0, 0, 0)), "February"); assert.strictEqual(multi(utc(1990, 0, 1, 0, 0, 0, 0)), "1990"); }); ================================================ FILE: test/utcParse-test.js ================================================ import assert from "assert"; import {utcParse} from "../src/index.js"; import {local, utc} from "./date.js"; it("utcParse(specifier) coerces the specified specifier to a string", () => { const p = utcParse({toString: function() { return "%c"; }}); assert.deepStrictEqual(p("1/1/1990, 12:00:00 AM"), utc(1990, 0, 1)); }); it("utcParse(\"\")(date) parses abbreviated weekday and numeric date", () => { const p = utcParse("%a %m/%d/%Y"); assert.deepStrictEqual(p("Sun 01/01/1990"), utc(1990, 0, 1)); assert.deepStrictEqual(p("Wed 02/03/1991"), utc(1991, 1, 3)); assert.strictEqual(p("XXX 03/10/2010"), null); }); it("utcParse(\"\")(date) parses weekday and numeric date", () => { const p = utcParse("%A %m/%d/%Y"); assert.deepStrictEqual(p("Sunday 01/01/1990"), utc(1990, 0, 1)); assert.deepStrictEqual(p("Wednesday 02/03/1991"), utc(1991, 1, 3)); assert.strictEqual(p("Caturday 03/10/2010"), null); }); it("utcParse(\"\")(date) parses numeric date", () => { const p = utcParse("%m/%d/%y"); assert.deepStrictEqual(p("01/01/90"), utc(1990, 0, 1)); assert.deepStrictEqual(p("02/03/91"), utc(1991, 1, 3)); assert.strictEqual(p("03/10/2010"), null); }); it("utcParse(\"\")(date) parses locale date", () => { const p = utcParse("%x"); assert.deepStrictEqual(p("01/01/1990"), utc(1990, 0, 1)); assert.deepStrictEqual(p("02/03/1991"), utc(1991, 1, 3)); assert.deepStrictEqual(p("03/10/2010"), utc(2010, 2, 10)); }); it("utcParse(\"\")(date) parses abbreviated month, date and year", () => { const p = utcParse("%b %d, %Y"); assert.deepStrictEqual(p("jan 01, 1990"), utc(1990, 0, 1)); assert.deepStrictEqual(p("feb 2, 2010"), utc(2010, 1, 2)); assert.strictEqual(p("jan. 1, 1990"), null); }); it("utcParse(\"\")(date) parses month, date and year", () => { const p = utcParse("%B %d, %Y"); assert.deepStrictEqual(p("january 01, 1990"), utc(1990, 0, 1)); assert.deepStrictEqual(p("February 2, 2010"), utc(2010, 1, 2)); assert.strictEqual(p("jan 1, 1990"), null); }); it("utcParse(\"\")(date) parses locale date and time", () => { const p = utcParse("%c"); assert.deepStrictEqual(p("1/1/1990, 12:00:00 AM"), utc(1990, 0, 1)); }); it("utcParse(\"\")(date) parses twenty-four hour, minute and second", () => { const p = utcParse("%H:%M:%S"); assert.deepStrictEqual(p("00:00:00"), utc(1900, 0, 1, 0, 0, 0)); assert.deepStrictEqual(p("11:59:59"), utc(1900, 0, 1, 11, 59, 59)); assert.deepStrictEqual(p("12:00:00"), utc(1900, 0, 1, 12, 0, 0)); assert.deepStrictEqual(p("12:00:01"), utc(1900, 0, 1, 12, 0, 1)); assert.deepStrictEqual(p("23:59:59"), utc(1900, 0, 1, 23, 59, 59)); }); it("utcParse(\"\")(date) parses locale time", () => { const p = utcParse("%X"); assert.deepStrictEqual(p("12:00:00 AM"), utc(1900, 0, 1, 0, 0, 0)); assert.deepStrictEqual(p("11:59:59 AM"), utc(1900, 0, 1, 11, 59, 59)); assert.deepStrictEqual(p("12:00:00 PM"), utc(1900, 0, 1, 12, 0, 0)); assert.deepStrictEqual(p("12:00:01 PM"), utc(1900, 0, 1, 12, 0, 1)); assert.deepStrictEqual(p("11:59:59 PM"), utc(1900, 0, 1, 23, 59, 59)); }); it("utcParse(\"%L\")(date) parses milliseconds", () => { const p = utcParse("%L"); assert.deepStrictEqual(p("432"), utc(1900, 0, 1, 0, 0, 0, 432)); }); it("utcParse(\"%f\")(date) parses microseconds", () => { const p = utcParse("%f"); assert.deepStrictEqual(p("432000"), utc(1900, 0, 1, 0, 0, 0, 432)); }); it("utcParse(\"\")(date) parses twelve hour, minute and second", () => { const p = utcParse("%I:%M:%S %p"); assert.deepStrictEqual(p("12:00:00 am"), utc(1900, 0, 1, 0, 0, 0)); assert.deepStrictEqual(p("11:59:59 AM"), utc(1900, 0, 1, 11, 59, 59)); assert.deepStrictEqual(p("12:00:00 pm"), utc(1900, 0, 1, 12, 0, 0)); assert.deepStrictEqual(p("12:00:01 pm"), utc(1900, 0, 1, 12, 0, 1)); assert.deepStrictEqual(p("11:59:59 PM"), utc(1900, 0, 1, 23, 59, 59)); }); it("utcParse(\"\")(date) parses timezone offset", () => { const p = utcParse("%m/%d/%Y %Z"); assert.deepStrictEqual(p("01/02/1990 +0000"), utc(1990, 0, 2)); assert.deepStrictEqual(p("01/02/1990 +0100"), utc(1990, 0, 1, 23)); assert.deepStrictEqual(p("01/02/1990 -0100"), utc(1990, 0, 2, 1)); assert.deepStrictEqual(p("01/02/1990 -0800"), local(1990, 0, 2)); }); it("utcParse(\"\")(date) parses timezone offset (in the form '+-hh:mm')", () => { const p = utcParse("%m/%d/%Y %Z"); assert.deepStrictEqual(p("01/02/1990 +01:30"), utc(1990, 0, 1, 22, 30)); assert.deepStrictEqual(p("01/02/1990 -01:30"), utc(1990, 0, 2, 1, 30)); }); it("utcParse(\"\")(date) parses timezone offset (in the form '+-hh')", () => { const p = utcParse("%m/%d/%Y %Z"); assert.deepStrictEqual(p("01/02/1990 +01"), utc(1990, 0, 1, 23)); assert.deepStrictEqual(p("01/02/1990 -01"), utc(1990, 0, 2, 1)); }); it("utcParse(\"\")(date) parses timezone offset (in the form 'Z')", () => { const p = utcParse("%m/%d/%Y %Z"); assert.deepStrictEqual(p("01/02/1990 Z"), utc(1990, 0, 2)); }); it("utcParse(\"%Y %U %w\")(date) handles a year that starts on Sunday", () => { const p = utcParse("%Y %U %w"); assert.deepStrictEqual(p("2012 01 0"), utc(2012, 0, 1)); }); it("utcParse(\"%w %V %Y\")(date) parses numeric weekday, week number (ISO) and year", () => { const p = utcParse("%w %V %Y"); assert.deepStrictEqual(p("1 01 1990"), utc(1990, 0, 1)); assert.deepStrictEqual(p("0 05 1991"), utc(1991, 1, 3)); assert.deepStrictEqual(p("4 53 1992"), utc(1992, 11, 31)); assert.deepStrictEqual(p("0 52 1994"), utc(1995, 0, 1)); assert.deepStrictEqual(p("0 01 1995"), utc(1995, 0, 8)); assert.strictEqual(p("X 03 2010"), null); }); it("utcParse(\"%w %V %G\")(date) parses numeric weekday, week number (ISO) and corresponding year", () => { const p = utcParse("%w %V %G"); assert.deepStrictEqual(p("1 01 1990"), utc(1990, 0, 1)); assert.deepStrictEqual(p("0 05 1991"), utc(1991, 1, 3)); assert.deepStrictEqual(p("4 53 1992"), utc(1992, 11, 31)); assert.deepStrictEqual(p("0 52 1994"), utc(1995, 0, 1)); assert.deepStrictEqual(p("0 01 1995"), utc(1995, 0, 8)); assert.deepStrictEqual(p("1 01 2018"), utc(2018, 0, 1)); assert.deepStrictEqual(p("1 01 2019"), utc(2018, 11, 31)); assert.strictEqual(p("X 03 2010"), null); }); it("utcParse(\"%V %Y\")(date) week number (ISO) and year", () => { const p = utcParse("%V %Y"); assert.deepStrictEqual(p("01 1990"), utc(1990, 0, 1)); assert.deepStrictEqual(p("05 1991"), utc(1991, 0, 28)); assert.deepStrictEqual(p("53 1992"), utc(1992, 11, 28)); assert.deepStrictEqual(p("01 1993"), utc(1993, 0, 4)); assert.deepStrictEqual(p("01 1995"), utc(1995, 0, 2)); assert.deepStrictEqual(p("00 1995"), null); assert.deepStrictEqual(p("54 1995"), null); assert.deepStrictEqual(p("X 1995"), null); }); it("utcParse(\"%V %g\")(date) week number (ISO) and corresponding two-digits year", () => { const p = utcParse("%V %g"); assert.deepStrictEqual(p("01 90"), utc(1990, 0, 1)); assert.deepStrictEqual(p("05 91"), utc(1991, 0, 28)); assert.deepStrictEqual(p("53 92"), utc(1992, 11, 28)); assert.deepStrictEqual(p("01 93"), utc(1993, 0, 4)); assert.deepStrictEqual(p("01 95"), utc(1995, 0, 2)); assert.deepStrictEqual(p("01 18"), utc(2018, 0, 1)); assert.deepStrictEqual(p("01 19"), utc(2018, 11, 31)); assert.deepStrictEqual(p("00 95"), null); assert.deepStrictEqual(p("54 95"), null); assert.deepStrictEqual(p("X 95"), null); }); it("utcParse(\"%V %G\")(date) week number (ISO) and corresponding year", () => { const p = utcParse("%V %G"); assert.deepStrictEqual(p("01 1990"), utc(1990, 0, 1)); assert.deepStrictEqual(p("05 1991"), utc(1991, 0, 28)); assert.deepStrictEqual(p("53 1992"), utc(1992, 11, 28)); assert.deepStrictEqual(p("01 1993"), utc(1993, 0, 4)); assert.deepStrictEqual(p("01 1995"), utc(1995, 0, 2)); assert.deepStrictEqual(p("01 2018"), utc(2018, 0, 1)); assert.deepStrictEqual(p("01 2019"), utc(2018, 11, 31)); assert.deepStrictEqual(p("00 1995"), null); assert.deepStrictEqual(p("54 1995"), null); assert.deepStrictEqual(p("X 1995"), null); }); it("utcParse(\"%Q\")(date) parses UNIX timestamps", () => { const p = utcParse("%Q"); assert.deepStrictEqual(p("0"), utc(1970, 0, 1)); assert.deepStrictEqual(p("631152000000"), utc(1990, 0, 1)); }); it("utcParse(\"%s\")(date) parses UNIX timestamps in seconds", () => { const p = utcParse("%s"); assert.deepStrictEqual(p("0"), utc(1970, 0, 1)); assert.deepStrictEqual(p("631152000"), utc(1990, 0, 1)); }); it("utcParse(\"%s.%L\")(date) parses UNIX timetamps in seconds and milliseconds", () => { const p = utcParse("%s.%L"); assert.deepStrictEqual(p("631152000.123"), utc(1990, 0, 1, 0, 0, 0, 123)); assert.deepStrictEqual(p("631197296.789"), utc(1990, 0, 1, 12, 34, 56, 789)); }); it("utcParse(\"%s.%f\")(date) parses UNIX timetamps in seconds and microseconds", () => { const p = utcParse("%s.%f"); assert.deepStrictEqual(p("631152000.123000"), utc(1990, 0, 1, 0, 0, 0, 123)); assert.deepStrictEqual(p("631197296.789000"), utc(1990, 0, 1, 12, 34, 56, 789)); });