Moment() . tz 不是函数

在使用 Jasmine 进行测试时,我得到了这个错误。

Moment.tz 不是一个函数

我要测试的代码是

let myDate = moment().tz(undefined, vm.timeZone).format('YYYY-MM-DD');
110657 次浏览

Moment should be a function call. So use let myDate = moment().tz(...)

See https://momentjs.com/timezone/docs/ for more details.

EDIT

You should also ensure that you are including the timezone extension to the moment library either through the correct npm install and require (for Node) or the correct script tags (for general browser usage). See the linked documents for the libraries/scripts to include.

SECOND EDIT

Should anyone have scrolled this far on a question with a +120 accepted answer:

The suggestion that moment was a function and requires brackets refers to the un-edited version of the posted question which had the syntax

let myDate = moment.tz(undefined, vm.timeZone).format('YYYY-MM-DD');

Fix

If you're using Node.js, you may accidentally be using

const moment = require('moment'); //moment

instead of

const moment = require('moment-timezone'); //moment-timezone

Also, make sure you have installed moment-timezone with

npm install moment-timezone --save

Explanation

The bug of requiring moment without timezones could occur by installing moment with require('moment'), later deciding to npm install moment-timezone, and then forgetting to update the require.

Below code for me...

import moment from 'moment';
import 'moment-timezone';

I've encountered this problem too. It works for years, but after a refactor, it doesn't work. As I've investigated, moment-timezone@0.5.13 depends on moment@>=2.9.0, which might be different from moment itself.

In my case, moment-timezone uses moment@2.24.0, and moment itself version is 2.18.1. Causes moment-timezone decorated wrong version of moment.

I've change yarn.lock like this:

moment-timezone@0.5.13:
version "0.5.13"
resolved "https://arti-dev.ss.aws.fwmrm.net/api/npm/fw-npm/moment-timezone/-/moment-timezone-0.5.13.tgz#99ce5c7d827262eb0f1f702044177f60745d7b90"
integrity sha1-mc5cfYJyYusPH3AgRBd/YHRde5A=
dependencies:
moment ">= 2.9.0"


moment@2.18.1, moment@>= 2.9.0:
version "2.18.1"
resolved "https://arti-dev.ss.aws.fwmrm.net/api/npm/fw-npm/moment/-/moment-2.18.1.tgz#c36193dd3ce1c2eed2adb7c802dbbc77a81b1c0f"
integrity sha1-w2GT3Tzhwu7SrbfIAtu8d6gbHA8=


moment & moment-timezone could be used substitute for each other in this case.

For Node.js, According to the original documentation: moment js documentation

You should do

npm install moment-timezone

Then use it like this

var moment = require('moment-timezone');
moment().tz("America/Los_Angeles").format();

for Typescript: Works as of April 2021

import moment from 'moment';
import 'moment-timezone';


cont x = moment.tz('America/Los_Angeles').format('YYYY-MM-DD HH:mm:ss ZZ');


cont y = moment().isBetween(
moment.tz('1-1-2021', 'America/Los_Angeles'),
moment.tz('1-1-2021', 'America/Los_Angeles').add(2, 'hours'),


Error -> TypeError: (0 , moment_timezone_1.default) is not a function

This is typescript error, by default It's take moment as function

I fix this issue, by replacing

import moment from 'moment-timezone'

import * as moment from 'moment-timezone'

moment().tz("America/Los_Angeles").format()

Use: moment-timezone

const moment = require('moment-timezone');
const time = moment.tz(1412144245453, 'America/Los_Angeles').format('MM/DD/YYYY h:mm a');
console.log("time : ", time);

Output: time : 09/30/2014 11:17 pm

Very old thread, but since I also ran into this issue and just as others have pointed out it was working and then stopped working, I tried digging into why it was happening like this?

So I had the following require statement in foo.js

const moment = require('moment');
moment.tz.setDefault('Europe/Berlin');

I ran my project and it worked totally fine, however one of my test files bar.test.js required something from foo.js and when I ran mocha bar.test.js I was presented with TypeError: Cannot read property 'setDefault' of undefined

The reason it worked in foo.js was because somewhere in my project I had done the following

const moment = require('moment-timezone');

and moment-timezone has a dependency on moment. So it loads the moment object first and then adds the additional timezone functionality as sort of a plugin. Then, when I require moment in my foo.js file it picks the object from the cache which has the tz functionality in it. But when I run my test file only, this tz functionality is not added on the moment object and hence it fails

So it is necessary to have require('moment-timezone') instead of require('moment')

I hope this helps