我正在运行一个基于Google Firebase平台的应用程序,使用多个云功能。一切都很好,但我就是无法实现日期本地化。我做了一个测试函数(见下文(,尝试了我能想到的一切,看看如何从平台中获得正确格式的日期,但都没有成功。
我相信,日期只是不断地被格式化并偏移到UTC(见下面的回复(。
有什么东西我在俯瞰吗?还有其他建议我可以试试吗?
我已经使用Node.js 10(测试版(运行程序在"europe-west1"(实际上应该已经在我想要的时区…:D(中部署了该函数。(我也在Node.js 8中运行了这个函数,得到了相同的结果(截至本文撰写之时,我的依赖项为以下版本:
"date-fns": "^2.11.0",
"firebase-admin": "^8.10.0",
"firebase-functions": "^3.5.0",
"moment": "^2.24.0",
如果有人能照亮这一点,那将是惊人的!
import moment from "moment";
import "moment/locale/nl-be";
import { format, parseISO } from "date-fns";
import nl from "date-fns/locale/nl";
moment.locale("nl-be");
exports.test = functions
.region("europe-west1")
.https.onRequest(async (req, res) => {
const input = "2020-02-04T15:00:00+01:00";
const now = new Date();
return res.status(200).send({
expectedResult: "04/02/2020 15:00",
locales: moment.locales(),
locale: moment.locale(),
original: input,
formatted: moment(input).format(),
basic: moment(input).format("L HH:mm"),
utc: moment.utc(input).format("L HH:mm"),
basicLocal: moment(input).local().format("L HH:mm"),
utcLocal: moment.utc(input).local().format("L HH:mm"),
forcedLocale: moment(input).locale("nl-be").format("L HH:mm"),
utcForcedLocale: moment.utc(input).locale("nl-be").format("L HH:mm"),
parsedDate: parseISO(input),
dateFnsNoLocal: format(parseISO(input), "dd/MM/yyyy HH:mm"),
dateFns: format(parseISO(input), "dd/MM/yyyy HH:mm", {
locale: nl,
}),
now: now.toLocaleString("nl-BE"),
nowMoment: moment(now).format(),
nowMomentFormat: moment(now).format("L HH:mm"),
});
});
响应:
{
"expectedResult": "04/02/2020 15:00",
"locales": [
"en",
"nl-be"
],
"locale": "nl-be",
"original": "2020-02-04T15:00:00+01:00",
"formatted": "2020-02-04T14:00:00+00:00",
"basic": "04/02/2020 14:00",
"utc": "04/02/2020 14:00",
"basicLocal": "04/02/2020 14:00",
"utcLocal": "04/02/2020 14:00",
"forcedLocale": "04/02/2020 14:00",
"utcForcedLocale": "04/02/2020 14:00",
"parsedDate": "2020-02-04T14:00:00.000Z",
"dateFnsNoLocal": "04/02/2020 14:00",
"dateFns": "04/02/2020 14:00",
"now": "4/17/2020, 1:55:52 PM",
"nowMoment": "2020-04-17T13:55:52+00:00",
"nowMomentFormat": "17/04/2020 13:55"
}
当我在代码砂光机中运行代码时,代码会给我正确的结果:https://codesandbox.io/s/nostalgic-germain-b1vty?file=/src/index.js
我终于找到了解决问题的方法,那就是使用moment-timezone
库。强制它转换到特定时区,然后格式化日期。
如果要使用date-fns
本地化和格式化日期,我建议使用日期fns-tz。
你可以用很多方法来解决这个问题,但尽量不要使用moment
和moment-tz
,因为根据他们的文档
我们现在通常认为Moment是一个处于维护模式的遗留项目。它没有死,但确实已经死了。