Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Strip Time Zone from a string using JavaScripty, Moment.js, etc?

Suppose I have a string like "01/22/2014 2:07:00 PM -08:00".

I want to

  • a) Format it in ISO 8601 with time offsets from UTC http://goo.gl/JTfAZq, so it becomes "2014-01-22T14:07:00-08:00"
  • b) Strip out time offset part so it becomes "01/22/2014 2:07:00 PM" [and then format it in ISO 8601 so it becomes "2014-01-22T14:07:00"]

Sure I can use JavaScript string functions (and regular expressions), but it seems to be a better approach to use JavaScript Date() object facilities or Moment.js. Neither work, however. Both automatically convert dates to a current system timezone (-05:00 for me), so 2:07 PM becomes 5:07 PM. I found two ways of doing that "strip out time offset then format" task, but both looks ugly and brittle:

var mydateTime = "01/22/2014 2:07:00 PM -08:00";

// strip out time offset part using substring() so that Moment.js
// would think time is specified in a current zone
var myNewDateTime1 = moment(mydateTime.substring(0, mydateTime.length - 7)).format("YYYY-MM-DDTHH:mm:ss")

// or probably even worse trick - strip out time offset part using format
var myNewDateTime2 = moment(mydateTime, "MM/DD/YYYY h:mm:ss A").format("YYYY-MM-DDTHH:mm:ss")

I understand that JavaScript Date() object is not designed to preserve a time zone, but doesn't more elegant and stable solution exist for a) and b) ?

like image 451
vkelman Avatar asked Jan 24 '14 18:01

vkelman


People also ask

How do you pass timezone to moment?

To add zone data to Moment Timezone, use moment. tz. add . moment.

How do I remove time from moment date?

We can remove the time portion from a date with the startOf method. We pass in a date with the hour and minutes set into the moment function. Then we call startOf with the 'day' argument to get return a moment object with the time set to midnight of the same date.

How do I get timezone offset?

Definition and Usage. getTimezoneOffset() returns the difference between UTC time and local time. getTimezoneOffset() returns the difference in minutes. For example, if your time zone is GMT+2, -120 will be returned.

What is moment tz ()?

For example, if you parse the string '2020/01/02' and then call the moment#tz() method, you're telling moment to parse the string in the locale time, and then convert the date to a given IANA timezone.


1 Answers

I think you are looking for moment.ParseZone. It parses the moment AND preserves the time zone offset that was in the string, instead of converting it to the browser's local time zone.

Also, your myDateTime variable doesn't match what you were asking about. If you do indeed already have a full ISO8601 extended with time zone offfset, then it is like this:

var m = moment.parseZone("2014-01-22T14:07:00-08:00");

Or if it's like you originally, showed, then like this:

var m = moment("01/22/2014 2:07:00 PM -08:00",
               "MM/DD/YYYY h:mm:ss A Z").parseZone();

From there, you can format it however you like:

var s = m.format("YYYY-MM-DDTHH:mm:ss");
like image 106
Matt Johnson-Pint Avatar answered Sep 20 '22 13:09

Matt Johnson-Pint