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');
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.
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.
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')