3

I have a date string in the format 28-Dec-2016 04:25 AM and need to convert it to a Date object. For this, I first split the string to get the date and time

cDateStringParts = cdate.split(' ');

Then I get the date and time components

cDateParts = cDateStringParts[0].split('-');
cTimeParts = cDateStringParts[1].split(':');

Then I initialize the Date object like

if(cDateStringParts[2]=='AM'){
    cDateObject = new Date(cDateParts[2], convertToNumericMonth(cDateParts[1]), cDateParts[0], cTimeParts[0], cTimeParts[1], 0, 0);
} else {
    cDateObject = new Date(cDateParts[2], convertToNumericMonth(cDateParts[1]), cDateParts[0], complaintTimeParts[0] + 12, cTimeParts[1], 0, 0);
}

where convertToNumericMonth() is a function which converts Jan-Dec to 0-11.But I do not get the correct values when I check cDateObject.getDate()/getMonth()/getYear(). The result is 2017/12/29.

What am I doing wrong? If I try to do alert(cdate,' ',cDateObject.getFullYear() I get this:

enter image description here

S_S
  • 1,276
  • 4
  • 24
  • 47

2 Answers2

1

One issue is how 12hr time is converted to 24hr time. The date parts are strings, so for "03:45 PM" the following:

complaintTimeParts[0] + 12

will return "0312". Also, "12:00 AM" should have the hours set to 0, but your code will set the hours to 12.

The hours can be converted to 24hr time by converting to a number first, converting 12am to 0 and then adding 12 if it's PM. Also simpler if done separately from the rest of the calculation:

var hr = cTimeParts[0] % 12 + (cDateStringParts[2]=='AM'? 0 : 12);

Here the mod operator % will convert cTimeParts[0] to a number. Now the function can be:

function dateParse(cdate) {
  var cDateStringParts = cdate.split(' ');
  var cDateParts = cDateStringParts[0].split('-');
  var cTimeParts = cDateStringParts[1].split(':');
  var hr = cTimeParts[0] % 12 + (cDateStringParts[2]=='AM'? 0 : 12);
  return new Date(cDateParts[2], convertToNumericMonth(cDateParts[1]),
                  cDateParts[0], hr, cTimeParts[1]);
}

function convertToNumericMonth(month) {
  return {Jan:0,Feb:1,Mar:2,Apr:3,May:4,Jun:5,Jul:6,
          Aug:7,Sep:8,Oct:9,Nov:10,Dec:11}[month];
}

console.log(dateParse('28-Dec-2016 04:25 AM').toString());
console.log(dateParse('28-Dec-2016 04:25 PM').toString());

Lastly, missing parts are set to 0 (or 1 for the date) so they don't need to be included.

RobG
  • 142,382
  • 31
  • 172
  • 209
0

This link might be a solution for your issue.

you cannot actually rely on the date parsing because, it is dependent on multiple factors like time zones, daylight saving etc.

you could also check your device's time zone and time settings because, the browser uses system data for parsing date.

i have checked the same logic on my browser and it worked fine for me.

here is the example.

AM example

PM example

if it is working this way, the issue would be that the values calculated by cDateParts is generating different values(very less possibility).

hope this would help you.

Community
  • 1
  • 1
Prashanth Benny
  • 1,523
  • 21
  • 33