TypeError: moment().tz is not a function
JavascriptUnit TestingJasmineMomentjsJavascript Problem Overview
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');
Javascript Solutions
Solution 1 - Javascript
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
.
Solution 2 - Javascript
Below code for me...
import moment from 'moment';
import 'moment-timezone';
Solution 3 - Javascript
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();
Solution 4 - Javascript
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'),
Solution 5 - Javascript
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()
Solution 6 - Javascript
I've encountered this problem too. It works for years, but after a refactor, it doesn't work. As I've investigated, [email protected]
depends on moment@>=2.9.0
, which might be different from moment
itself.
In my case, moment-timezone
uses [email protected]
, 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.
Solution 7 - Javascript
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
Solution 8 - Javascript
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');