Kalesh Kaladharan
Kalesh Kaladharan

Reputation: 1058

How to parse time string without offset using Moment?

I have a special use case where application always has to use time in America/Chicago timezone. So I have set Moment default timezone to be moment.tz.setDefault("America/Chicago");.

With this setup, I send all the Date-time inputs from client to server in America/Chicago timezone in js format MM/DD/YYYY h:mm A. And whenever client requests the time field, server returns the time in America/Chicago timezone and in the same format.

Now there is a case where I have to parse this Date-time value returned by server and compare it with current America/Chicago time. I tried this,

moment.tz.setDefault("America/Chicago");

let now = moment();

// serverResponse is America/Chicago datetime string in format MM/DD/YYYY h:mm A

let serverResponseMoment = moment(serverResponse);

// The above statement is where I am facing issue. Since the users could be from
// anywhere, moment(serverResponse) will be assuming the serverResponse string to
// be of the local timezone as there is no offset part attached to the string.

return now.isBefore(serverResponseMoment);

Also tried

let serverResponseMoment = moment.tz(serverResponse,"America/Chicago");

// The above statement assumes the serverResponse to be in UTC and give me an "America/Chicago"
// date-time after conversion

I have also tried moment.utc(serverResponse). All parsing fails when the last condition check is executed.

What I want is a moment instance, in already set default timezone, holding my serverResponse as underlying DateTime.

Or some statement that does this

Hey Moment, serverResponse is already in "America/Chicago" timezone, you don't have to make any sort of timezone assumptions. Just parse it and return an instance of yourself

Any ideas?

Thanks

Upvotes: 0

Views: 218

Answers (1)

fen1x
fen1x

Reputation: 5880

If you already know timezone and string format - you can create your own serverResponse parser:

const momentParserFactory = (format, tz) => (str) => moment.tz(str, format, tz);
const chicagoMoment = momentParserFactory('MM/DD/YYYY h:mm A', 'America/Chicago');

let now = moment();
let serverResponse_1 = '10/07/2019 11:40 AM';
let serverResponseMoment_1 = chicagoMoment(serverResponse_1);

console.log(`"Now" is: ${now.format()}`)
console.log(`Server response date 1: ${serverResponseMoment_1.format()}`);
console.log(`"Now" is before server response date 1: ${now.isBefore(serverResponseMoment_1)}`);

let serverResponse_2 = '10/09/2020 4:20 AM';
let serverResponseMoment_2 = chicagoMoment(serverResponse_2);

console.log(`Server response date 2: ${serverResponseMoment_2.format()}`);
console.log(`"Now" is before server response date 2: ${now.isBefore(serverResponseMoment_2)}`);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment-timezone/0.5.26/moment-timezone-with-data.min.js"></script>

Upvotes: 2

Related Questions