Home > Back-end >  Date.toLocaleString inadequacy for conversion of a date/time to universal time
Date.toLocaleString inadequacy for conversion of a date/time to universal time

Time:08-10

I'm trying to convert a date object to UTC. Either I'm using it wrong or the Date.toLocaleString seems to be broken or inadequate.

new Date('Tue Aug 09 2022 18:43:00 GMT-0500 (Central Daylight Time)')
    .toLocaleString('en-US', {
      timeZone: "UTC",
      day: "2-digit",
      hour12: false,
      year: "numeric",
      month: "2-digit",
      hour: '2-digit',
      minute: '2-digit',
      second: '2-digit',
    })

output:

"08/09/2022, 23:43:00" (A valid date/time)

new Date('Tue Aug 09 2022 19:43:00 GMT-0500 (Central Daylight Time)')
    .toLocaleString('en-US', {
      timeZone: "UTC",
      day: "2-digit",
      hour12: false,
      year: "numeric",
      month: "2-digit",
      hour: '2-digit',
      minute: '2-digit',
      second: '2-digit',
    })

output:

"08/10/2022, 24:43:00"

I expected it to be "08/10/2022, 00:43:00" but instead it appears to not reset the hours.

I have worked around this, in the particular way I was using the result, but I would like to be able to go without the extra conditional and reset.

    var parts = str.match(/(\d{2})\/(\d{2})\/(\d{4}),\s(\d{2})\:(\d{2})\:(\d{2})/),
      month = parseInt(parts[1], 10),
      day = parseInt(parts[2], 10),
      year = parseInt(parts[3], 10),
      hours = parseInt(parts[4], 10),
      minutes = parseInt(parts[5], 10),
      seconds = parseInt(parts[6], 10);

    if (hours == 24) {
      hours = 0;
    }

Why is this happening, and how can I accomplish my goal?

CodePudding user response:

Use hourCycle: "h23" instead of hour12: false in your options. Read more about the options on MDN.

console.log(
  new Date('Tue Aug 09 2022 19:43:00 GMT-0500 (Central Daylight Time)')
  .toLocaleString('en-US', {
    timeZone: "UTC",
    day: "2-digit",
    hourCycle: "h23",
    year: "numeric",
    month: "2-digit",
    hour: '2-digit',
    minute: '2-digit',
    second: '2-digit',
  })
);
.as-console-wrapper { max-height: 100% !important; height: 100%; }

CodePudding user response:

I suppose it's the americain way of displaying time after midnight when using 24-hour (non 12 hour) time. Try using en-UK for locale:

console.log(
  new Date('Tue Aug 09 2022 19:43:00 GMT-0500 (Central Daylight Time)')
  .toLocaleString('en-UK', {
    timeZone: "UTC",
    day: "2-digit",
    hour12: false,
    year: "numeric",
    month: "2-digit",
    hour: '2-digit',
    minute: '2-digit',
    second: '2-digit',
  })
);

  • Related