views:

594

answers:

2

Hi, can anybody spot any mistake in this function? .. This is a function which receives a string of type yyyy-mm-dd hh:mm:ss aa and converts to UTC and builds up a string yyyy-mm-dd hh:mm:ss.

function LocalTimetoUTC(localTime)
{

    var time = localTime.split(" "); //Received :- yyyy-mm-dd hh:mm:ss aa
    var yearday = time[0].split("-");
    var dateTime = time[1].split(":");
    var ampm = time[2];
    var hours = 0;

    var year = yearday[0];
    var month = yearday[1]-1; 
    var day = yearday[2];

    hours = dateTime[0];
    var minutes  = dateTime[1];
    var seconds = dateTime[2];

    /* We have to first convert it to 24 hour format
     * 12:00:00 AM : 00:00:00
     * 12:00:00 PM : 12:00:00 
     * Anytime other than 12
     * 1:00:00 AM   : 1:00:00
     * 1:00:00 PM   : 13:00:00
     */
    if(ampm == "PM")
    {       
        //If it is 12PM, adding 12 will create a problem
        if(hours != 12)
        {
         hours +=12;
        }
    }
    else //AM CASE 
    {   
        if(hours == 12)
        {
         hours = 00;
        }
    }


    var now = new Date(year,month,day,hours,minutes,seconds);

    var utcString = now.getUTCFullYear()+"-"
                  +(now.getUTCMonth()+1)+"-"+now.getUTCDate()+""
                   +now.getUTCHours()+":"+now.getUTCMinutes()+":"+now.getUTCSeconds();

    return utcString;
}
A: 

Yyou should use Datejs for parsing dates

Tim Büthe
A: 

Your primary problem is you are using strings in numeric operations. In addition your output formatting has some problems too. Here is an untested refactoring:-

function convertToUTCString(localTime)
{
  var dateTimeComponents = localTime.split(" ");
  var dateComponent = dateTimeComponents[0].split("-");
  var timeComponent = dateTimeComponents[1].split(":");
  var ampm = dateTimeComponents[2]

  var dat = new Date(parseInt(dateComponent[0]),
    parseInt(dateComponent[1]) -1,
    parseInt(dateComponent[2]),
    parseInt(timeComponent[0]) % 12,
    parseInt(timeComponent[1]),
    parseInt(timeComponent[2]) );

  if (ampm == "PM")  // do all locales use 'AM' / 'PM' ??
  {
    dat.setHours(dat.getHours() + 12);
  }

  function pad(val)
  {
    var s = val.toString();
    return s.length < 2 ? "0" + s : s
  }

  return dat.getUTCFullYear() + "-" +
    pad((dat.getUTCMonth() + 1 )) + "-" + 
    pad(dat.getUTCDate()) + " " + 
    pad(dat.getUTCHours()) + ":" + 
    pad(dat.getUTCMinutes()) + ":" +
    pad(dat.getUTCSeconds());
}
AnthonyWJones
@anthonyYou're the man!..it works :) I guess you're right..I was working with strings AND bad naming. The dat.setHours() is interesting. @luc I wasnt getting any error but my output was garbage. Like month was +1, day was totally random.
uday