When testing using jasmine, I am getting this error.
TypeError: moment().tz is not a function
My code that I try to test is:
let myDate = moment().tz(undefined, vm.timeZone).format('YYYY-MM-DD');
When testing using jasmine, I am getting this error.
TypeError: moment().tz is not a function
My code that I try to test is:
let myDate = moment().tz(undefined, vm.timeZone).format('YYYY-MM-DD');
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
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';
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()
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.
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
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');