Omaty
Omaty

Reputation: 445

How to get the timezone offset from a string in Javascript

I receive a date in a string format with an offset, but javascript is converting it to local device time

var d = new Date("2012-11-13T11:34:58-05:00");
debug.log(d);

returns Tue Nov 13 2012 17:34:58 GMT+0100 (CET)

var offset = d.getTimezoneOffset();
debug.log(offset);

returns -60 (my device is utc +1h)

I just want to have the time with the offset, or having the timezone offset mentioned in the string (-5h in the example)

Upvotes: 7

Views: 2530

Answers (2)

Aaron Cole
Aaron Cole

Reputation: 333

I don't think that JavaScript can provide an offset other then the local one as it doesn't know where the time you gave it came from..

So you've given it 2012-11-13T11:34:58-05:00 but no information about where this time originate, it could be the time in anywhere in the world, so it defaults to whatever your local timezone if for the offset.

Upvotes: 0

Omaty
Omaty

Reputation: 445

Well the only solution I've found is to create my custom time object by parsing the string

//ex: 2012-11-13T10:56:58-05:00
function CustomDate(timeString){

    var completeDate = timeString.split("T")[0];
    var timeAndOffset = timeString.split("T")[1];
    //date
    this.year = completeDate.split("-")[0];
    this.month = completeDate.split("-")[1];
    this.day = completeDate.split("-")[2];

    this.date = this.year + "/" + this.month + "/"+this.day;

    //negative time offset
    if (timeAndOffset.search("-") != -1){
        var completeOffset = timeAndOffset.split("-")[1];
        this.offset = parseInt(completeOffset.split(":")[0]) * -1;

        var originalTime = timeAndOffset.split("-")[0];
        this.hours = parseInt(originalTime.split(":")[0]);
        this.minutes = parseInt(originalTime.split(":")[1]);
        this.seconds = parseInt(originalTime.split(":")[2]);

        this.time = this.hours + ":" + this.minutes + ":"+this.seconds;

    }
    ///positive time offset
    else if (timeAndOffset.search(/\+/) != -1){

        var completeOffset = timeAndOffset.split("+")[1];
        this.offset = parseInt(completeOffset.split(":")[0]);

        var originalTime = timeAndOffset.split("+")[0];
        this.hours = parseInt( originalTime.split(":")[0]);
        this.minutes = parseInt(originalTime.split(":")[1]);
        this.seconds = parseInt(originalTime.split(":")[2]);

        this.time = this.hours + ":" + this.minutes + ":"+this.seconds;
    }
    //no time offset declared
    else{
        this.hours = parseInt(timeAndOffset.split(":")[0]);
        this.minutes = parseInt(timeAndOffset.split(":")[1]);
        this.seconds = parseInt(timeAndOffset.split(":")[2]);
        this.offset = 0;

        this.time = this.hours + ":" + this.minutes + ":"+this.seconds;
    }
}

For example if I want to display what is the received time 2012-11-13T11:34:58-05:00 in the specified timezone offset :

var aDate = new CustomDate("2012-11-13T11:34:58-05:00");
alert("date: " + aDate.date +" time: "+aDate.time+" offset: "+aDate.offset);

and I get

date: 2012/11/13 time: 11:34:58 offset: -5

The problem with this solution is that the date and time conventions are defined manually in the code, so they won't be automatically adapted to the user's language.

Upvotes: 2

Related Questions