I think.

Imagine you’ve got a Jasmine spec that tests that a given moment-backed function returns a local hour and day for a given UTC hour and day. It looks something like this:


// DateMath.js
import moment from 'moment';

function getDayHourForClient (utcDay, utcHour) {
    const m = moment.utc().day(utcDay).hours(utcHour).minutes(0).seconds(0);
    const localMoment = moment.unix(m.unix());

    return {
        day: localMoment.day(),
        hour: localMoment.hours(),
    };
};

export default {
    getDayHourForClient,
};

// Tests.js

describe ('A library that returns the local hour and day', () => {
    it ('should return the appropriate hour and day provided a UTC hour and day', () => {
        // Thursdays at 2 a.m. UTC
        const result = DateMath.getDayHourForClient(4, 2);

        // Wednesdays at 8 p.m. Chicago
        expect(result.day).toEqual(3);
        expect(result.hour).toEqual(20);
    });
});


If your computer lives in Chicago, Austin or Omaha, this test is grand. If it lives anywhere else you’re sad.

While Jasmine does provide some utilities for dealing with time-dependent code it doesn’t have an answer for how to run tests in a given timezone context. Enter moment-timezone. Consider the last test with some modifications:


import moment from 'moment-timezone';

describe ('A library that returns the local hour and day', () => {
    it ('should return the appropriate hour and day provided a UTC hour and day', () => {
        moment.tz.setDefault('America/Chicago');

        // Thursdays at 2 a.m. UTC
        const result = DateMath.getDayHourForClient(4, 2);

        // Wednesdays at 8 p.m. Chicago
        expect(result.day).toEqual(3);
        expect(result.hour).toEqual(20);

        moment.tz.setDefault();
    });
});

Yay! Now we’re all in Chicago! moment-timezone provides a way to set a default timezone, meaning that any datetime objects constructed with moment will adhere to the set timezone.