Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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)

like image 286
Omaty Avatar asked Nov 13 '12 17:11

Omaty


People also ask

How do I get a time zone offset?

The JavaScript getTimezoneOffset() method is used to find the timezone offset. It returns the timezone difference in minutes, between the UTC and the current local time. If the returned value is positive, local timezone is behind the UTC and if it is negative, the local timezone if ahead of UTC.

How do I find my UTC offset?

This difference is expressed with respect to UTC and is generally shown in the format ±[hh]:[mm], ±[hh][mm], or ±[hh]. So if the time being described is two hours ahead of UTC (such as in Kigali, Rwanda [approx. 30° E]), the UTC offset would be "+02:00", "+0200", or simply "+02".

How do I get local time from UTC and offset?

Add the local time offset to the UTC time. For example, if your local time offset is -5:00, and if the UTC time is shown as 11:00, add -5 to 11.

What offset 240?

240 is a time zone offset. It's more commonly written as -04:00 (Invert the sign, divide by 60). The US Eastern Time Zone is comprised of both Eastern Standard Time, which has the offset of -05:00 and Eastern Daylight Time, which has the offset of -04:00 .


1 Answers

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.

like image 77
Omaty Avatar answered Oct 04 '22 08:10

Omaty