The docs for zone() say:
"As of version 2.1.0, it is possible to set the offset by passing in the number of minutes offset from GMT."
Based on that, I would expect the following to take a time from the Eastern Time Zone and end up the the time expressed in UTC:
console.log("should say 13:00: %s",moment("2014-01-08 8:00 AM").zone(300).toISOString());
However, if you run that an environment where the host time zone is UTC, it will produce the wrong result. (If you run it in Eastern Time, it works). Based on that, it appears that zone(300) is not really "setting the offset" in this case. I'm not sure what's it's doing. The docs should clarify this.
The following works, whether it is run from a host in the UTC time zone or the 'America/Indianapolis' time zone:
console.log("should say 13:00: %s",moment.tz("2014-01-08 8:00 AM","America/Indianapolis").toISOString());
Perhaps the zone() docs should be updated to recommend using moment-timezone() for the kinds of operations it can't reliably handle itself.
It seems like Moment-timezone is going to be a better choice most of the time over zone(), as specific offsets don't take into account daylight savings time, while a time zone declaration like 'America/Indianapolis' will do that.