mirror of
https://github.com/samsonjs/strftime.git
synced 2026-03-25 09:05:48 +00:00
Compare commits
188 commits
| Author | SHA1 | Date | |
|---|---|---|---|
| f2d5290d28 | |||
| 8db2211a2f | |||
| 774e3ce102 | |||
| e61895af6c | |||
| 8a335897ae | |||
| db1c066f13 | |||
| 6cf7d59a46 | |||
| 53e26ba77d | |||
| a0a62db076 | |||
| 52753479c8 | |||
| 67c02b5352 | |||
|
|
b50d512dee | ||
|
|
6157e8a650 | ||
|
|
51a6ade03d | ||
| 93aaf1eac6 | |||
| 12088240fc | |||
| 3af75444e1 | |||
| 1bee290ce5 | |||
| dee584fda4 | |||
| 5a1db7ba03 | |||
| 000143999d | |||
| ce80bc39e3 | |||
|
|
e0780d045f | ||
| 08a9a4b738 | |||
|
|
06107d286a | ||
| 8a06a30115 | |||
| 52720f64f5 | |||
| d3a2095ca3 | |||
| 793ecfb7b4 | |||
| 0fd891c2ab | |||
| 5e674f0a17 | |||
| 3ed3100018 | |||
| c4967d51e0 | |||
| fd648f7f19 | |||
| efcd086585 | |||
| 2375b9732f | |||
| 335ef2ebe8 | |||
| 1e41e85146 | |||
| e571efe7bb | |||
| 71737c8004 | |||
| a54410d663 | |||
| f6c88d0629 | |||
| 02586fa41e | |||
| 4c747ffa2a | |||
| b4e57a851e | |||
| 2294caa44b | |||
| 65aa4d5ea9 | |||
|
|
f8e5b11c9b | ||
|
|
82a8bfae79 | ||
|
|
fc16548517 | ||
|
|
0d0f90f7eb | ||
| b1629fa333 | |||
|
|
84bad921ab | ||
|
|
f5bb098221 | ||
|
|
58f5c3fee8 | ||
|
|
72a2f418c8 | ||
| a133ab1a4e | |||
|
|
b0659a5f78 | ||
|
|
870e4e3771 | ||
| d6f6e74351 | |||
| b852daca88 | |||
| 93326a4d73 | |||
| a213d716a6 | |||
|
|
29111d3bbb | ||
| 8adfd97924 | |||
| 48d143eb90 | |||
| fe2892ebfa | |||
|
|
aee0e19edc | ||
| 22ddd8982f | |||
| ab3d4a052e | |||
| 603a716bf8 | |||
|
|
067ae77ad9 | ||
|
|
002ac8ca4c | ||
| 1d4365f3d5 | |||
| 30fd95dbba | |||
| 8ba1f03a71 | |||
| dcc5d54c1b | |||
| 765f3f1946 | |||
| 4676d05afe | |||
| 437beabe43 | |||
| 7b1151c7c0 | |||
| 4dcc655477 | |||
| f4a2c852c3 | |||
| affbd8e1cd | |||
| 543e81ca83 | |||
| e6b696cabd | |||
| 1403c1e6a6 | |||
| c6464d0130 | |||
| bfe34d92b5 | |||
| 23cd5feb98 | |||
| 6bf19b4454 | |||
| ff9b94b3d9 | |||
| e3cfa8c497 | |||
| e631d81206 | |||
| 49568677a7 | |||
| c029f7a79e | |||
| d69f82854a | |||
|
|
1222467e47 | ||
|
|
4de2693e51 | ||
| 9146f45142 | |||
|
|
05c64ef5fb | ||
| f7799a1d21 | |||
|
|
b0a4d5a84a | ||
| 9e191bf5c6 | |||
| 14ad6dc902 | |||
| 603326eaed | |||
| 6bc6888fff | |||
| e16f49f4c0 | |||
| 6ab81c89cb | |||
| f1581a3c9d | |||
| f521749967 | |||
| f36819ad99 | |||
|
|
016223fac4 | ||
| 50c183b509 | |||
| c4c5c8d7b5 | |||
| 9923253790 | |||
| 687ad1ec1e | |||
| df17fc85c9 | |||
| 50a267bf23 | |||
|
|
dfeb3f8e97 | ||
|
|
eedbb8b701 | ||
| 90ec02de2c | |||
| cc0bf35fc1 | |||
|
|
9ea642274c | ||
| f3bed1d081 | |||
|
|
a40f44d2d3 | ||
| e130c268d4 | |||
| 41df57b773 | |||
| 78733ba108 | |||
| 0652b285a7 | |||
| 99382d2d5e | |||
| 61f6193e57 | |||
| 0052ee0a0e | |||
| d74f3ef64d | |||
| af7a530b6d | |||
| 303667d059 | |||
| 1633e4007c | |||
| 6912b47d59 | |||
| 24ba42b128 | |||
| 992062064c | |||
| 71e53e7a57 | |||
| 10dc00040e | |||
| 89d187c473 | |||
| 088600d67f | |||
|
|
e02de2786d | ||
|
|
1a649cee74 | ||
|
|
2e6443f394 | ||
|
|
a3ef8f712a | ||
|
|
71d3468fd1 | ||
|
|
f005928d33 | ||
|
|
2796149127 | ||
|
|
8791c074cc | ||
|
|
e18c7abf88 | ||
|
|
71af5de2e3 | ||
|
|
a5e2d305db | ||
|
|
8565e692a1 | ||
|
|
403504a494 | ||
|
|
b38a331c1a | ||
| 5a051ac15c | |||
|
|
163efa1964 | ||
|
|
4bcd6d2a2f | ||
|
|
d75c4eb415 | ||
|
|
a21ff6140b | ||
|
|
17f7d5bb2c | ||
|
|
d7418223fd | ||
|
|
e761363a45 | ||
|
|
b9a29d1643 | ||
|
|
71195bba88 | ||
|
|
64e4ed4834 | ||
|
|
2d63ed7564 | ||
|
|
551bf4b5ad | ||
|
|
5db99eec35 | ||
|
|
36cd2e950d | ||
|
|
81a418573c | ||
|
|
adb5bab532 | ||
|
|
57f3088876 | ||
|
|
f3aab9fa10 | ||
|
|
4643912213 | ||
|
|
dae086e2cf | ||
|
|
3262e038f6 | ||
|
|
c785724655 | ||
|
|
23e349341d | ||
|
|
c93f523951 | ||
|
|
b51b106177 | ||
|
|
7479e192eb | ||
|
|
3d6a02bde2 | ||
|
|
e4a2a3d32a | ||
|
|
ca6ca41766 |
14 changed files with 1721 additions and 366 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
|
@ -1 +1,2 @@
|
|||
*.tmproj
|
||||
node_modules
|
||||
|
|
|
|||
294
Changelog.md
Normal file
294
Changelog.md
Normal 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
18
LICENSE
|
|
@ -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
15
Makefile
Normal 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
|
||||
208
Readme.md
208
Readme.md
|
|
@ -1,52 +1,212 @@
|
|||
strftime
|
||||
========
|
||||
|
||||
strftime for JavaScript, supports localization.
|
||||
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.
|
||||
|
||||
[](https://www.npmjs.com/package/strftime)
|
||||
[](https://nodejs.org)
|
||||
[](https://sjs.mit-license.org)
|
||||
[](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 <script> 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('%B %d, %y %H:%M:%S')) // => April 28, 2011 18:21:08
|
||||
```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
|
||||
```
|
||||
|
||||
|
||||
If you want to localize it:
|
||||
|
||||
var strftime = require('strftime').strftime
|
||||
```JavaScript
|
||||
var strftime = require('strftime') // not required in browsers
|
||||
var 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' ],
|
||||
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'
|
||||
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'
|
||||
}
|
||||
}
|
||||
console.log(strftime('%B %d, %y %H:%M:%S', it_IT)) // => aprile 28, 2011 18:21:08
|
||||
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
|
||||
```
|
||||
|
||||
And if you don't want to pass a localization object every time you can get a localized `strftime` function like so:
|
||||
Some locales are bundled and can be used like so:
|
||||
|
||||
var strftime = require('strftime')
|
||||
var it_IT = { /* same as above */ }
|
||||
var strftime_IT = strftime.localizedStrftime(it_IT)
|
||||
console.log(strftime_IT('%B %d, %y %H:%M:%S')) // aprile 28, 2011 18:21:08
|
||||
```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
|
||||
```
|
||||
|
||||
For details just see `man 3 strftime` as the format specifiers are identical.
|
||||
_The [full list of bundled locales](#locales) is below._
|
||||
|
||||
**NOTE:** `getLocalizedStrftime` is deprecated, use `localizedStrftime` instead. `getLocalizedStrftime` will be removed in 0.5 or 0.6.
|
||||
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 - 2011 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
13
bower.json
Normal 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
16
component.json
Normal 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"
|
||||
]
|
||||
}
|
||||
156
lib/index.js
156
lib/index.js
|
|
@ -1,156 +0,0 @@
|
|||
/// strftime
|
||||
/// https://github.com/samsonjs/strftime
|
||||
/// @_sjs
|
||||
///
|
||||
/// Copyright 2010 - 2011 Sami Samhuri <sami.samhuri@gmail.com>
|
||||
/// MIT License
|
||||
|
||||
;(function() {
|
||||
|
||||
//// Export the API
|
||||
var namespace;
|
||||
|
||||
// CommonJS / Node module
|
||||
if (typeof exports !== 'undefined') {
|
||||
namespace = exports;
|
||||
}
|
||||
|
||||
// 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 = strftime;
|
||||
namespace.strftimeUTC = strftimeUTC;
|
||||
namespace.localizedStrftime = localizedStrftime;
|
||||
namespace.getLocalizedStrftime = function(locale) {
|
||||
console.log('[strftime] DEPRECATION NOTICE: getLocalizedStrftime is deprecated, use localizedStrftime instead');
|
||||
return (namespace.getLocalizedStrftime = localizedStrftime)(locale);
|
||||
};
|
||||
////
|
||||
|
||||
function words(s) { return (s || '').split(' '); }
|
||||
|
||||
var DefaultLocale =
|
||||
{ days: words('Sunday Monday Tuesday Wednesday Thursday Friday Saturday')
|
||||
, shortDays: words('Sun Mon Tue Wed Thu Fri Sat')
|
||||
, months: words('January February March April May June July August September October November December')
|
||||
, shortMonths: words('Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec')
|
||||
, AM: 'AM'
|
||||
, PM: 'PM'
|
||||
}
|
||||
|
||||
function strftime(fmt, d, locale) {
|
||||
return _strftime(fmt, d, locale, false);
|
||||
}
|
||||
|
||||
function strftimeUTC(fmt, d, locale) {
|
||||
return _strftime(fmt, d, locale, true);
|
||||
}
|
||||
|
||||
function localizedStrftime(locale) {
|
||||
return function(fmt, d) {
|
||||
return strftime(fmt, d, locale);
|
||||
};
|
||||
}
|
||||
|
||||
// locale is an object with the same structure as DefaultLocale
|
||||
function _strftime(fmt, d, locale, _useUTC) {
|
||||
// d and locale are optional so check if d is really the locale
|
||||
if (d && !(d instanceof Date)) {
|
||||
locale = d;
|
||||
d = undefined;
|
||||
}
|
||||
d = d || new Date();
|
||||
locale = locale || DefaultLocale;
|
||||
locale.formats = locale.formats || {};
|
||||
var msDelta = 0;
|
||||
if (_useUTC) {
|
||||
msDelta = (d.getTimezoneOffset() || 0) * 60000;
|
||||
d = new Date(d.getTime() + msDelta);
|
||||
}
|
||||
|
||||
// Most of the specifiers supported by C's strftime, and one from Ruby (%L)
|
||||
return fmt.replace(/%(.)/g, function(_, c) {
|
||||
switch (c) {
|
||||
case 'A': return locale.days[d.getDay()];
|
||||
case 'a': return locale.shortDays[d.getDay()];
|
||||
case 'B': return locale.months[d.getMonth()];
|
||||
case 'b': // fall through
|
||||
case 'h': return locale.shortMonths[d.getMonth()];
|
||||
case 'D': return _strftime(locale.formats.D || '%m/%d/%y', d, locale);
|
||||
case 'd': return pad(d.getDate());
|
||||
case 'e': return d.getDate();
|
||||
case 'F': return _strftime(locale.formats.F || '%Y-%m-%d', d, locale);
|
||||
case 'H': return pad(d.getHours());
|
||||
case 'I': return pad(hours12(d));
|
||||
case 'k': return pad(d.getHours(), ' ');
|
||||
case 'L': return pad(Math.floor(d.getTime() % 1000), 3);
|
||||
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 ? locale.AM : locale.PM;
|
||||
case 'R': return _strftime(locale.formats.R || '%H:%M', d, locale);
|
||||
case 'r': return _strftime(locale.formats.r || '%I:%M:%S %p', d, locale);
|
||||
case 'S': return pad(d.getSeconds());
|
||||
case 's': return Math.floor((d.getTime() - msDelta) / 1000);
|
||||
case 'T': return _strftime(locale.formats.T || '%H:%M:%S', d, locale);
|
||||
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(locale.formats.v || '%e-%b-%Y', d, locale);
|
||||
case 'w': return d.getDay(); // 0 - 6, Sunday is first day of the week
|
||||
case 'Y': return d.getFullYear();
|
||||
case 'y':
|
||||
var y = String(d.getFullYear());
|
||||
return y.slice(y.length - 2);
|
||||
case 'Z':
|
||||
if (_useUTC) {
|
||||
return "GMT";
|
||||
}
|
||||
else {
|
||||
var tz = d.toString().match(/\((\w+)\)/);
|
||||
return tz && tz[1] || '';
|
||||
}
|
||||
case 'z':
|
||||
if (_useUTC) {
|
||||
return "+0000";
|
||||
}
|
||||
else {
|
||||
var off = d.getTimezoneOffset();
|
||||
return (off < 0 ? '+' : '-') + pad(off / 60) + pad(off % 60);
|
||||
}
|
||||
default: return c;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Default padding is '0' and default length is 2, both are optional.
|
||||
function pad(n, padding, length) {
|
||||
|
||||
// pad(n, <length>)
|
||||
if (typeof padding === 'number') {
|
||||
length = padding;
|
||||
padding = '0';
|
||||
}
|
||||
|
||||
// Defaults handle pad(n) and pad(n, <padding>)
|
||||
padding = padding || '0';
|
||||
length = length || 2;
|
||||
|
||||
var s = String(n);
|
||||
while (s.length < length) s = padding + s;
|
||||
return s;
|
||||
}
|
||||
|
||||
function hours12(d) {
|
||||
var hour = d.getHours();
|
||||
if (hour == 0) hour = 12;
|
||||
else if (hour > 12) hour -= 12;
|
||||
return hour;
|
||||
}
|
||||
|
||||
}());
|
||||
17
package-lock.json
generated
Normal file
17
package-lock.json
generated
Normal 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"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
49
package.json
49
package.json
|
|
@ -1,9 +1,39 @@
|
|||
{
|
||||
"name": "strftime",
|
||||
"description": "strftime for JavaScript",
|
||||
"version": "0.4.6",
|
||||
"homepage": "http://samhuri.net/proj/strftime",
|
||||
"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"
|
||||
|
|
@ -12,19 +42,12 @@
|
|||
"email": "sami@samhuri.net",
|
||||
"url": "https://github.com/samsonjs/strftime/issues"
|
||||
},
|
||||
"directories": {
|
||||
"lib": "./lib"
|
||||
},
|
||||
"main": "./lib/index",
|
||||
"main": "./strftime.js",
|
||||
"engines": {
|
||||
"node": ">=0.2.0"
|
||||
},
|
||||
"licenses": [
|
||||
{
|
||||
"type": "MIT",
|
||||
"url": "http://github.com/samsonjs/strftime/raw/master/LICENSE"
|
||||
}
|
||||
],
|
||||
"license": "MIT",
|
||||
"dependencies": {},
|
||||
"devDependencies": {}
|
||||
"devDependencies": {},
|
||||
"optionalDependencies": {}
|
||||
}
|
||||
21
strftime-min.js
vendored
Normal file
21
strftime-min.js
vendored
Normal 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
853
strftime.js
Normal 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
271
test.js
Executable 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');
|
||||
}
|
||||
}
|
||||
155
test/test.js
155
test/test.js
|
|
@ -1,155 +0,0 @@
|
|||
// Based on CoffeeScript by andrewschaaf on github
|
||||
|
||||
// TODO:
|
||||
// - past and future dates, especially < 1900 and > 2100
|
||||
// - locales
|
||||
// - look for edge cases
|
||||
|
||||
var assert = require('assert')
|
||||
, lib = require('./../lib')
|
||||
|
||||
// Tue, 07 Jun 2011 18:51:45 GMT
|
||||
, Time = new Date(1307472705067)
|
||||
|
||||
assert.fn = function(value, msg) {
|
||||
assert.equal('function', typeof value, msg)
|
||||
}
|
||||
|
||||
assert.format = function(format, expected, expectedUTC) {
|
||||
function _assertFmt(expected, name) {
|
||||
name = name || 'strftime'
|
||||
var actual = lib[name](format, Time)
|
||||
assert.equal(expected, actual,
|
||||
name + '("' + format + '", Time) is ' + JSON.stringify(actual)
|
||||
+ ', expected ' + JSON.stringify(expected))
|
||||
}
|
||||
|
||||
if (expected) _assertFmt(expected)
|
||||
_assertFmt(expectedUTC || expected, 'strftimeUTC')
|
||||
}
|
||||
|
||||
/// check exports
|
||||
assert.fn(lib.strftime)
|
||||
assert.fn(lib.strftimeUTC)
|
||||
assert.fn(lib.getLocalizedStrftime)
|
||||
|
||||
/// time zones
|
||||
testTimezone('P[DS]T')
|
||||
|
||||
/// 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('%D', '06/07/11')
|
||||
assert.format('%d', '07')
|
||||
assert.format('%e', '7')
|
||||
assert.format('%F', '2011-06-07')
|
||||
assert.format('%H', null, '18')
|
||||
assert.format('%I', null, '06')
|
||||
assert.format('%k', null, '18')
|
||||
assert.format('%L', '067')
|
||||
assert.format('%l', null, ' 6')
|
||||
assert.format('%M', null, '51')
|
||||
assert.format('%m', '06')
|
||||
assert.format('%n', '\n')
|
||||
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', '2')
|
||||
assert.format('%v', '7-Jun-2011')
|
||||
assert.format('%w', '2')
|
||||
assert.format('%Y', '2011')
|
||||
assert.format('%y', '11')
|
||||
assert.format('%Z', null, 'GMT')
|
||||
assert.format('%z', null, '+0000')
|
||||
assert.format('%%', '%') // any other char
|
||||
|
||||
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'
|
||||
, formats: {
|
||||
D: 'it$%m/%d/%y'
|
||||
, F: 'it$%Y-%m-%d'
|
||||
, R: 'it$%H:%M'
|
||||
, r: 'it$%I:%M:%S %p'
|
||||
, T: 'it$%H:%M:%S'
|
||||
, v: 'it$%e-%b-%Y'
|
||||
}
|
||||
}
|
||||
|
||||
assert.format_it = function(format, expected, expectedUTC) {
|
||||
function _assertFmt(expected, name) {
|
||||
name = name || 'strftime'
|
||||
var actual = lib[name](format, Time, it_IT)
|
||||
assert.equal(expected, actual,
|
||||
name + '("' + format + '", Time) is ' + JSON.stringify(actual)
|
||||
+ ', expected ' + JSON.stringify(expected))
|
||||
}
|
||||
|
||||
if (expected) _assertFmt(expected)
|
||||
_assertFmt(expectedUTC || expected, 'strftimeUTC')
|
||||
}
|
||||
|
||||
assert.format_it('%A', 'martedi')
|
||||
assert.format_it('%a', 'mar')
|
||||
assert.format_it('%B', 'giugno')
|
||||
assert.format_it('%b', 'giu')
|
||||
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('%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')
|
||||
|
||||
ok('Locales')
|
||||
|
||||
|
||||
/// 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 hourDiff = Math.floor(Time.getTimezoneOffset() / 60)
|
||||
, hours = String(18 - hourDiff)
|
||||
, sign = hourDiff < 0 ? '+' : '-'
|
||||
, minDiff = Time.getTimezoneOffset() - (hourDiff * 60)
|
||||
, mins = String(51 - minDiff)
|
||||
, R = hours + ':' + mins
|
||||
, tz = match[1]
|
||||
assert.format('%H', hours, '18')
|
||||
assert.format('%I', hours, '06')
|
||||
assert.format('%k', hours, '18')
|
||||
assert.format('%l', hours, ' 6')
|
||||
assert.format('%M', mins)
|
||||
assert.format('%p', 'AM', 'PM')
|
||||
assert.format('%R', R, '18:51')
|
||||
assert.format('%r', R + ':45 AM', '06:51:45 PM')
|
||||
assert.format('%T', R + ':45', '18:51:45')
|
||||
assert.format('%Z', tz, 'GMT')
|
||||
assert.format('%z', sign + '0' + hourDiff + '00', '+0000')
|
||||
ok(tz)
|
||||
}
|
||||
}
|
||||
Loading…
Reference in a new issue