Compare commits

..

216 commits
v0.3.0 ... main

Author SHA1 Message Date
f2d5290d28
Add 0dependencies.dev badge 2024-10-31 11:55:20 -07:00
8db2211a2f
Update minified assets 2024-06-11 17:02:47 -07:00
774e3ce102
Update contributors and copyright year 2024-06-11 17:02:16 -07:00
e61895af6c
Add changelog and bump versions to 0.10.3 (#90) 2024-06-11 16:58:56 -07:00
8a335897ae
Merge pull request #91 from samsonjs/fix/88-chinese-months
Fix Chinese months
2024-06-11 16:56:46 -07:00
db1c066f13
Fix Chinese months
Change as described by @mogando668, closes #88
2024-06-11 16:55:58 -07:00
6cf7d59a46
Merge pull request #89 from samsonjs/87-using-let-requires-es6-since-v0102
Stop using `let`, closes #87
2024-05-28 12:17:07 -07:00
53e26ba77d
Stop using let, closes #87 2024-05-28 12:16:26 -07:00
a0a62db076
Release v0.10.2 2023-05-24 21:05:07 -07:00
52753479c8
Tweak code style and minify 2023-05-24 21:02:03 -07:00
67c02b5352
Merge pull request #86 from aryan-debug/master
Fixed issue #84
2023-05-24 08:28:05 -07:00
aryan-debug
b50d512dee Fixed issue #84 2023-05-21 22:14:09 -07:00
aryan-debug
6157e8a650 Fixed test case for %c 2023-05-21 21:53:03 -07:00
aryan-debug
51a6ade03d Fixed issue #84 2023-04-17 01:54:01 -07:00
93aaf1eac6 Add locale identifier to example in readme 2021-12-12 10:53:40 -08:00
12088240fc Fix npm shield version 2021-12-12 10:51:05 -08:00
3af75444e1 Add Yusuke Kawasaki @kawanet to contributors 2021-12-12 10:48:47 -08:00
1bee290ce5 v0.10.1 2021-12-12 10:43:22 -08:00
dee584fda4 Improve support for v8's Date.toString time zone 2021-12-12 10:43:07 -08:00
5a1db7ba03 Update copyright and link in package.json 2021-12-12 10:41:47 -08:00
000143999d Fix order of expected and actual values in assertions 2021-12-12 10:40:45 -08:00
ce80bc39e3
Merge pull request #83 from douglasep/master
fix it_IT shortMonths locale
2021-12-11 23:37:33 -08:00
Douglas E. Pereira
e0780d045f fix it_IT shortMonths locale 2021-11-29 22:34:47 -03:00
08a9a4b738
Merge pull request #77 from kawanet/issue/76
re #76: X: equivalent to %r in en_US
2017-12-04 16:53:43 -08:00
Yusuke Kawasaki
06107d286a re #76: X: equivalent to %r in en_US 2017-11-27 16:29:03 +09:00
8a06a30115
add keywords to package.json 2017-03-10 09:55:10 -08:00
52720f64f5
link the changelog from readme 2016-12-28 12:29:34 -08:00
d3a2095ca3
fix a typo 2016-12-28 12:27:42 -08:00
793ecfb7b4 v0.10.0 2016-12-28 12:21:09 -08:00
0fd891c2ab update minified code 2016-12-28 12:09:55 -08:00
5e674f0a17 alphabetize contributors and update the list in package.json 2016-12-28 12:02:06 -08:00
3ed3100018 remove deprecated API, closes #55 2016-12-28 11:58:09 -08:00
c4967d51e0 fix tests broken by changes to the default locale format 2016-12-28 11:57:36 -08:00
fd648f7f19 document bundled locales and how to use them 2016-12-28 11:44:27 -08:00
efcd086585 update contributors 2016-12-28 11:33:04 -08:00
2375b9732f add en_CA and zh_CN locales 2016-12-28 11:33:00 -08:00
335ef2ebe8 warn when trying to use a non-existent locale 2016-12-28 11:23:33 -08:00
1e41e85146 fix a bug with ordinal localization fallback 2016-12-28 11:23:19 -08:00
e571efe7bb fix indentation and capitalize Locales constant 2016-12-28 11:23:08 -08:00
71737c8004 Merge pull request #70 from iFixit/master
Localizations
2016-12-28 11:02:58 -08:00
a54410d663
allow localizing ordinals 2016-12-28 10:44:44 -08:00
f6c88d0629
fix dates crossing DST boundaries for UTC, closes #71 2016-12-28 10:32:43 -08:00
02586fa41e
update minified code 2016-12-27 11:03:29 -08:00
4c747ffa2a
update contributors and copyrights 2016-12-27 11:03:09 -08:00
b4e57a851e Merge pull request #68 from Kevin-Jin/patch-1
Pass through unrecognized directives
2016-12-27 10:58:05 -08:00
2294caa44b
add a comment about mis-detecting DateJS dates as locales 2016-12-27 10:57:37 -08:00
65aa4d5ea9 Merge pull request #69 from stiang/master
Make strftime play nice with dates that have been extended by DateJS
2016-12-27 10:52:20 -08:00
Alexandr Nikitin
f8e5b11c9b Merge pull request #72 from IOAyman/patch-1
Added yarn install cmd
2016-12-08 15:58:33 +02:00
Ayman Nedjmeddine
82a8bfae79 Added yarn install cmd 2016-12-05 21:58:44 +01:00
Andrew Pirondini
fc16548517 Merge pull request #3 from iFixit/fix-typo-in-portuguese-locale
Fix typo in Portuguese locale
2016-10-03 11:11:59 -07:00
Andrew Pirondini
0d0f90f7eb Fix typo in Portuguese locale 2016-10-03 10:12:53 -07:00
b1629fa333 add badges to readme 2016-09-06 18:26:12 -07:00
Stian Grytøyr
84bad921ab Make strftime play nice with dates that have been extended by DateJS 2015-12-31 01:25:55 +01:00
Kevin Jin
f5bb098221 Consistency with existing code
Add test for unrecognized directives to test.js.
Add braces around if statement.
2015-10-02 21:39:02 -04:00
Kevin Jin
58f5c3fee8 Support literal percent sign
By the spec for strftime(3), '%%' in the format string should be replaced with '%' in the resultString.
2015-09-27 11:03:32 -04:00
Kevin Jin
72a2f418c8 Pass through unrecognized directives
For compatibility with strftime() on Unix, preserve the percent sign for unrecognized directives when appending to resultString.
2015-09-27 10:41:58 -04:00
a133ab1a4e fix readme example output, closes #66 2015-08-30 16:44:18 -07:00
Andrew Pirondini
b0659a5f78 Add definitions for nine locales.
This adds the definitions for nine locales in the strftime file. It also
provides a function for getting a strftime localized by the locale
identifier.
2015-08-05 14:07:57 -07:00
Andrew Pirondini
870e4e3771 Merge pull request #1 from iFixit/update-strftime-for-localization
Update strftime for localization
2015-07-20 11:41:11 -07:00
d6f6e74351 fix example code 2015-06-11 09:53:06 -07:00
b852daca88 v0.9.2 2015-05-29 17:52:48 -07:00
93326a4d73 fix cached timestamps, closes #63 2015-05-29 17:45:20 -07:00
a213d716a6 Merge pull request #62 from pdehaan/patch-1
Update license attribute
2015-05-23 17:04:18 -07:00
Peter deHaan
29111d3bbb Update license attribute
specifying the type and URL is deprecated:

https://docs.npmjs.com/files/package.json#license
http://npm1k.org/
2015-05-23 16:08:48 -07:00
8adfd97924 Merge pull request #60 from samsonjs/test-times
always use GMT to construct times in tests
2015-03-31 17:52:36 -07:00
48d143eb90 always use GMT to construct times in tests 2015-03-29 14:16:12 -07:00
fe2892ebfa Merge pull request #59 from samsonjs/Issue56_BugInWeekNumber
Fixes #56 (Bug in %U)
2015-03-29 13:26:50 -07:00
Alexandr Nikitin
aee0e19edc Revert "Revert "Fixes #56 (Bug in %U)""
This reverts commit ab3d4a052e.
2015-03-29 11:38:17 +03:00
22ddd8982f Merge pull request #58 from samsonjs/revert-57-Issue56_BugInWeekNumber
Revert "Fixes #56 (Bug in %U)"
2015-03-26 14:56:35 -07:00
ab3d4a052e Revert "Fixes #56 (Bug in %U)" 2015-03-26 14:44:26 -07:00
603a716bf8 Merge pull request #57 from alexandrnikitin/Issue56_BugInWeekNumber
Fixes #56 (Bug in %U)
2015-03-26 14:35:46 -07:00
Alexandr Nikitin
067ae77ad9 Fix day number calculation taking DST into account
Based on the SO answer http://stackoverflow.com/a/15289883/974487
2015-03-26 21:43:57 +02:00
Alexandr Nikitin
002ac8ca4c Add field report tests for bug in %U in #56 2015-03-26 21:40:46 +02:00
1d4365f3d5 try to fix syntax highlighting on GitHub 2015-03-16 18:07:52 -07:00
30fd95dbba vapourize some stray semicolons 2015-03-16 18:02:54 -07:00
8ba1f03a71 warn about possible misuse of %:: or %::: modifiers 2015-03-16 18:02:34 -07:00
dcc5d54c1b v0.9.1 2015-03-16 17:48:04 -07:00
765f3f1946 minify 2015-03-16 17:48:04 -07:00
4676d05afe add a changelog 2015-03-16 17:47:11 -07:00
437beabe43 add missing contributors to readme & package.json 2015-03-16 17:33:08 -07:00
7b1151c7c0 re-fix issue #38 which was lost in the v0.9 merge 2015-03-16 17:32:56 -07:00
4dcc655477 minify 2015-03-15 17:02:08 -07:00
f4a2c852c3 readme formatting and improved deprecation warnings 2015-03-15 16:57:35 -07:00
affbd8e1cd improve backwards compatibility, fix a couple bugs 2015-03-15 16:45:59 -07:00
543e81ca83 add install instructions for bower and component 2015-03-15 16:19:27 -07:00
e6b696cabd minify 2015-03-15 15:46:07 -07:00
1403c1e6a6 don't ignore browsers in the readme 2015-03-15 15:46:07 -07:00
c6464d0130 make the CommonJS / Node export backwards compatible
also improves deprecation notices
2015-03-15 15:38:16 -07:00
bfe34d92b5 polyfill Date.now for old browsers 2015-03-15 15:20:32 -07:00
23cd5feb98 code formatting / nitpicks 2015-03-15 15:20:31 -07:00
6bf19b4454 remove test directory 2015-03-05 18:29:15 -08:00
ff9b94b3d9 minify & update bower.json 2015-03-05 17:02:53 -08:00
e3cfa8c497 Merge pull request #42 from samsonjs/v0.9
v0.9 rewrite - all about API and performance
2015-03-05 16:59:05 -08:00
e631d81206 Merge branch 'master' into v0.9
Conflicts:
	component.json
	package.json
2015-03-05 16:55:51 -08:00
49568677a7 v0.8.4 2015-03-05 16:51:05 -08:00
c029f7a79e Merge branch 'master' into v0.9
Conflicts:
	strftime.js
	test/test.js
2015-03-05 16:49:32 -08:00
d69f82854a Merge pull request #50 from cheslip/master
added support for extended offset format
2015-03-05 16:35:08 -08:00
Cory Heslip
1222467e47 added tests and updated docs 2015-03-04 17:18:19 -07:00
Cory Heslip
4de2693e51 added support for extended offset format 2015-03-04 16:50:39 -07:00
9146f45142 Merge pull request #48 from alexandrnikitin/Issue47_UtcConversionDoesntWorkCorrectly
(Fixes #47) Fix conversion of date to UTC
2015-03-04 13:43:55 -08:00
Alexandr Nikitin
05c64ef5fb Merge pull request #1 from samsonjs/utc-year
correct fuzzy interpretation of old years by new Date()
2015-03-04 23:43:12 +02:00
f7799a1d21 correct fuzzy interpretation of old years by new Date() 2015-03-04 09:14:58 -08:00
Alexandr Nikitin
b0a4d5a84a Fix conversion of date to UTC
Method based on one of SO answers: http://stackoverflow.com/questions/948532/how-do-you-convert-a-javascript-date-to-utc
2015-03-03 12:26:23 +02:00
9e191bf5c6 ignore test directory in bower.json 2015-02-08 20:44:15 -08:00
14ad6dc902 release v0.8.3 for bower 2015-02-08 20:42:58 -08:00
603326eaed code style and copyright 2015-02-07 20:59:15 -08:00
6bc6888fff add support for %c, %x, and %X (closes #43)
based on @alexandrnikitin's commit here: f25c89bb0f
2015-02-07 20:59:15 -08:00
e16f49f4c0 update readme for 0.9 API 2015-02-07 20:59:15 -08:00
6ab81c89cb code style 2015-02-07 20:59:15 -08:00
f1581a3c9d bump version to 0.9.0 2015-02-07 20:59:14 -08:00
f521749967 add @alexandrnikitin to contributors 2015-02-07 20:58:54 -08:00
f36819ad99 merge V2 code and deprecate the old API 2015-02-07 20:58:53 -08:00
Alexandr Nikitin
016223fac4 Added optimized version 2015-02-07 20:57:56 -08:00
50c183b509 add bower.json, closes #45 2015-02-07 20:56:13 -08:00
c4c5c8d7b5 minify v0.8.2 2014-08-08 17:09:54 -07:00
9923253790 v0.8.2 2014-08-08 16:58:49 -07:00
687ad1ec1e correctly pad %e with a leading space, fixes #44 2014-08-08 16:58:24 -07:00
df17fc85c9 v0.8.1 2014-06-17 11:18:01 -07:00
50a267bf23 Merge pull request #40 from alexandrnikitin/Issue39_BugInPartialHourTimezone
Fix for #39 bug in partial hour timezones
2014-06-17 11:16:41 -07:00
Alexandr Nikitin
dfeb3f8e97 Fix for #39 (Bug when specify partial hour timezone)
Changed calculation of timezone offset in minutes
Added round and abs for partial hour
2014-06-17 18:21:29 +04:00
Alexandr Nikitin
eedbb8b701 Added a failing test for #39 (Bug when specify partial hour timezone) 2014-06-17 18:19:13 +04:00
90ec02de2c cosmetic changes to tests 2014-05-24 18:09:41 -07:00
cc0bf35fc1 Merge pull request #38 from w0den/patch-1
Improve detection of timezone name
2014-05-24 18:08:34 -07:00
w0den
9ea642274c Improve detection of timezone name
Timezone name can contain contain spaces (ex. "GTB Daylight Time" or "Pacific Daylight Time") this is why we should use [\w\s+] instead of \w.
2014-05-21 16:34:35 +03:00
f3bed1d081 Merge pull request #35 from d48/update-usage
update usage for examples using Y for century
2014-03-26 11:38:40 -07:00
Ryan Regalado
a40f44d2d3 update usage for examples using Y for century 2014-03-26 10:52:11 -07:00
e130c268d4 v0.8.0 2014-01-29 14:45:53 -08:00
41df57b773 minify 2014-01-29 14:44:35 -08:00
78733ba108 make test-minified depend on minify task 2014-01-29 14:44:29 -08:00
0652b285a7 test for string timezones, fix a bug 2014-01-29 14:42:35 -08:00
99382d2d5e allow string timezone offsets of the form [-+]HHMM, closes #33 2014-01-29 14:35:39 -08:00
61f6193e57 add an example of each format specifier inline in the code 2013-11-19 19:17:30 -08:00
0052ee0a0e don't assume PST/PDT when TZ is empty 2013-11-19 18:55:28 -08:00
d74f3ef64d v0.7.0 2013-11-08 18:05:51 -08:00
af7a530b6d Merge branch 'timezones' 2013-11-08 18:04:56 -08:00
303667d059 fix Readme error 2013-10-14 18:50:09 -07:00
1633e4007c add support for passing in timezones 2013-10-14 18:43:00 -07:00
6912b47d59 v0.6.2 2013-08-29 09:55:53 -07:00
24ba42b128 export strftimeUTC and localizedStrftime properly in browsers, closes #27 2013-08-29 09:55:25 -07:00
992062064c update component.json 2013-06-13 13:06:37 -07:00
71e53e7a57 v0.6.1 2013-06-13 13:05:33 -07:00
10dc00040e RequiredDateMethods is not supposed to be global, fixes #26 2013-06-13 13:04:50 -07:00
89d187c473 v0.6.0 2013-05-15 16:34:17 -07:00
088600d67f implement %o to get the day of the month as an ordinal 2013-05-15 16:34:06 -07:00
Sami Samhuri
e02de2786d update minified code 2013-04-07 20:19:40 -07:00
Sami Samhuri
1a649cee74 v0.5.2 2013-04-07 20:18:02 -07:00
Sami Samhuri
2e6443f394 actually pad day of year for %j, closes #22 2013-04-07 20:14:08 -07:00
Sami Samhuri
a3ef8f712a fix up package.json 2013-03-13 20:14:03 -07:00
Sami Samhuri
71d3468fd1 update copyright and license stuff 2013-03-07 22:58:53 -08:00
Sami Samhuri
f005928d33 test minified script for good measure 2013-03-07 20:00:28 -08:00
Sami Samhuri
2796149127 add minified version to the repo 2013-03-07 19:56:03 -08:00
Sami Samhuri
8791c074cc move lib/index.js to strftime.js 2013-03-07 19:55:51 -08:00
Sami Samhuri
e18c7abf88 update readme to mention %- %_ and %0 2013-03-07 19:48:50 -08:00
Sami Samhuri
71af5de2e3 support Ruby extensions: %- %_ and %0 (closes #18) 2013-03-07 19:43:57 -08:00
Sami Samhuri
a5e2d305db 0.5.1 2013-03-07 10:31:42 -08:00
Sami Samhuri
8565e692a1 don't check for Date instances, just required methods 2013-03-07 10:31:42 -08:00
Sami Samhuri
403504a494 fix %z for timezones greater than GMT 2013-03-07 10:31:42 -08:00
Sami Samhuri
b38a331c1a add node_modules to gitignore 2013-03-07 10:31:42 -08:00
5a051ac15c Merge pull request #20 from jzwinck/patch-1
Readme: add examples using specific dates instead of "now"
2013-03-02 10:44:50 -08:00
John Zwinck
163efa1964 Readme: add examples using specific dates instead of "now" 2013-03-02 09:14:11 +08:00
Sami Samhuri
4bcd6d2a2f minor changes to tests 2013-01-05 16:04:12 -05:00
Sami Samhuri
d75c4eb415 make test.js executable, add shebang line 2013-01-05 15:58:47 -05:00
Sami Samhuri
a21ff6140b update copyright notice 2013-01-05 15:58:47 -05:00
Sami Samhuri
17f7d5bb2c flesh out readme with descriptions of each specifier 2013-01-05 15:58:47 -05:00
Sami Samhuri
d7418223fd make %C pad the century, like C 2013-01-05 15:58:47 -05:00
Sami Samhuri
e761363a45 fix alphabetization of specifiers 2013-01-05 15:58:47 -05:00
Sami Samhuri
b9a29d1643 add a makefile 2013-01-05 15:58:47 -05:00
Sami Samhuri
71195bba88 remove deprecated getLocalizedStrftime alias 2013-01-05 15:58:47 -05:00
Sami Samhuri
64e4ed4834 update component.json for v0.5 2013-01-05 10:56:18 -05:00
Sami Samhuri
2d63ed7564 0.5.0 2013-01-05 10:54:19 -05:00
Sami Samhuri
551bf4b5ad implement week numbers: %U and %W, closes #16 2013-01-05 10:52:45 -05:00
Sami Samhuri
5db99eec35 Merge pull request #14 from ForbesLindesay/patch-1
component.json wasn't valid JSON
2012-12-04 15:12:33 -08:00
Forbes Lindesay
36cd2e950d This wasn't valid JSON 2012-12-04 14:18:03 +00:00
Sami Samhuri
81a418573c Merge pull request #13 from component/master
add component support
2012-11-30 00:44:28 -08:00
TJ Holowaychuk
adb5bab532 add component.json 2012-11-28 14:27:42 -08:00
Sami Samhuri
57f3088876 v0.4.8 2012-11-13 16:11:00 -08:00
Sami Samhuri
f3aab9fa10 update contributors 2012-11-13 16:10:55 -08:00
Sami Samhuri
4643912213 fix %b format fall through, test new %j and %C specifiers 2012-11-13 16:06:40 -08:00
Sami Samhuri
dae086e2cf Merge pull request #12 from ryanstafford/master
Support for day of year (%j) and century (%C)
2012-11-13 16:04:41 -08:00
Ryan Stafford
3262e038f6 Added %j and %C 2012-11-13 07:04:42 -05:00
Sami Samhuri
c785724655 0.4.7 2012-06-08 16:26:16 -07:00
Sami Samhuri
23e349341d Add contributors to Readme & package.json 2012-06-08 16:26:16 -07:00
Sami Samhuri
c93f523951 Export strftime directly in Node, as module.exports, closes #10 2012-06-08 16:26:12 -07:00
Sami Samhuri
b51b106177 Merge pull request #11 from visionmedia/patch-1
Added component support in package.json
2012-06-08 15:51:13 -07:00
TJ Holowaychuk
7479e192eb Added component support 2012-06-08 15:26:31 -07:00
Sami Samhuri
3d6a02bde2 add tests for lowercase am/pm via %P 2012-05-21 14:40:35 -07:00
Sami Samhuri
e4a2a3d32a Merge pull request #9 from robcolburn/master
strftime() offers lowercase am/pm via %P
2012-05-21 14:38:57 -07:00
Rob Colburn
ca6ca41766 Added lower-case p 2012-05-21 14:30:02 -07:00
Sami Samhuri
f3006f479a version 0.4.6 2011-06-13 23:05:30 -07:00
Sami Samhuri
f7e89bd758 test locales, s/getLocalizedStrftime/localizedStrftime/ 2011-06-13 23:05:25 -07:00
Sami Samhuri
2d20f265de version 0.4.5 2011-06-08 01:02:20 -07:00
Sami Samhuri
1ee97604bb update recursive calls to strftime, fix indentation 2011-06-08 01:02:10 -07:00
Sami Samhuri
70445ffc9a fix sign of %z, indentation 2011-06-08 01:00:35 -07:00
Sami Samhuri
2349fcd6d3 moar test coverage 2011-06-08 00:57:02 -07:00
Sami Samhuri
4b9672b953 version 0.4.4 2011-06-07 19:25:37 -07:00
Sami Samhuri
0bb759d406 combine pad functions, test a couple branches of pad 2011-06-07 19:15:19 -07:00
Sami Samhuri
607d1f075a s/coffee/java/g 2011-06-07 18:49:59 -07:00
Sami Samhuri
565021eb94 add gitignore 2011-06-07 18:28:09 -07:00
Sami Samhuri
2fab7fce1e version 0.4.3 2011-06-07 18:27:55 -07:00
Sami Samhuri
09b7e60581 Merge pull request #8 from andrewschaaf/master
Tests, fixes, features
2011-06-07 18:26:58 -07:00
Andrew Schaaf
314603eefe fix strftimeUTC("%s") (closes #7) 2011-06-07 15:22:00 -04:00
Andrew Schaaf
c5362e748c add %L for 3-digit milliseconds 2011-06-07 15:18:33 -04:00
Andrew Schaaf
2644ab016a %s: seconds, not ms (closes #6) 2011-06-07 15:11:57 -04:00
Andrew Schaaf
644bb65577 add some tests 2011-06-07 15:09:19 -04:00
Sami Samhuri
86e8bbf431 version 0.4.2 2011-06-05 16:47:32 -07:00
Sami Samhuri
cd4d2a3ec5 refactor, support exporting to global scope in ES5 strict mode 2011-06-05 16:47:32 -07:00
Andrew Schaaf
200dc2ef5e add strftimeUTC 2011-06-03 07:51:43 -04:00
Sami Samhuri
de4256a985 version 0.4.1 2011-06-02 11:46:39 -07:00
Sami Samhuri
65605e536f update package.json 2011-06-02 11:46:33 -07:00
Sami Samhuri
0a3d8532d3 fix %y for years outside [1900, 2099], closes #2 2011-06-02 11:45:39 -07:00
Sami Samhuri
f1cbcf100d bump version to 0.4.0 2011-04-28 18:29:50 -07:00
Sami Samhuri
507fadf8ca fix formats 2011-04-28 18:29:41 -07:00
Sami Samhuri
da0563dda7 update readme 2011-04-28 18:29:22 -07:00
Sami Samhuri
7a807339ce cleanup & comments 2011-03-03 19:18:29 -08:00
Sami Samhuri
157a85e8c2 use a locale object instead of a l10n function and localize formats 2011-03-03 19:16:09 -08:00
Sami Samhuri
3ed3282d23 first stab at supporting localization 2011-03-03 07:03:30 -08:00
13 changed files with 1748 additions and 130 deletions

2
.gitignore vendored Normal file
View file

@ -0,0 +1,2 @@
*.tmproj
node_modules

294
Changelog.md Normal file
View file

@ -0,0 +1,294 @@
v0.10.3 on 2024-06-11
---------------------
- Stop using `let` to avoid breaking backwards compatibility with ES5. Thanks to [Maximilian Herold](https://github.com/mherold) for the report #87
- Drop '份' suffix from Chinese month names. Thanks to [@mogando668](https://github.com/mogando668) for the report #88
v0.10.2 on 2023-05-24
---------------------
- Fix test case for %c in current versions of node.js
- Fix %-y so it omits the leading zero
Thanks to [Aryan Arora](https://github.com/aryan-debug) for both fixes!
v0.10.1 on 2021-12-12
---------------------
- Fix it_IT shortMonths locale
Thanks to [Douglas de Espindola](https://github.com/douglasep)
- Try to get a short time zone name for %Z, falling back to the long one. This attempts to work around a change to Date.toString in v8 (node v10+, Chrome 66+). Unfortunately sometimes Date.toLocaleString returns a time zone like GMT+2 and we fall back to the long name in that case.
v0.10.0 on 2016-12-28
---------------------
- Remove the old API deprecated in v0.9.
- Bundle some locales that you can use with `strftime.localizeByIdentifier('nl_NL')`. Full list available in the [readme](https://github.com/samsonjs/strftime/blob/master/Readme.md).
Thanks to [Andrew Pirondini](https://github.com/andrewjpiro) of [iFixit](https://ifixit.com)
- Add instructions to install with Yarn.
Thanks to [Ayman Nedjmeddine](https://github.com/IOAyman)
- Unrecognized format specifiers preserve the % sign, e.g. `strftime('%K') => "%K"`.
Thanks to [Kevin Jin](https://github.com/Kevin-Jin)
- Make `strftime` work with dates that have been extended by [DateJS](http://www.datejs.com).
Thanks to [Stian Grytøyr](https://github.com/stiang)
- Add instructions to install with Yarn.
Thanks to [Ayman Nedjmeddine](https://github.com/IOAyman)
- Fix UTC formatting of dates that cross a DST boundary.
Thanks to [ray007](https://github.com/ray007)
- Allow localizing ordinals.
Thanks to [Simon Liétar](https://github.com/Sim9760)
v0.9.2 on 2015-05-29
--------------------
- fix a caching bug, which was a regression in 0.9.0 ([issue #63](https://github.com/samsonjs/strftime/issues/63))
- update license attribute in package.json as required by npm
Thanks to [Peter deHaan](https://github.com/pdehaan)
- construct GMT times used in tests in a more robust way
- fix a bug calculating week numbers ([issue #56](https://github.com/samsonjs/strftime/issues/56))
Thanks to [Alexandr Nikitin](https://github.com/alexandrnikitin)
- warn about possible misuse of %:: or %::: modifiers
v0.9.1 on 2015-03-16
--------------------
- re-fix [issue #38](https://github.com/samsonjs/strftime/pull/38) which was lost in the v0.9 merge
- add this changelog
v0.9.0 on 2015-03-15
--------------------
This release marks the final run up to v1.0, which should be released by March 2016.
The headline feature is a huge performance boost resulting from [this contest](http://hola.org/challenge_js). [Alexandr Nikitin](https://github.com/alexandrnikitin) has essentially [rewritten](https://github.com/samsonjs/strftime/pull/41) the code and [the results](http://jsperf.com/strftime-optimization/2) speak for themselves.
Along with this the API has been unified and cleaned up. `strftimeTZ`, `strftimeUTC`, and `localizedStrftime` have all been deprecated in favour of the following functions: `timezone(tz)`, `utc()`, and `localize(locale)`. You use them like so:
```JavaScript
var strftime = require('strftime'); // not required in web browsers
var strftimeIT = strftime.localize(anItalianLocale);
var strftimePST = strftime.timezone('-0800');
var strftimeUTC = strftime.utc();
// You can combine them
var strftimeIT_PST = strftimeIT.timezone('-0800');
// And chain them all at once
var strftimeIT_PST = strftime.localize(anItalianLocale).timezone('-0800');
```
The previous API is deprecated and will be removed for v1.0. The good news is that the previous API is supported by adapting the new API, so you get most of the performance benefits before you even update your code to use the new API.
The new API does not support passing in a custom timezone or locale on each call to `strftime`. This is a regression so if you really need this use case [let us know](https://github.com/samsonjs/strftime/issues/new) and we'll figure something out.
Thanks to all contributors that have helped to improve this library over the past 4 years.
v0.8.4 on 2015-03-05
--------------------
- fix conversion of dates to UTC
Thanks to [Alexandr Nikitin](https://github.com/alexandrnikitin)
- extend `%z` with a colon separator in timezone offsets, `"[+-]HH:MM"`
Thanks to [Cory Heslip](https://github.com/cheslip)
- ignore irrelevant files in bower.json
v0.8.3 on 2015-02-08
--------------------
First release for [Bower](http://bower.io), and only released for Bower.
v0.8.2 on 2014-08-08
--------------------
- fix `%e` which is supposed to be padded with a space
v0.8.1 on 2014-06-17
--------------------
- fix `%Z` when the timezone contains spaces
Thanks to [w0den](https://github.com/w0den)
- fix examples using `%Y` in the readme
Thanks to [Ryan Regalado](https://github.com/d48)
- fix a bug when specifying minutes in the timezone
Thanks to [Alexandr Nikitin](https://github.com/alexandrnikitin)
v0.8.0 on 2014-01-29
--------------------
- allow timezones to be specified as strings of the form `"+0100"` or `"-0800"` (`[+-]HHMM`)
- fix a bug running tests where the environment variable `TZ` is empty and the system timezone is not PST/PDT
v0.7.0 on 2013-11-08
--------------------
- add support for passing in explicit timezones with `strftimeTZ` which accepts numeric offsets from GMT, in minutes
v0.6.2 on 2013-08-29
--------------------
- expose `strftimeUTC` and `localizedStrftime` properly in browsers
v0.6.1 on 2013-06-13
--------------------
- fix a bug where `RequiredDateMethods` was created as a global
v0.6.0 on 2013-05-15
--------------------
- add `%o` to get the day of the month as an ordinal (in English)
v0.5.2 on 2013-04-07
--------------------
- add some Ruby extension prefixes: `-`, `_`, and `0`, and they work like so:
`strftime('%-d') // => "7"`
`strftime('%_d') // => " 7"`
`strftime('%0d') // => "07"`
- fix padding the day-of-year in `%j`
- add a minified version of the code to the repo for easy distribution with some package managers
v0.5.1 on 2013-03-07
--------------------
- remove deprecated `getLocalizedStrftime` function
- make `%C` pad the century with spaces, like C
- list all supported specifiers in the readme, it's no longer fair to say "look at `man 3 strftime`"
- use fixed dates in the readme instead of "now", so people can execute the examples and see the same results
Thanks to [John Zwinck](https://github.com/jzwinck)
- fix `%z` for timezones greater than GMT
- support any `Date`-like objects instead of checking for actual instances of `Date`
v0.5.0 on 2013-01-05
--------------------
- add week numbers `%U` and `%W`
- add support for [component](https://github.com/componentjs/component)
Thanks to [TJ Holowaychuk](https://github.com/tj)
v0.4.8 on 2012-11-13
--------------------
- add `%j` and `%C`, thanks to [Ryan Stafford](https://github.com/ryanstafford)
v0.4.7 on 2012-06-08
--------------------
- add `%P` which is "am" or "pm", like `%p` but lowercase
(this makes no sense, and I am sorry for propagating this madness)
Thanks to [Rob Colburn](https://github.com/robcolburn)
- export the `strftime` function directly in [node](https://nodejs.org) so you can write `strftime = require('strftime')` instead of `strftime = require('strftime').strftime`
- added contributors to the readme and package.json
v0.4.6 on 2011-06-13
--------------------
- rename `getLocalizedStrftime(locale)` to `localizedStrftime(locale)`
The old name is deprecated and will stick around until v0.5 or v0.6.
- add tests for locales
v0.4.5 on 2011-06-08
--------------------
- fix the sign of `%z`, which is something like "+0100" or "-0800" (`[+-]HHMM`)
- improve test coverage
v0.4.4 on 2011-06-07
--------------------
- fix `%L` for values < 100
- convert tests from CoffeeScript to JavaScript
(nothing personal, just keeping the dependencies trim)
v0.4.3 on 2011-06-05
--------------------
This release was all [Andrew Schaaf](https://github.com/andrewschaaf).
- add some tests
- fix `%s` which is seconds since the Unix epoch, but was in milliseconds
- add `%L` for 3-digit milliseconds
v0.4.2 on 2011-06-05
--------------------
- add `strftimeUTC` for ignoring timezones
Thanks to [Andrew Schaaf](https://github.com/andrewschaaf)
- support exporting to the top level object in ES5 strict mode
v0.4.1 on 2011-06-02
--------------------
- fix `%y` for years outside the range [1900, 2099]
v0.4.0 on 2011-04-28
--------------------
- add support for localization
v0.3.0 on 2010-12-17
--------------------
- fix export for browsers
v0.2.3 on 2010-12-15
--------------------
- set required [node](https://nodejs.org) version to 0.2 instead of 0.3 in package.json
v0.2.2 on 2010-11-14
--------------------
- fix module export
v0.2.1 on 2010-11-11
--------------------
- bug fix for recursive formats
v0.2.0 on 2010-11-11
--------------------
- use `String.prototype.replace` instead of a `for` loop
v0.1.0 on 2010-11-11
--------------------
Initial release.

18
LICENSE
View file

@ -1,18 +0,0 @@
Copyright 2010 Sami Samhuri. All rights reserved.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to
deal in the Software without restriction, including without limitation the
rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
sell copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
IN THE SOFTWARE.

15
Makefile Normal file
View file

@ -0,0 +1,15 @@
minify: real-minify test-minified
real-minify: strftime.js
rm -f strftime-min.js
closure-compiler <strftime.js >|strftime-min.js
test:
TZ=America/Vancouver node test.js
TZ=Europe/Amsterdam node test.js
test-minified: minify
TZ=America/Vancouver node test.js ./strftime-min.js
TZ=Europe/Amsterdam node test.js ./strftime-min.js
.PHONY: test test-minified

200
Readme.md
View file

@ -1,26 +1,212 @@
strftime
========
strftime for JavaScript
strftime for JavaScript. Works in (at least) node.js and browsers. Supports localization and timezones. Most standard specifiers from C are supported as well as some other extensions from Ruby.
[![version 0.10.3 on npm](https://img.shields.io/badge/npm-0.10.3-brightgreen.svg?style=flat)](https://www.npmjs.com/package/strftime)
[![node version 0.2 and up](https://img.shields.io/badge/node->=0.2-brightgreen.svg?style=flat)](https://nodejs.org)
[![MIT License](https://img.shields.io/badge/License-MIT-blue.svg?style=flat)](https://sjs.mit-license.org)
[![0 dependencies!](https://0dependencies.dev/0dependencies.svg)](https://0dependencies.dev)
Installation
============
npm install strftime
[node](https://nodejs.org):
npm install strftime
[bower](http://bower.io):
bower install strftime
[component](https://github.com/componentjs/component):
component install samsonjs/strftime
[yarn](https://yarnpkg.com):
yarn add strftime
Or you can copy [strftime.js](https://github.com/samsonjs/strftime/blob/master/strftime.js) wherever you want to use it, whether that's with a &lt;script&gt; tag or `require` or anything else.
Changelog
=========
[View the changelog](https://github.com/samsonjs/strftime/blob/master/Changelog.md).
Usage
=====
var strftime = require('strftime').strftime
console.log(strftime('%d-%m-%y %H:%M:%S')) // => 11-11-2010 13:24:17
```JavaScript
var strftime = require('strftime') // not required in browsers
console.log(strftime('%B %d, %Y %H:%M:%S')) // => April 28, 2011 18:21:08
console.log(strftime('%F %T', new Date(1307472705067))) // => 2011-06-07 18:51:45
```
For details just see `man 3 strftime` as the format specifiers are identical.
If you want to localize it:
```JavaScript
var strftime = require('strftime') // not required in browsers
var it_IT = {
identifier: 'it-IT',
days: ['domenica', 'lunedi', 'martedi', 'mercoledi', 'giovedi', 'venerdi', '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'],
AM: 'AM',
PM: 'PM',
am: 'am',
pm: 'pm',
formats: {
D: '%m/%d/%y',
F: '%Y-%m-%d',
R: '%H:%M',
X: '%T',
c: '%a %b %d %X %Y',
r: '%I:%M:%S %p',
T: '%H:%M:%S',
v: '%e-%b-%Y',
x: '%D'
}
}
var strftimeIT = strftime.localize(it_IT)
console.log(strftimeIT('%B %d, %Y %H:%M:%S')) // => aprile 28, 2011 18:21:08
console.log(strftimeIT('%B %d, %Y %H:%M:%S', new Date(1307472705067))) // => giugno 7, 2011 18:51:45
```
Some locales are bundled and can be used like so:
```JavaScript
var strftime = require('strftime') // not required in browsers
var strftimeIT = strftime.localizeByIdentifier('it_IT')
console.log(strftimeIT('%B %d, %Y %H:%M:%S')) // => aprile 28, 2011 18:21:08
console.log(strftimeIT('%B %d, %Y %H:%M:%S', new Date(1307472705067))) // => giugno 7, 2011 18:51:45
```
_The [full list of bundled locales](#locales) is below._
Time zones can be passed in as an offset from GMT in minutes.
```JavaScript
var strftime = require('strftime') // not required in browsers
var strftimePDT = strftime.timezone(-420)
var strftimeCEST = strftime.timezone(120)
console.log(strftimePDT('%B %d, %y %H:%M:%S', new Date(1307472705067))) // => June 07, 11 11:51:45
console.log(strftimeCEST('%F %T', new Date(1307472705067))) // => 2011-06-07 20:51:45
```
Alternatively you can use the timezone format used by ISO 8601, `+HHMM` or `-HHMM`.
```JavaScript
var strftime = require('strftime') // not required in browsers
var strftimePDT = strftime.timezone('-0700')
var strftimeCEST = strftime.timezone('+0200')
console.log(strftimePDT('%F %T', new Date(1307472705067))) // => 2011-06-07 11:51:45
console.log(strftimeCEST('%F %T', new Date(1307472705067))) // => 2011-06-07 20:51:45
```
Supported Specifiers
====================
Extensions from Ruby are noted in the following list.
Unsupported specifiers are rendered without the percent sign.
e.g. `%q` becomes `q`. Use `%%` to get a literal `%` sign.
- A: full weekday name
- a: abbreviated weekday name
- B: full month name
- b: abbreviated month name
- C: AD century (year / 100), padded to 2 digits
- c: equivalent to `%a %b %d %X %Y %Z` in en_US (based on locale)
- D: equivalent to `%m/%d/%y` in en_US (based on locale)
- d: day of the month, padded to 2 digits (01-31)
- e: day of the month, padded with a leading space for single digit values (1-31)
- F: equivalent to `%Y-%m-%d` in en_US (based on locale)
- H: the hour (24-hour clock), padded to 2 digits (00-23)
- h: the same as %b (abbreviated month name)
- I: the hour (12-hour clock), padded to 2 digits (01-12)
- j: day of the year, padded to 3 digits (001-366)
- k: the hour (24-hour clock), padded with a leading space for single digit values (0-23)
- L: the milliseconds, padded to 3 digits [Ruby extension]
- l: the hour (12-hour clock), padded with a leading space for single digit values (1-12)
- M: the minute, padded to 2 digits (00-59)
- m: the month, padded to 2 digits (01-12)
- n: newline character
- o: day of the month as an ordinal (without padding), e.g. 1st, 2nd, 3rd, 4th, ...
- P: "am" or "pm" in lowercase (Ruby extension, based on locale)
- p: "AM" or "PM" (based on locale)
- R: equivalent to `%H:%M` in en_US (based on locale)
- r: equivalent to `%I:%M:%S %p` in en_US (based on locale)
- S: the second, padded to 2 digits (00-60)
- s: the number of seconds since the Epoch, UTC
- T: equivalent to `%H:%M:%S` in en_US (based on locale)
- t: tab character
- U: week number of the year, Sunday as the first day of the week, padded to 2 digits (00-53)
- u: the weekday, Monday as the first day of the week (1-7)
- v: equivalent to `%e-%b-%Y` in en_US (based on locale)
- W: week number of the year, Monday as the first day of the week, padded to 2 digits (00-53)
- w: the weekday, Sunday as the first day of the week (0-6)
- X: equivalent to `%T` or `%r` in en_US (based on locale)
- x: equivalent to `%D` in en_US (based on locale)
- Y: the year with the century
- y: the year without the century, padded to 2 digits (00-99)
- Z: the time zone name, replaced with an empty string if it is not found
- z: the time zone offset from UTC, with a leading plus sign for UTC and zones east
of UTC and a minus sign for those west of UTC, hours and minutes follow each
padded to 2 digits and with no delimiter between them
For more detail see `man 3 strftime` as the format specifiers should behave identically. If behaviour differs please [file a bug](https://github.com/samsonjs/strftime/issues/new).
Any specifier can be modified with `-`, `_`, `0`, or `:` as well, as in Ruby. Using `%-` will omit any leading zeroes or spaces, `%_` will force spaces for padding instead of the default, and `%0` will force zeroes for padding. There's some redundancy here as `%-d` and `%e` have the same result, but it solves some awkwardness with formats like `%l`. Using `%:` for time zone offset, as in `%:z` will insert a colon as a delimiter.
<a name="locales"></a>
Bundled Locales
===============
- de\_DE
- en\_CA
- en\_US
- es\_MX
- fr\_FR
- it\_IT
- nl\_NL
- pt\_BR
- ru\_RU
- tr\_TR
- zh\_CN
Contributors
============
* [Alexandr Nikitin](https://github.com/alexandrnikitin)
* [Andrew Pirondini](https://github.com/andrewjpiro) of [iFixit](https://github.com/iFixit)
* [Andrew Schaaf](https://github.com/andrewschaaf)
* [Aryan Arora](https://github.com/aryan-debug)
* [Ayman Nedjmeddine](https://github.com/IOAyman)
* [Cory Heslip](https://github.com/cheslip)
* [Douglas de Espindola](https://github.com/douglasep)
* [Forbes Lindesay](https://github.com/ForbesLindesay)
* [John Zwinck](https://github.com/jzwinck)
* [Joost Hietbrink](https://github.com/joost)
* [Kevin Jin](https://github.com/Kevin-Jin)
* [Maximilian Herold](https://github.com/mherold)
* [Michael J.](https://github.com/michaeljayt)
* [@mogando668](https://github.com/mogando668)
* [Peter deHaan](https://github.com/pdehaan)
* [Rob Colburn](https://github.com/robcolburn)
* [Ryan Regalado](https://github.com/d48)
* [Ryan Stafford](https://github.com/ryanstafford)
* [Sami Samhuri](https://github.com/samsonjs)
* [Stian Grytøyr](https://github.com/stiang)
* [TJ Holowaychuk](https://github.com/tj)
* [@w0den](https://github.com/w0den)
* [Yusuke Kawasaki](https://github.com/kawanet)
License
=======
Copyright 2010 Sami Samhuri sami.samhuri@gmail.com
Copyright 2010 - 2024 Sami Samhuri sami@samhuri.net
MIT (see included [LICENSE](/samsonjs/strftime/blob/master/LICENSE))
[MIT license](https://sjs.mit-license.org)

13
bower.json Normal file
View file

@ -0,0 +1,13 @@
{
"name": "strftime",
"version": "0.10.3",
"main": "strftime.js",
"ignore": [
"Readme.md",
"Makefile",
"test",
"*.json"
],
"dependencies": {},
"devDependencies": {}
}

16
component.json Normal file
View file

@ -0,0 +1,16 @@
{
"name": "strftime",
"repo": "samsonjs/strftime",
"description": "strftime date formatting",
"keywords": [
"strftime",
"format",
"date",
"time"
],
"version": "0.10.3",
"main": "strftime.js",
"scripts": [
"strftime.js"
]
}

View file

@ -1,83 +0,0 @@
/// strftime
/// http://github.com/samsonjs/strftime
/// @_sjs
///
/// Copyright 2010 Sami Samhuri <sami.samhuri@gmail.com>
/// MIT License
var strftime = (function() {
var Weekdays = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday',
'Friday', 'Saturday'];
var WeekdaysShort = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];
var Months = ['January', 'February', 'March', 'April', 'May', 'June', 'July',
'August', 'September', 'October', 'November', 'December'];
var MonthsShort = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug',
'Sep', 'Oct', 'Nov', 'Dec'];
function pad(n, padding) {
padding = padding || '0';
return n < 10 ? (padding + n) : n;
}
function hours12(d) {
var hour = d.getHours();
if (hour == 0) hour = 12;
else if (hour > 12) hour -= 12;
return hour;
}
// Most of the specifiers supported by C's strftime
function strftime(fmt, d) {
d || (d = new Date());
return fmt.replace(/%(.)/g, function(_, c) {
switch (c) {
case 'A': return Weekdays[d.getDay()];
case 'a': return WeekdaysShort[d.getDay()];
case 'B': return Months[d.getMonth()];
case 'b': // fall through
case 'h': return MonthsShort[d.getMonth()];
case 'D': return strftime('%m/%d/%y', d);
case 'd': return pad(d.getDate());
case 'e': return d.getDate();
case 'F': return strftime('%Y-%m-%d', d);
case 'H': return pad(d.getHours());
case 'I': return pad(hours12(d));
case 'k': return pad(d.getHours(), ' ');
case 'l': return pad(hours12(d), ' ');
case 'M': return pad(d.getMinutes());
case 'm': return pad(d.getMonth() + 1);
case 'n': return '\n';
case 'p': return d.getHours() < 12 ? 'AM' : 'PM';
case 'R': return strftime('%H:%M', d);
case 'r': return strftime('%I:%M:%S %p', d);
case 'S': return pad(d.getSeconds());
case 's': return d.getTime();
case 'T': return strftime('%H:%M:%S', d);
case 't': return '\t';
case 'u':
var day = d.getDay();
return day == 0 ? 7 : day; // 1 - 7, Monday is first day of the week
case 'v': return strftime('%e-%b-%Y', d);
case 'w': return d.getDay(); // 0 - 6, Sunday is first day of the week
case 'Y': return d.getFullYear();
case 'y':
var year = d.getYear();
return year < 100 ? year : year - 100;
case 'Z':
var tz = d.toString().match(/\((\w+)\)/);
return tz && tz[1] || '';
case 'z':
var off = d.getTimezoneOffset();
return (off < 0 ? '-' : '+') + pad(off / 60) + pad(off % 60);
default: return c;
}
});
}
return strftime;
}());
if (typeof exports !== 'undefined') exports.strftime = strftime;
else (function(global) { global.strftime = strftime }(this));

17
package-lock.json generated Normal file
View file

@ -0,0 +1,17 @@
{
"name": "strftime",
"version": "0.10.3",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "strftime",
"version": "0.10.3",
"license": "MIT",
"devDependencies": {},
"engines": {
"node": ">=0.2.0"
}
}
}
}

View file

@ -1,22 +1,53 @@
{ "name" : "strftime"
, "description" : "strftime for JavaScript"
, "version" : "0.3.0"
, "homepage" : "http://samhuri.net/proj/strftime"
, "author" : "Sami Samhuri <sami.samhuri@gmail.com>"
, "repository" :
{ "type" : "git"
, "url" : "http://github.com/samsonjs/strftime.git"
}
, "bugs" :
{ "mail" : "sami.samhuri+strftime@gmail.com"
, "web" : "http://github.com/samsonjs/strftime/issues"
}
, "directories" : { "lib" : "./lib" }
, "main" : "./lib/index"
, "engines" : { "node" : ">=0.2.0" }
, "licenses" :
[ { "type" : "MIT"
, "url" : "http://github.com/samsonjs/strftime/raw/master/LICENSE"
}
]
}
{
"name": "strftime",
"description": "strftime for JavaScript",
"version": "0.10.3",
"homepage": "https://samhuri.net/projects/strftime",
"author": "Sami Samhuri <sami@samhuri.net>",
"contributors": [
"Alexandr Nikitin (https://github.com/alexandrnikitin)",
"Andrew Pirondini of iFixit (https://github.com/andrewjpiro)",
"Andrew Schaaf <andrew@andrewschaaf.com> (https://github.com/andrewschaaf)",
"Ayman Nedjmeddine (https://github.com/IOAyman)",
"Cory Heslip (https://github.com/cheslip)",
"Douglas de Espindola (https://github.com/douglasep)",
"Forbes Lindesay (https://github.com/ForbesLindesay)",
"John Zwinck (https://github.com/jzwinck)",
"Joost Hietbrink (https://github.com/joost)",
"Kevin Jin (https://github.com/Kevin-Jin)",
"Michael J. (https://github.com/michaeljayt)",
"Peter deHaan (https://github.com/pdehaan)",
"Rob Colburn <rob@robcolburn.com> (https://github.com/robcolburn)",
"Ryan Regalado (https://github.com/d48)",
"Ryan Stafford (https://github.com/ryanstafford)",
"Sami Samhuri <sami@samhuri.net> (https://github.com/samsonjs)",
"Stian Grytøyr (https://github.com/stiang)",
"TJ Holowaychuk (https://github.com/tj)",
"w0den (https://github.com/w0den)",
"Yusuke Kawasaki (https://github.com/kawanet)",
"Aryan Arora (https://github.com/aryan-debug)"
],
"keywords": [
"strftime",
"format",
"string",
"time",
"date"
],
"repository": {
"type": "git",
"url": "git://github.com/samsonjs/strftime.git"
},
"bugs": {
"email": "sami@samhuri.net",
"url": "https://github.com/samsonjs/strftime/issues"
},
"main": "./strftime.js",
"engines": {
"node": ">=0.2.0"
},
"license": "MIT",
"dependencies": {},
"devDependencies": {},
"optionalDependencies": {}
}

21
strftime-min.js vendored Normal file
View file

@ -0,0 +1,21 @@
(function(){function w(e,h,q){function l(g,a,c,f){for(var b="",d=null,r=!1,J=g.length,x=!1,v=0;v<J;v++){var n=g.charCodeAt(v);if(!0===r)if(45===n)d="";else if(95===n)d=" ";else if(48===n)d="0";else if(58===n)x&&A("[WARNING] detected use of unsupported %:: or %::: modifiers to strftime"),x=!0;else{switch(n){case 37:b+="%";break;case 65:b+=c.days[a.getDay()];break;case 66:b+=c.months[a.getMonth()];break;case 67:b+=k(Math.floor(a.getFullYear()/100),d);break;case 68:b+=l(c.formats.D,a,c,f);break;case 70:b+=
l(c.formats.F,a,c,f);break;case 72:b+=k(a.getHours(),d);break;case 73:b+=k(B(a.getHours()),d);break;case 76:b+=C(Math.floor(f%1E3));break;case 77:b+=k(a.getMinutes(),d);break;case 80:b+=12>a.getHours()?c.am:c.pm;break;case 82:b+=l(c.formats.R,a,c,f);break;case 83:b+=k(a.getSeconds(),d);break;case 84:b+=l(c.formats.T,a,c,f);break;case 85:b+=k(D(a,"sunday"),d);break;case 87:b+=k(D(a,"monday"),d);break;case 88:b+=l(c.formats.X,a,c,f);break;case 89:b+=a.getFullYear();break;case 90:t&&0===m?b+="GMT":(d=
a.toString().match(/\(([\w\s]+)\)/),b+=d&&d[1]||"");break;case 97:b+=c.shortDays[a.getDay()];break;case 98:b+=c.shortMonths[a.getMonth()];break;case 99:b+=l(c.formats.c,a,c,f);break;case 100:b+=k(a.getDate(),d);break;case 101:b+=k(a.getDate(),null==d?" ":d);break;case 104:b+=c.shortMonths[a.getMonth()];break;case 106:d=new Date(a.getFullYear(),0,1);d=Math.ceil((a.getTime()-d.getTime())/864E5);b+=C(d);break;case 107:b+=k(a.getHours(),null==d?" ":d);break;case 108:b+=k(B(a.getHours()),null==d?" ":d);
break;case 109:b+=k(a.getMonth()+1,d);break;case 110:b+="\n";break;case 111:d=a.getDate();b=c.ordinalSuffixes?b+(String(d)+(c.ordinalSuffixes[d-1]||E(d))):b+(String(d)+E(d));break;case 112:b+=12>a.getHours()?c.AM:c.PM;break;case 114:b+=l(c.formats.r,a,c,f);break;case 115:b+=Math.floor(f/1E3);break;case 116:b+="\t";break;case 117:d=a.getDay();b+=0===d?7:d;break;case 118:b+=l(c.formats.v,a,c,f);break;case 119:b+=a.getDay();break;case 120:b+=l(c.formats.x,a,c,f);break;case 121:b+=k(a.getFullYear()%100,
d);break;case 122:t&&0===m?b+=x?"+00:00":"+0000":(d=0!==m?m/6E4:-a.getTimezoneOffset(),r=x?":":"",n=Math.abs(d%60),b+=(0>d?"-":"+")+k(Math.floor(Math.abs(d/60)))+r+k(n));break;default:r&&(b+="%"),b+=g[v]}d=null;r=!1}else 37===n?r=!0:b+=g[v]}return b}var y=e||F,m=h||0,t=q||!1,u=0,z,p=function(g,a){if(a){var c=a.getTime();if(t){var f=6E4*(a.getTimezoneOffset()||0);a=new Date(c+f+m);6E4*(a.getTimezoneOffset()||0)!==f&&(a=6E4*(a.getTimezoneOffset()||0),a=new Date(c+a+m))}}else c=Date.now(),c>u?(u=c,z=
new Date(u),c=u,t&&(z=new Date(u+6E4*(z.getTimezoneOffset()||0)+m))):c=u,a=z;return l(g,a,y,c)};p.localize=function(g){return new w(g||y,m,t)};p.localizeByIdentifier=function(g){var a=G[g];return a?p.localize(a):(A('[WARNING] No locale found with identifier "'+g+'".'),p)};p.timezone=function(g){var a=m,c=t,f=typeof g;if("number"===f||"string"===f)c=!0,"string"===f?(a="-"===g[0]?-1:1,f=parseInt(g.slice(1,3),10),g=parseInt(g.slice(3,5),10),a=a*(60*f+g)*6E4):"number"===f&&(a=6E4*g);return new w(y,a,
c)};p.utc=function(){return new w(y,m,!0)};return p}function k(e,h){if(""===h||9<e)return""+e;null==h&&(h="0");return h+e}function C(e){return 99<e?e:9<e?"0"+e:"00"+e}function B(e){return 0===e?12:12<e?e-12:e}function D(e,h){h=h||"sunday";var q=e.getDay();"monday"===h&&(0===q?q=6:q--);h=Date.UTC(e.getFullYear(),0,1);e=Date.UTC(e.getFullYear(),e.getMonth(),e.getDate());return Math.floor((Math.floor((e-h)/864E5)+7-q)/7)}function E(e){var h=e%10;e%=100;if(11<=e&&13>=e||0===h||4<=h)return"th";switch(h){case 1:return"st";
case 2:return"nd";case 3:return"rd"}}function A(e){"undefined"!==typeof console&&"function"==typeof console.warn&&console.warn(e)}var G={de_DE:{identifier:"de-DE",days:"Sonntag Montag Dienstag Mittwoch Donnerstag Freitag Samstag".split(" "),shortDays:"So Mo Di Mi Do Fr Sa".split(" "),months:"Januar Februar M\u00e4rz April Mai Juni Juli August September Oktober November Dezember".split(" "),shortMonths:"Jan Feb M\u00e4r Apr Mai Jun Jul Aug Sep Okt Nov Dez".split(" "),AM:"AM",PM:"PM",am:"am",pm:"pm",
formats:{c:"%a %d %b %Y %X %Z",D:"%d.%m.%Y",F:"%Y-%m-%d",R:"%H:%M",r:"%I:%M:%S %p",T:"%H:%M:%S",v:"%e-%b-%Y",X:"%T",x:"%D"}},en_CA:{identifier:"en-CA",days:"Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "),shortDays:"Sun Mon Tue Wed Thu Fri Sat".split(" "),months:"January February March April May June July August September October November December".split(" "),shortMonths:"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),ordinalSuffixes:"st nd rd th th th th th th th th th th th th th th th th th st nd rd th th th th th th th st".split(" "),
AM:"AM",PM:"PM",am:"am",pm:"pm",formats:{c:"%a %d %b %Y %X %Z",D:"%d/%m/%y",F:"%Y-%m-%d",R:"%H:%M",r:"%I:%M:%S %p",T:"%H:%M:%S",v:"%e-%b-%Y",X:"%r",x:"%D"}},en_US:{identifier:"en-US",days:"Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "),shortDays:"Sun Mon Tue Wed Thu Fri Sat".split(" "),months:"January February March April May June July August September October November December".split(" "),shortMonths:"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),ordinalSuffixes:"st nd rd th th th th th th th th th th th th th th th th th st nd rd th th th th th th th st".split(" "),
AM:"AM",PM:"PM",am:"am",pm:"pm",formats:{c:"%a %d %b %Y %X %Z",D:"%m/%d/%y",F:"%Y-%m-%d",R:"%H:%M",r:"%I:%M:%S %p",T:"%H:%M:%S",v:"%e-%b-%Y",X:"%r",x:"%D"}},es_MX:{identifier:"es-MX",days:"domingo lunes martes mi\u00e9rcoles jueves viernes s\u00e1bado".split(" "),shortDays:"dom lun mar mi\u00e9 jue vie s\u00e1b".split(" "),months:"enero febrero marzo abril mayo junio julio agosto septiembre octubre noviembre diciembre".split(" "),shortMonths:"ene feb mar abr may jun jul ago sep oct nov dic".split(" "),
AM:"AM",PM:"PM",am:"am",pm:"pm",formats:{c:"%a %d %b %Y %X %Z",D:"%d/%m/%Y",F:"%Y-%m-%d",R:"%H:%M",r:"%I:%M:%S %p",T:"%H:%M:%S",v:"%e-%b-%Y",X:"%T",x:"%D"}},fr_FR:{identifier:"fr-FR",days:"dimanche lundi mardi mercredi jeudi vendredi samedi".split(" "),shortDays:"dim. lun. mar. mer. jeu. ven. sam.".split(" "),months:"janvier f\u00e9vrier mars avril mai juin juillet ao\u00fbt septembre octobre novembre d\u00e9cembre".split(" "),shortMonths:"janv. f\u00e9vr. mars avril mai juin juil. ao\u00fbt sept. oct. nov. d\u00e9c.".split(" "),
AM:"AM",PM:"PM",am:"am",pm:"pm",formats:{c:"%a %d %b %Y %X %Z",D:"%d/%m/%Y",F:"%Y-%m-%d",R:"%H:%M",r:"%I:%M:%S %p",T:"%H:%M:%S",v:"%e-%b-%Y",X:"%T",x:"%D"}},it_IT:{identifier:"it-IT",days:"domenica luned\u00ec marted\u00ec mercoled\u00ec gioved\u00ec venerd\u00ec sabato".split(" "),shortDays:"dom lun mar mer gio ven sab".split(" "),months:"gennaio febbraio marzo aprile maggio giugno luglio agosto settembre ottobre novembre dicembre".split(" "),shortMonths:"gen feb mar apr mag giu lug ago set ott nov dic".split(" "),
AM:"AM",PM:"PM",am:"am",pm:"pm",formats:{c:"%a %d %b %Y %X %Z",D:"%d/%m/%Y",F:"%Y-%m-%d",R:"%H:%M",r:"%I:%M:%S %p",T:"%H:%M:%S",v:"%e-%b-%Y",X:"%T",x:"%D"}},nl_NL:{identifier:"nl-NL",days:"zondag maandag dinsdag woensdag donderdag vrijdag zaterdag".split(" "),shortDays:"zo ma di wo do vr za".split(" "),months:"januari februari maart april mei juni juli augustus september oktober november december".split(" "),shortMonths:"jan feb mrt apr mei jun jul aug sep okt nov dec".split(" "),AM:"AM",PM:"PM",
am:"am",pm:"pm",formats:{c:"%a %d %b %Y %X %Z",D:"%d-%m-%y",F:"%Y-%m-%d",R:"%H:%M",r:"%I:%M:%S %p",T:"%H:%M:%S",v:"%e-%b-%Y",X:"%T",x:"%D"}},pt_BR:{identifier:"pt-BR",days:"domingo segunda ter\u00e7a quarta quinta sexta s\u00e1bado".split(" "),shortDays:"Dom Seg Ter Qua Qui Sex S\u00e1b".split(" "),months:"janeiro fevereiro mar\u00e7o abril maio junho julho agosto setembro outubro novembro dezembro".split(" "),shortMonths:"Jan Fev Mar Abr Mai Jun Jul Ago Set Out Nov Dez".split(" "),AM:"AM",PM:"PM",
am:"am",pm:"pm",formats:{c:"%a %d %b %Y %X %Z",D:"%d-%m-%Y",F:"%Y-%m-%d",R:"%H:%M",r:"%I:%M:%S %p",T:"%H:%M:%S",v:"%e-%b-%Y",X:"%T",x:"%D"}},ru_RU:{identifier:"ru-RU",days:"\u0412\u043e\u0441\u043a\u0440\u0435\u0441\u0435\u043d\u044c\u0435 \u041f\u043e\u043d\u0435\u0434\u0435\u043b\u044c\u043d\u0438\u043a \u0412\u0442\u043e\u0440\u043d\u0438\u043a \u0421\u0440\u0435\u0434\u0430 \u0427\u0435\u0442\u0432\u0435\u0440\u0433 \u041f\u044f\u0442\u043d\u0438\u0446\u0430 \u0421\u0443\u0431\u0431\u043e\u0442\u0430".split(" "),
shortDays:"\u0412\u0441 \u041f\u043d \u0412\u0442 \u0421\u0440 \u0427\u0442 \u041f\u0442 \u0421\u0431".split(" "),months:"\u042f\u043d\u0432\u0430\u0440\u044c \u0424\u0435\u0432\u0440\u0430\u043b\u044c \u041c\u0430\u0440\u0442 \u0410\u043f\u0440\u0435\u043b\u044c \u041c\u0430\u0439 \u0418\u044e\u043d\u044c \u0418\u044e\u043b\u044c \u0410\u0432\u0433\u0443\u0441\u0442 \u0421\u0435\u043d\u0442\u044f\u0431\u0440\u044c \u041e\u043a\u0442\u044f\u0431\u0440\u044c \u041d\u043e\u044f\u0431\u0440\u044c \u0414\u0435\u043a\u0430\u0431\u0440\u044c".split(" "),
shortMonths:"\u044f\u043d\u0432 \u0444\u0435\u0432 \u043c\u0430\u0440 \u0430\u043f\u0440 \u043c\u0430\u0439 \u0438\u044e\u043d \u0438\u044e\u043b \u0430\u0432\u0433 \u0441\u0435\u043d \u043e\u043a\u0442 \u043d\u043e\u044f \u0434\u0435\u043a".split(" "),AM:"AM",PM:"PM",am:"am",pm:"pm",formats:{c:"%a %d %b %Y %X",D:"%d.%m.%y",F:"%Y-%m-%d",R:"%H:%M",r:"%I:%M:%S %p",T:"%H:%M:%S",v:"%e-%b-%Y",X:"%T",x:"%D"}},tr_TR:{identifier:"tr-TR",days:"Pazar Pazartesi Sal\u0131 \u00c7ar\u015famba Per\u015fembe Cuma Cumartesi".split(" "),
shortDays:"Paz Pzt Sal \u00c7r\u015f Pr\u015f Cum Cts".split(" "),months:"Ocak \u015eubat Mart Nisan May\u0131s Haziran Temmuz A\u011fustos Eyl\u00fcl Ekim Kas\u0131m Aral\u0131k".split(" "),shortMonths:"Oca \u015eub Mar Nis May Haz Tem A\u011fu Eyl Eki Kas Ara".split(" "),AM:"\u00d6\u00d6",PM:"\u00d6S",am:"\u00d6\u00d6",pm:"\u00d6S",formats:{c:"%a %d %b %Y %X %Z",D:"%d-%m-%Y",F:"%Y-%m-%d",R:"%H:%M",r:"%I:%M:%S %p",T:"%H:%M:%S",v:"%e-%b-%Y",X:"%T",x:"%D"}},zh_CN:{identifier:"zh-CN",days:"\u661f\u671f\u65e5 \u661f\u671f\u4e00 \u661f\u671f\u4e8c \u661f\u671f\u4e09 \u661f\u671f\u56db \u661f\u671f\u4e94 \u661f\u671f\u516d".split(" "),
shortDays:"\u65e5\u4e00\u4e8c\u4e09\u56db\u4e94\u516d".split(""),months:"\u4e00\u6708 \u4e8c\u6708 \u4e09\u6708 \u56db\u6708 \u4e94\u6708 \u516d\u6708 \u4e03\u6708 \u516b\u6708 \u4e5d\u6708 \u5341\u6708 \u5341\u4e00\u6708 \u5341\u4e8c\u6708".split(" "),shortMonths:"\u4e00\u6708 \u4e8c\u6708 \u4e09\u6708 \u56db\u6708 \u4e94\u6708 \u516d\u6708 \u4e03\u6708 \u516b\u6708 \u4e5d\u6708 \u5341\u6708 \u5341\u4e00\u6708 \u5341\u4e8c\u6708".split(" "),AM:"\u4e0a\u5348",PM:"\u4e0b\u5348",am:"\u4e0a\u5348",pm:"\u4e0b\u5348",
formats:{c:"%a %d %b %Y %X %Z",D:"%d/%m/%y",F:"%Y-%m-%d",R:"%H:%M",r:"%I:%M:%S %p",T:"%H:%M:%S",v:"%e-%b-%Y",X:"%r",x:"%D"}}},F=G.en_US,H=new w(F,0,!1);if("undefined"!==typeof module)var I=module.exports=H;else I=function(){return this||(0,eval)("this")}(),I.strftime=H;"function"!==typeof Date.now&&(Date.now=function(){return+new Date})})();

853
strftime.js Normal file
View file

@ -0,0 +1,853 @@
//
// strftime
// github.com/samsonjs/strftime
// @_sjs
//
// Copyright 2010 - 2021 Sami Samhuri <sami@samhuri.net>
//
// MIT License
// http://sjs.mit-license.org
//
; (function () {
var Locales = {
de_DE: {
identifier: 'de-DE',
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', 'Mär', 'Apr', 'Mai', 'Jun', 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dez'],
AM: 'AM',
PM: 'PM',
am: 'am',
pm: 'pm',
formats: {
c: '%a %d %b %Y %X %Z',
D: '%d.%m.%Y',
F: '%Y-%m-%d',
R: '%H:%M',
r: '%I:%M:%S %p',
T: '%H:%M:%S',
v: '%e-%b-%Y',
X: '%T',
x: '%D'
}
},
en_CA: {
identifier: 'en-CA',
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'],
ordinalSuffixes: [
'st', 'nd', 'rd', 'th', 'th', 'th', 'th', 'th', 'th', 'th',
'th', 'th', 'th', 'th', 'th', 'th', 'th', 'th', 'th', 'th',
'st', 'nd', 'rd', 'th', 'th', 'th', 'th', 'th', 'th', 'th',
'st'
],
AM: 'AM',
PM: 'PM',
am: 'am',
pm: 'pm',
formats: {
c: '%a %d %b %Y %X %Z',
D: '%d/%m/%y',
F: '%Y-%m-%d',
R: '%H:%M',
r: '%I:%M:%S %p',
T: '%H:%M:%S',
v: '%e-%b-%Y',
X: '%r',
x: '%D'
}
},
en_US: {
identifier: 'en-US',
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'],
ordinalSuffixes: [
'st', 'nd', 'rd', 'th', 'th', 'th', 'th', 'th', 'th', 'th',
'th', 'th', 'th', 'th', 'th', 'th', 'th', 'th', 'th', 'th',
'st', 'nd', 'rd', 'th', 'th', 'th', 'th', 'th', 'th', 'th',
'st'
],
AM: 'AM',
PM: 'PM',
am: 'am',
pm: 'pm',
formats: {
c: '%a %d %b %Y %X %Z',
D: '%m/%d/%y',
F: '%Y-%m-%d',
R: '%H:%M',
r: '%I:%M:%S %p',
T: '%H:%M:%S',
v: '%e-%b-%Y',
X: '%r',
x: '%D'
}
},
es_MX: {
identifier: 'es-MX',
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'],
AM: 'AM',
PM: 'PM',
am: 'am',
pm: 'pm',
formats: {
c: '%a %d %b %Y %X %Z',
D: '%d/%m/%Y',
F: '%Y-%m-%d',
R: '%H:%M',
r: '%I:%M:%S %p',
T: '%H:%M:%S',
v: '%e-%b-%Y',
X: '%T',
x: '%D'
}
},
fr_FR: {
identifier: 'fr-FR',
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', 'avril', 'mai', 'juin', 'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.'],
AM: 'AM',
PM: 'PM',
am: 'am',
pm: 'pm',
formats: {
c: '%a %d %b %Y %X %Z',
D: '%d/%m/%Y',
F: '%Y-%m-%d',
R: '%H:%M',
r: '%I:%M:%S %p',
T: '%H:%M:%S',
v: '%e-%b-%Y',
X: '%T',
x: '%D'
}
},
it_IT: {
identifier: 'it-IT',
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'],
AM: 'AM',
PM: 'PM',
am: 'am',
pm: 'pm',
formats: {
c: '%a %d %b %Y %X %Z',
D: '%d/%m/%Y',
F: '%Y-%m-%d',
R: '%H:%M',
r: '%I:%M:%S %p',
T: '%H:%M:%S',
v: '%e-%b-%Y',
X: '%T',
x: '%D'
}
},
nl_NL: {
identifier: 'nl-NL',
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'],
AM: 'AM',
PM: 'PM',
am: 'am',
pm: 'pm',
formats: {
c: '%a %d %b %Y %X %Z',
D: '%d-%m-%y',
F: '%Y-%m-%d',
R: '%H:%M',
r: '%I:%M:%S %p',
T: '%H:%M:%S',
v: '%e-%b-%Y',
X: '%T',
x: '%D'
}
},
pt_BR: {
identifier: 'pt-BR',
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'],
AM: 'AM',
PM: 'PM',
am: 'am',
pm: 'pm',
formats: {
c: '%a %d %b %Y %X %Z',
D: '%d-%m-%Y',
F: '%Y-%m-%d',
R: '%H:%M',
r: '%I:%M:%S %p',
T: '%H:%M:%S',
v: '%e-%b-%Y',
X: '%T',
x: '%D'
}
},
ru_RU: {
identifier: 'ru-RU',
days: ['Воскресенье', 'Понедельник', 'Вторник', 'Среда', 'Четверг', 'Пятница', 'Суббота'],
shortDays: ['Вс', 'Пн', 'Вт', 'Ср', 'Чт', 'Пт', 'Сб'],
months: ['Январь', 'Февраль', 'Март', 'Апрель', 'Май', 'Июнь', 'Июль', 'Август', 'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь'],
shortMonths: ['янв', 'фев', 'мар', 'апр', 'май', 'июн', 'июл', 'авг', 'сен', 'окт', 'ноя', 'дек'],
AM: 'AM',
PM: 'PM',
am: 'am',
pm: 'pm',
formats: {
c: '%a %d %b %Y %X',
D: '%d.%m.%y',
F: '%Y-%m-%d',
R: '%H:%M',
r: '%I:%M:%S %p',
T: '%H:%M:%S',
v: '%e-%b-%Y',
X: '%T',
x: '%D'
}
},
tr_TR: {
identifier: 'tr-TR',
days: ['Pazar', 'Pazartesi', 'Salı', 'Çarşamba', 'Perşembe', 'Cuma', 'Cumartesi'],
shortDays: ['Paz', 'Pzt', 'Sal', 'Çrş', 'Prş', 'Cum', 'Cts'],
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'],
AM: 'ÖÖ',
PM: 'ÖS',
am: 'ÖÖ',
pm: 'ÖS',
formats: {
c: '%a %d %b %Y %X %Z',
D: '%d-%m-%Y',
F: '%Y-%m-%d',
R: '%H:%M',
r: '%I:%M:%S %p',
T: '%H:%M:%S',
v: '%e-%b-%Y',
X: '%T',
x: '%D'
}
},
// By michaeljayt<michaeljayt@gmail.com>
// https://github.com/michaeljayt/strftime/commit/bcb4c12743811d51e568175aa7bff3fd2a77cef3
zh_CN: {
identifier: 'zh-CN',
days: ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'],
shortDays: ['日', '一', '二', '三', '四', '五', '六'],
months: ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'],
shortMonths: ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'],
AM: '上午',
PM: '下午',
am: '上午',
pm: '下午',
formats: {
c: '%a %d %b %Y %X %Z',
D: '%d/%m/%y',
F: '%Y-%m-%d',
R: '%H:%M',
r: '%I:%M:%S %p',
T: '%H:%M:%S',
v: '%e-%b-%Y',
X: '%r',
x: '%D'
}
}
};
var DefaultLocale = Locales['en_US'],
defaultStrftime = new Strftime(DefaultLocale, 0, false),
isCommonJS = typeof module !== 'undefined',
namespace;
// CommonJS / Node module
if (isCommonJS) {
namespace = module.exports = defaultStrftime;
}
// Browsers and other environments
else {
// Get the global object. Works in ES3, ES5, and ES5 strict mode.
namespace = (function () { return this || (1, eval)('this'); }());
namespace.strftime = defaultStrftime;
}
// Polyfill Date.now for old browsers.
if (typeof Date.now !== 'function') {
Date.now = function () {
return +new Date();
};
}
function Strftime(locale, customTimezoneOffset, useUtcTimezone) {
var _locale = locale || DefaultLocale,
_customTimezoneOffset = customTimezoneOffset || 0,
_useUtcBasedDate = useUtcTimezone || false,
// we store unix timestamp value here to not create new Date() each iteration (each millisecond)
// Date.now() is 2 times faster than new Date()
// while millisecond precise is enough here
// this could be very helpful when strftime triggered a lot of times one by one
_cachedDateTimestamp = 0,
_cachedDate;
function _strftime(format, date) {
var timestamp;
if (!date) {
var currentTimestamp = Date.now();
if (currentTimestamp > _cachedDateTimestamp) {
_cachedDateTimestamp = currentTimestamp;
_cachedDate = new Date(_cachedDateTimestamp);
timestamp = _cachedDateTimestamp;
if (_useUtcBasedDate) {
// how to avoid duplication of date instantiation for utc here?
// we tied to getTimezoneOffset of the current date
_cachedDate = new Date(_cachedDateTimestamp + getTimestampToUtcOffsetFor(_cachedDate) + _customTimezoneOffset);
}
}
else {
timestamp = _cachedDateTimestamp;
}
date = _cachedDate;
}
else {
timestamp = date.getTime();
if (_useUtcBasedDate) {
var utcOffset = getTimestampToUtcOffsetFor(date);
date = new Date(timestamp + utcOffset + _customTimezoneOffset);
// If we've crossed a DST boundary with this calculation we need to
// adjust the new date accordingly or it will be off by an hour in UTC.
if (getTimestampToUtcOffsetFor(date) !== utcOffset) {
var newUTCOffset = getTimestampToUtcOffsetFor(date);
date = new Date(timestamp + newUTCOffset + _customTimezoneOffset);
}
}
}
return _processFormat(format, date, _locale, timestamp);
}
function _processFormat(format, date, locale, timestamp) {
var resultString = '',
padding = null,
isInScope = false,
length = format.length,
extendedTZ = false;
for (var i = 0; i < length; i++) {
var currentCharCode = format.charCodeAt(i);
if (isInScope === true) {
// '-'
if (currentCharCode === 45) {
padding = '';
continue;
}
// '_'
else if (currentCharCode === 95) {
padding = ' ';
continue;
}
// '0'
else if (currentCharCode === 48) {
padding = '0';
continue;
}
// ':'
else if (currentCharCode === 58) {
if (extendedTZ) {
warn("[WARNING] detected use of unsupported %:: or %::: modifiers to strftime");
}
extendedTZ = true;
continue;
}
switch (currentCharCode) {
// Examples for new Date(0) in GMT
// '%'
// case '%':
case 37:
resultString += '%';
break;
// 'Thursday'
// case 'A':
case 65:
resultString += locale.days[date.getDay()];
break;
// 'January'
// case 'B':
case 66:
resultString += locale.months[date.getMonth()];
break;
// '19'
// case 'C':
case 67:
resultString += padTill2(Math.floor(date.getFullYear() / 100), padding);
break;
// '01/01/70'
// case 'D':
case 68:
resultString += _processFormat(locale.formats.D, date, locale, timestamp);
break;
// '1970-01-01'
// case 'F':
case 70:
resultString += _processFormat(locale.formats.F, date, locale, timestamp);
break;
// '00'
// case 'H':
case 72:
resultString += padTill2(date.getHours(), padding);
break;
// '12'
// case 'I':
case 73:
resultString += padTill2(hours12(date.getHours()), padding);
break;
// '000'
// case 'L':
case 76:
resultString += padTill3(Math.floor(timestamp % 1000));
break;
// '00'
// case 'M':
case 77:
resultString += padTill2(date.getMinutes(), padding);
break;
// 'am'
// case 'P':
case 80:
resultString += date.getHours() < 12 ? locale.am : locale.pm;
break;
// '00:00'
// case 'R':
case 82:
resultString += _processFormat(locale.formats.R, date, locale, timestamp);
break;
// '00'
// case 'S':
case 83:
resultString += padTill2(date.getSeconds(), padding);
break;
// '00:00:00'
// case 'T':
case 84:
resultString += _processFormat(locale.formats.T, date, locale, timestamp);
break;
// '00'
// case 'U':
case 85:
resultString += padTill2(weekNumber(date, 'sunday'), padding);
break;
// '00'
// case 'W':
case 87:
resultString += padTill2(weekNumber(date, 'monday'), padding);
break;
// '16:00:00'
// case 'X':
case 88:
resultString += _processFormat(locale.formats.X, date, locale, timestamp);
break;
// '1970'
// case 'Y':
case 89:
resultString += date.getFullYear();
break;
// 'GMT'
// case 'Z':
case 90:
if (_useUtcBasedDate && _customTimezoneOffset === 0) {
resultString += "GMT";
}
else {
var tzName = getTimezoneName(date);
resultString += tzName || '';
}
break;
// 'Thu'
// case 'a':
case 97:
resultString += locale.shortDays[date.getDay()];
break;
// 'Jan'
// case 'b':
case 98:
resultString += locale.shortMonths[date.getMonth()];
break;
// ''
// case 'c':
case 99:
resultString += _processFormat(locale.formats.c, date, locale, timestamp);
break;
// '01'
// case 'd':
case 100:
resultString += padTill2(date.getDate(), padding);
break;
// ' 1'
// case 'e':
case 101:
resultString += padTill2(date.getDate(), padding == null ? ' ' : padding);
break;
// 'Jan'
// case 'h':
case 104:
resultString += locale.shortMonths[date.getMonth()];
break;
// '000'
// case 'j':
case 106:
var y = new Date(date.getFullYear(), 0, 1);
var day = Math.ceil((date.getTime() - y.getTime()) / (1000 * 60 * 60 * 24));
resultString += padTill3(day);
break;
// ' 0'
// case 'k':
case 107:
resultString += padTill2(date.getHours(), padding == null ? ' ' : padding);
break;
// '12'
// case 'l':
case 108:
resultString += padTill2(hours12(date.getHours()), padding == null ? ' ' : padding);
break;
// '01'
// case 'm':
case 109:
resultString += padTill2(date.getMonth() + 1, padding);
break;
// '\n'
// case 'n':
case 110:
resultString += '\n';
break;
// '1st'
// case 'o':
case 111:
// Try to use an ordinal suffix from the locale, but fall back to using the old
// function for compatibility with old locales that lack them.
var day = date.getDate();
if (locale.ordinalSuffixes) {
resultString += String(day) + (locale.ordinalSuffixes[day - 1] || ordinal(day));
}
else {
resultString += String(day) + ordinal(day);
}
break;
// 'AM'
// case 'p':
case 112:
resultString += date.getHours() < 12 ? locale.AM : locale.PM;
break;
// '12:00:00 AM'
// case 'r':
case 114:
resultString += _processFormat(locale.formats.r, date, locale, timestamp);
break;
// '0'
// case 's':
case 115:
resultString += Math.floor(timestamp / 1000);
break;
// '\t'
// case 't':
case 116:
resultString += '\t';
break;
// '4'
// case 'u':
case 117:
var day = date.getDay();
resultString += day === 0 ? 7 : day;
break; // 1 - 7, Monday is first day of the week
// ' 1-Jan-1970'
// case 'v':
case 118:
resultString += _processFormat(locale.formats.v, date, locale, timestamp);
break;
// '4'
// case 'w':
case 119:
resultString += date.getDay();
break; // 0 - 6, Sunday is first day of the week
// '12/31/69'
// case 'x':
case 120:
resultString += _processFormat(locale.formats.x, date, locale, timestamp);
break;
// '70'
// case 'y':
case 121:
resultString += padTill2(date.getFullYear() % 100, padding);
break;
// '+0000'
// case 'z':
case 122:
if (_useUtcBasedDate && _customTimezoneOffset === 0) {
resultString += extendedTZ ? "+00:00" : "+0000";
}
else {
var off;
if (_customTimezoneOffset !== 0) {
off = _customTimezoneOffset / (60 * 1000);
}
else {
off = -date.getTimezoneOffset();
}
var sign = off < 0 ? '-' : '+';
var sep = extendedTZ ? ':' : '';
var hours = Math.floor(Math.abs(off / 60));
var mins = Math.abs(off % 60);
resultString += sign + padTill2(hours) + sep + padTill2(mins);
}
break;
default:
if (isInScope) {
resultString += '%';
}
resultString += format[i];
break;
}
padding = null;
isInScope = false;
continue;
}
// '%'
if (currentCharCode === 37) {
isInScope = true;
continue;
}
resultString += format[i];
}
return resultString;
}
var strftime = _strftime;
strftime.localize = function (locale) {
return new Strftime(locale || _locale, _customTimezoneOffset, _useUtcBasedDate);
};
strftime.localizeByIdentifier = function (localeIdentifier) {
var locale = Locales[localeIdentifier];
if (!locale) {
warn('[WARNING] No locale found with identifier "' + localeIdentifier + '".');
return strftime;
}
return strftime.localize(locale);
};
strftime.timezone = function (timezone) {
var customTimezoneOffset = _customTimezoneOffset;
var useUtcBasedDate = _useUtcBasedDate;
var timezoneType = typeof timezone;
if (timezoneType === 'number' || timezoneType === 'string') {
useUtcBasedDate = true;
// ISO 8601 format timezone string, [-+]HHMM
if (timezoneType === 'string') {
var sign = timezone[0] === '-' ? -1 : 1,
hours = parseInt(timezone.slice(1, 3), 10),
minutes = parseInt(timezone.slice(3, 5), 10);
customTimezoneOffset = sign * ((60 * hours) + minutes) * 60 * 1000;
// in minutes: 420
}
else if (timezoneType === 'number') {
customTimezoneOffset = timezone * 60 * 1000;
}
}
return new Strftime(_locale, customTimezoneOffset, useUtcBasedDate);
};
strftime.utc = function () {
return new Strftime(_locale, _customTimezoneOffset, true);
};
return strftime;
}
function padTill2(numberToPad, paddingChar) {
if (paddingChar === '' || numberToPad > 9) {
return '' + numberToPad;
}
if (paddingChar == null) {
paddingChar = '0';
}
return paddingChar + numberToPad;
}
function padTill3(numberToPad) {
if (numberToPad > 99) {
return numberToPad;
}
if (numberToPad > 9) {
return '0' + numberToPad;
}
return '00' + numberToPad;
}
function hours12(hour) {
if (hour === 0) {
return 12;
}
else if (hour > 12) {
return hour - 12;
}
return hour;
}
// firstWeekday: 'sunday' or 'monday', default is 'sunday'
//
// Pilfered & ported from Ruby's strftime implementation.
function weekNumber(date, firstWeekday) {
firstWeekday = firstWeekday || 'sunday';
// This works by shifting the weekday back by one day if we
// are treating Monday as the first day of the week.
var weekday = date.getDay();
if (firstWeekday === 'monday') {
if (weekday === 0) // Sunday
weekday = 6;
else
weekday--;
}
var firstDayOfYearUtc = Date.UTC(date.getFullYear(), 0, 1),
dateUtc = Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()),
yday = Math.floor((dateUtc - firstDayOfYearUtc) / 86400000),
weekNum = (yday + 7 - weekday) / 7;
return Math.floor(weekNum);
}
// Get the ordinal suffix for a number: st, nd, rd, or th
function ordinal(number) {
var i = number % 10;
var ii = number % 100;
if ((ii >= 11 && ii <= 13) || i === 0 || i >= 4) {
return 'th';
}
switch (i) {
case 1: return 'st';
case 2: return 'nd';
case 3: return 'rd';
}
}
function getTimestampToUtcOffsetFor(date) {
return (date.getTimezoneOffset() || 0) * 60000;
}
// Tries to get a short timezone name using Date.toLocaleString, falling back on the platform default
// using Date.toString if necessary.
function getTimezoneName(date, localeIdentifier) {
return getShortTimezoneName(date, localeIdentifier) || getDefaultTimezoneName(date);
}
// Unfortunately this returns GMT+2 when running with `TZ=Europe/Amsterdam node test.js` so it's not
// perfect.
function getShortTimezoneName(date, localeIdentifier) {
if (localeIdentifier == null) return null;
var tzString = date
.toLocaleString(localeIdentifier, { timeZoneName: 'short' })
.match(/\s([\w]+)$/);
return tzString && tzString[1];
}
// This varies by platform so it's not an ideal way to get the time zone name. On most platforms it's
// a short name but in Node v10+ and Chrome 66+ it's a long name now. Prefer getShortTimezoneName(date)
// where possible.
function getDefaultTimezoneName(date) {
var tzString = date.toString().match(/\(([\w\s]+)\)/);
return tzString && tzString[1];
}
function warn(message) {
if (typeof console !== 'undefined' && typeof console.warn == 'function') {
console.warn(message)
}
}
}());

271
test.js Executable file
View file

@ -0,0 +1,271 @@
#!/usr/bin/env node
// Based on CoffeeScript by andrewschaaf on github
//
// TODO:
// - past and future dates, especially < 1900 and > 2100
// - look for edge cases
var assert = require('assert'),
libFilename = process.argv[2] || './strftime.js',
strftime = require(libFilename),
strftimeUTC = strftime.utc(),
Time = new Date(1307472705067); // Tue, 07 Jun 2011 18:51:45 GMT
assert.fn = function(value, msg) {
assert.equal(typeof value, 'function', msg);
};
function assertFormat(time, format, expected, name, strftime) {
var actual = strftime(format, time);
assert.equal(actual, expected, name + '("' + format + '", ' + time + ') is ' + JSON.stringify(actual) + ', expected ' + JSON.stringify(expected));
}
assert.format = function(format, expected, expectedUTC, time) {
time = time || Time;
if (expected) { assertFormat(time, format, expected, 'strftime', strftime); }
assertFormat(time, format, expectedUTC || expected, 'strftime.utc()', strftimeUTC);
};
/// check exports
assert.fn(strftime.localize);
assert.fn(strftime.timezone);
assert.fn(strftime.utc);
ok('Exports');
/// time zones
if (process.env.TZ == 'America/Vancouver') {
testTimezone('America/Vancouver');
assert.format('%C', '01', '01', new Date(100, 0, 1));
assert.format('%X', '11:51:45 AM', '06:51:45 PM');
assert.format('%c', 'Tue 07 Jun 2011 11:51:45 AM Pacific Daylight Saving Time', 'Tue 07 Jun 2011 06:51:45 PM GMT');
assert.format('%j', '097', '098', new Date(1365390736236));
assert.format('%x', '06/07/11');
assert.format('%U', '12', null, new Date('2017-03-25 00:00:00 +0000'));
assert.format('%U', '12', '13', new Date('2017-03-26 00:00:00 +0000'));
assert.format('%U', '13', null, new Date('2017-03-27 00:00:00 +0000'));
assert.format('%U', '13', '14', new Date('2017-04-02 00:00:00 +0000'));
// Test dates crossing a DST boundary.
var dstStart = +new Date('2016-11-06 01:50:00');
assert.format('%T', '01:50:00', '08:50:00', new Date(dstStart))
assert.format('%T', '01:00:00', '09:00:00', new Date(dstStart + 10 * 60 * 1000))
ok('Time zones (' + process.env.TZ + ')');
}
else if (process.env.TZ == 'Europe/Amsterdam') {
testTimezone('Europe/Amsterdam');
assert.format('%C', '01', '00', new Date(100, 0, 1));
assert.format('%X', '08:51:45 PM', '06:51:45 PM');
assert.format('%c', 'Tue 07 Jun 2011 08:51:45 PM Central European Summer Time', 'Tue 07 Jun 2011 06:51:45 PM GMT');
assert.format('%j', '098', '098', new Date(1365390736236));
assert.format('%x', '06/07/11');
assert.format('%U', '12', null, new Date('2017-03-25 00:00:00 +0000'));
assert.format('%U', '13', null, new Date('2017-03-26 00:00:00 +0000'));
assert.format('%U', '13', null, new Date('2017-03-27 00:00:00 +0000'));
assert.format('%U', '14', null, new Date('2017-04-02 00:00:00 +0000'));
// Test dates crossing a DST boundary.
var dstStart = +new Date('2016-10-30 02:50:00');
assert.format('%T', '02:50:00', '00:50:00', new Date(dstStart))
assert.format('%T', '02:00:00', '01:00:00', new Date(dstStart + 10 * 60 * 1000))
ok('Time zones (' + process.env.TZ + ')');
}
else {
assert(false, '(Current timezone has no tests: ' + (process.env.TZ || 'none') + ')');
}
/// check all formats in GMT, most coverage
assert.format('%A', 'Tuesday');
assert.format('%a', 'Tue');
assert.format('%B', 'June');
assert.format('%b', 'Jun');
assert.format('%C', '20');
assert.format('%D', '06/07/11');
assert.format('%d', '07');
assert.format('%-d', '7');
assert.format('%_d', ' 7');
assert.format('%0d', '07');
assert.format('%e', ' 7');
assert.format('%F', '2011-06-07');
assert.format('%H', null, '18');
assert.format('%h', 'Jun');
assert.format('%I', null, '06');
assert.format('%-I', null, '6');
assert.format('%_I', null, ' 6');
assert.format('%0I', null, '06');
assert.format('%j', null, '158');
assert.format('%k', null, '18');
assert.format('%L', '067');
assert.format('%l', null, ' 6');
assert.format('%-l', null, '6');
assert.format("%-y", "1", null, new Date('2001-02-03T04:05:06'))
assert.format("%-y", "23", null, new Date('2023-02-03T04:05:06'))
assert.format('%_l', null, ' 6');
assert.format('%0l', null, '06');
assert.format('%M', null, '51');
assert.format('%m', '06');
assert.format('%n', '\n');
assert.format('%o', '7th');
assert.format('%P', null, 'pm');
assert.format('%p', null, 'PM');
assert.format('%R', null, '18:51');
assert.format('%r', null, '06:51:45 PM');
assert.format('%S', '45');
assert.format('%s', '1307472705');
assert.format('%T', null, '18:51:45');
assert.format('%t', '\t');
assert.format('%U', '23');
assert.format('%U', '24', null, new Date(+Time + 5 * 86400000));
assert.format('%u', '2');
assert.format('%v', ' 7-Jun-2011');
assert.format('%W', '23');
assert.format('%W', '23', null, new Date(+Time + 5 * 86400000));
assert.format('%w', '2');
assert.format('%Y', '2011');
assert.format('%y', '11');
assert.format('%Z', null, 'GMT');
assert.format('%z', null, '+0000');
assert.format('%:z', null, '+00:00');
assert.format('%%', '%'); // literal percent sign
assert.format('%g', '%g'); // unrecognized directive
assert.format('%F %T', null, '1970-01-01 00:00:00', new Date(0));
assert.format('%U', null, '12', new Date('2017-03-25 00:00:00 +0000'));
assert.format('%U', null, '13', new Date('2017-03-26 00:00:00 +0000'));
assert.format('%U', null, '13', new Date('2017-03-27 00:00:00 +0000'));
assert.format('%U', null, '14', new Date('2017-04-02 00:00:00 +0000'));
ok('GMT');
/// locales
var it_IT = {
days: words('domenica lunedi martedi mercoledi giovedi venerdi sabato'),
shortDays: words('dom lun mar mer gio ven sab'),
months: words('gennaio febbraio marzo aprile maggio giugno luglio agosto settembre ottobre novembre dicembre'),
shortMonths: words('gen feb mar apr mag giu lug ago set ott nov dic'),
AM: 'it$AM',
PM: 'it$PM',
am: 'it$am',
pm: 'it$pm',
formats: {
D: 'it$%m/%d/%y',
F: 'it$%Y-%m-%d',
R: 'it$%H:%M',
T: 'it$%H:%M:%S',
X: '%T',
c: '%a %b %d %X %Y',
r: 'it$%I:%M:%S %p',
v: 'it$%e-%b-%Y',
x: '%D'
}
};
var strftimeIT = strftime.localize(it_IT),
strftimeITUTC = strftimeIT.utc();
assert.format_it = function(format, expected, expectedUTC) {
if (expected) { assertFormat(Time, format, expected, 'strftime.localize(it_IT)', strftimeIT); }
assertFormat(Time, format, expectedUTC || expected, 'strftime.localize(it_IT).utc()', strftimeITUTC);
};
assert.format_it('%A', 'martedi');
assert.format_it('%a', 'mar');
assert.format_it('%B', 'giugno');
assert.format_it('%b', 'giu');
assert.format_it('%c', null, 'mar giu 07 it$18:51:45 2011');
assert.format_it('%D', 'it$06/07/11');
assert.format_it('%F', 'it$2011-06-07');
assert.format_it('%p', null, 'it$PM');
assert.format_it('%P', null, 'it$pm');
assert.format_it('%R', null, 'it$18:51');
assert.format_it('%r', null, 'it$06:51:45 it$PM');
assert.format_it('%T', null, 'it$18:51:45');
assert.format_it('%v', 'it$ 7-giu-2011');
assert.format_it('%x', null, 'it$06/07/11');
assert.format_it('%X', null, 'it$18:51:45');
ok('Localization');
/// timezones
assert.formatTZ = function(format, expected, tz, time) {
assertFormat(time || Time, format, expected, 'strftime.timezone(' + tz + ')', strftime.timezone(tz));
};
assert.formatTZ('%F %r %z', '2011-06-07 06:51:45 PM +0000', 0);
assert.formatTZ('%F %r %z', '2011-06-07 06:51:45 PM +0000', '+0000');
assert.formatTZ('%F %r %z', '2011-06-07 08:51:45 PM +0200', 120);
assert.formatTZ('%F %r %z', '2011-06-07 08:51:45 PM +0200', '+0200');
assert.formatTZ('%F %r %z', '2011-06-07 11:51:45 AM -0700', -420);
assert.formatTZ('%F %r %z', '2011-06-07 11:51:45 AM -0700', '-0700');
assert.formatTZ('%F %r %z', '2011-06-07 11:21:45 AM -0730', '-0730');
assert.formatTZ('%F %r %:z', '2011-06-07 11:21:45 AM -07:30', '-0730');
ok('Time zone offset');
/// caching
(function() {
// this test fails when the 2 calls cross a millisecond boundary, so try a number of times
var CacheAttempts = 10;
var MaxFailures = 1;
var failures = 0;
for (var i = 0; i < CacheAttempts; ++i) {
var expectedMillis = strftime('%L');
var millis = strftime('%L');
if (expectedMillis != millis) {
++failures;
}
}
if (failures > MaxFailures) {
assert.fail('timestamp caching appears to be broken (' + failures + ' failed attempts out of ' + CacheAttempts + ')');
}
}());
ok('Cached timestamps');
/// helpers
function words(s) { return (s || '').split(' '); }
function ok(s) { console.log('[ \033[32mOK\033[0m ] ' + s); }
// Pass a regex or string that matches the timezone abbrev, e.g. %Z above.
// Don't pass GMT! Every date includes it and it will fail.
// Be careful if you pass a regex, it has to quack like the default one.
function testTimezone(regex) {
regex = typeof regex === 'string' ? RegExp('\\((' + regex + ')\\)$') : regex;
var match = Time.toString().match(regex);
if (match) {
var off = Time.getTimezoneOffset(),
hourOff = off / 60,
hourDiff = Math.floor(hourOff),
hours = 18 - hourDiff,
padSpace24 = hours < 10 ? ' ' : '',
padZero24 = hours < 10 ? '0' : '',
hour24 = String(hours),
padSpace12 = (hours % 12) < 10 ? ' ' : '',
padZero12 = (hours % 12) < 10 ? '0' : '',
hour12 = String(hours % 12),
sign = hourDiff < 0 ? '+' : '-',
minDiff = Time.getTimezoneOffset() - (hourDiff * 60),
mins = String(51 - minDiff),
tz = match[1],
ampm = hour12 == hour24 ? 'AM' : 'PM',
R = hour24 + ':' + mins,
r = padZero12 + hour12 + ':' + mins + ':45 ' + ampm,
T = R + ':45';
assert.format('%H', padZero24 + hour24, '18');
assert.format('%I', padZero12 + hour12, '06');
assert.format('%k', padSpace24 + hour24, '18');
assert.format('%l', padSpace12 + hour12, ' 6');
assert.format('%M', mins);
assert.format('%P', ampm.toLowerCase(), 'pm');
assert.format('%p', ampm, 'PM');
assert.format('%R', R, '18:51');
assert.format('%r', r, '06:51:45 PM');
assert.format('%T', T, '18:51:45');
assert.format('%Z', tz, 'GMT');
assert.format('%z', sign + '0' + Math.abs(hourDiff) + '00', '+0000');
assert.format('%:z', sign + '0' + Math.abs(hourDiff) + ':00', '+00:00');
}
}