美丽的API都是带刺的玫瑰html
掘金 - 想偷懒的话,toLocaleString 了解一下?node
MDN - Date.prototype.toLocaleString() linux
MDN - Number.prototype.toLocaleString() npm
其实就是在说: 这个API能够省不少事儿, 方便的对时间/数字按照必定格式进行转换, 不用你写正则, 不用你拖库json
以经常使用时间格式: YYYY-MM-DD HH:mm:ss
为例, 一般用库day.js
或者moment.js
来完成api
format('YYYY-MM-DD HH:mm:ss')
复制代码
使用toLocaleString
的话浏览器
new Date()
.toLocaleString('zh', { hour12: false }) // "2019/4/21 13:00:09"
.replace(/\//g, '-') // "2019-4-21 13:00:23"
复制代码
例如: 整数部分每三位加一个逗号, 一般用正则完成bash
const number = 123456789
number.toString().replace(/\B(?=(\d{3})+\b)/g, ',') // "12,345,678"
复制代码
使用toLocaleString
的话app
const number = 123456789
number.toLocaleString() // "12,345,678"
复制代码
上面的一切看着都很美好, 虽然它有浏览器兼容问题, 可是我以为在node.js
中使用的话, 应该是能够把这份美好延续下去的post
可是在一次提交中, 升级了node
版本, 涉及到toLocaleString
的地方都出现了不少问题
FROM node:8.9-alpine
// 更改成
FROM node:lts-alpine
复制代码
打破了这份美好, 测试代码以下
// index.js
console.log("en: " + new Date().toLocaleString('en', { hour12: false }))
console.log("zh: " + new Date().toLocaleString('zh', { hour12: false }))
// Dockerfile
FROM node:8.9-alpine
COPY . /app
CMD ["node", "/app/index.js"]
复制代码
镜像node:8.9-alpine
输出
en: 4/21/2019, 06:42:03
zh: 2019-4-21 06:42:03 (预期)
复制代码
镜像node:10.15-alpine
输出
en: 4/21/2019, 06:43:13
zh: 4/21/2019, 06:43:13
复制代码
镜像node:11.14-alpine
输出
en: 4/21/2019, 06:43:59
zh: 4/21/2019, 06:43:59
复制代码
镜像node:11.14
输出
en: 4/21/2019, 06:46:54
zh: 4/21/2019, 06:46:54
复制代码
本地node.js 11.13
输出, 怪不得本地调试是好的....
en: 4/21/2019, 14:49:27
zh: 2019-4-21 14:49:27
复制代码
Chrome浏览器
en: 4/21/2019, 14:51:33
zh: 2019/4/21 14:51:33
复制代码
Node.js / JavaScript
的许多功能是提供国际化支持的, 例如
String.prototype.normalize()
String.prototype.toLowerCase()
Date.prototype.toLocaleString()
require('buffer').transcode()
...略
Node.js
(及其底层V8引擎)使用ICU实现这些功能
可是要支持世界上全部的语言环境须要一份很是大的ICU数据文件, 而大多数用户仅会使用ICU功能的一小部分, 所以默认状况下Node.js仅提供完整ICU数据集的子集
--with-intl=none/--without-intl
: 禁用全部国际化功能
--with-intl=system-icu
: 取决于系统, 大多数linux发行版都安装了ICU
--with-intl=small-icu
(默认): 完整ICU的一部分, 基本等价于: 仅限英文
--with-intl=full-icu
: 完整的支持
npm i full-icu
, 数据文件将会拷贝在./node_modules/full-icu
,NODE_ICU_DATA
指定运行时的ICU选项env NODE_ICU_DATA=/some/directory node
npm install full-icu
, 确保package.json
中有full-icu
编写以下的Dockerfile
FROM node:lts-alpine
WORKDIR /app
COPY package.json /app
RUN yarn --registry=https://registry.npm.taobao.org
COPY . /app
ENV NODE_ICU_DATA /app/node_modules/full-icu
CMD ["node", "/app/index.js"]
复制代码
输出
en: 4/21/2019, 09:13:13
zh: 2019/4/21 09:13:13
复制代码
虽然和预期2019-4-21 09:13:13
有点区别... 仍是能说明有效吧- -
对于toLocaleString
这个API, 浏览器环境下不兼容问题更多, Node环境下也会出现不一致的问题, 但能够经过设置ICU来解决
从开发角度来讲: API 虽然酷炫, 可是相比之下仍是day.js / momemnt.js更稳定
涉及Node国际化支持的相关知识, 这部分能够参考官方文档Internationalization Support