web-dev-qa-db-fra.com

Javascript: convertit la chaîne de l'heure 24 heures sur 12 heures avec AM/PM et sans fuseau horaire

Le serveur envoie une chaîne au format suivant: 18:00:00. Il s'agit d'une valeur de l'heure indépendante de toute date. Comment le convertir en 6:00PM en Javascript? Je pourrais ajouter la date d'aujourd'hui sous forme de chaîne à la valeur envoyée par le serveur, puis analyser les valeurs combinées, puis essayer la méthode .toTimeString() de l'objet Date, mais le format que cette méthode émet est une heure de 24 heures avec un bloc de secondes. Je pourrais écrire une fonction, mais y a-t-il quelque chose d'intégré?

19
Tim

Rien de intégré, ma solution serait la suivante:

function tConvert (time) {
  // Check correct time format and split into components
  time = time.toString ().match (/^([01]\d|2[0-3])(:)([0-5]\d)(:[0-5]\d)?$/) || [time];

  if (time.length > 1) { // If time format correct
    time = time.slice (1);  // Remove full string match value
    time[5] = +time[0] < 12 ? 'AM' : 'PM'; // Set AM/PM
    time[0] = +time[0] % 12 || 12; // Adjust hours
  }
  return time.join (''); // return adjusted time or original string
}

tConvert ('18:00:00');

Cette fonction utilise une expression régulière pour valider la chaîne temporelle et la scinder en composants. Notez également que les secondes dans l'heure peuvent éventuellement être omises . Si une heure valide a été présentée, elle est ajustée en ajoutant l'indication AM/PM et en ajustant les heures. 

La valeur de retour est l'heure ajustée si une heure valide a été présentée ou la chaîne d'origine. 

Voir jsFiddle: http://jsfiddle.net/ZDveb/

58
HBP

Pour obtenir AM/PM, vérifiez si la portion horaire est inférieure à 12 heures, puis il est AM, sinon PM.

Pour obtenir l'heure, faites (hour % 12) || 12.

Cela devrait le faire:

var timeString = "18:00:00";
var H = +timeString.substr(0, 2);
var h = H % 12 || 12;
var ampm = (H < 12 || H === 24) ? "AM" : "PM";
timeString = h + timeString.substr(2, 3) + ampm;

http://jsfiddle.net/Skwt7/4/

Cela suppose que les heures AM sont formatées comme, par exemple, 08:00:00. S'ils sont mis en forme sans le zéro de gauche, vous devrez tester la position du premier deux-points:

var hourEnd = timeString.indexOf(":");
var H = +timeString.substr(0, hourEnd);
var h = H % 12 || 12;
var ampm = (H < 12 || H === 24) ? "AM" : "PM";
timeString = h + timeString.substr(hourEnd, 3) + ampm;

http://jsfiddle.net/Skwt7/3/

19
gilly3

Basé sur la réponse de gilly3.

Si vous voulez convertir:

 08:00 to 08:00 AM 
 16:00 to 04:00 PM

Ensuite, cela fonctionnera:

function tConv24(time24) {
  var ts = time24;
  var H = +ts.substr(0, 2);
  var h = (H % 12) || 12;
  h = (h < 10)?("0"+h):h;  // leading 0 at the left for 1 digit hours
  var ampm = H < 12 ? " AM" : " PM";
  ts = h + ts.substr(2, 3) + ampm;
  return ts;
};

https://jsfiddle.net/fpjs9g0L/

4
Hugo

En recherchant la même question, j'ai trouvé plusieurs solutions compliquées et difficiles à comprendre, puis j'ai compris: il existe une solution très simple qui ne repose pas sur des expressions régulières difficiles à lire ni sur d'autres codes complexes. Sauf si quelque chose d’évident me manque, c’est une solution extrêmement simple et facile à comprendre: 

function timeTo12HrFormat(time)
{   // Take a time in 24 hour format and format it in 12 hour format
    var time_part_array = time.split(":");
    var ampm = 'AM';

    if (time_part_array[0] >= 12) {
        ampm = 'PM';
    }

    if (time_part_array[0] > 12) {
        time_part_array[0] = time_part_array[0] - 12;
    }

    formatted_time = time_part_array[0] + ':' + time_part_array[1] + ':' + time_part_array[2] + ' ' + ampm;

    return formatted_time;
}



var time = timeTo12HrFormat(18:00:00);
console.log(time);  // 6:00:00 PM
2
LouInAL
function timeformat(date1) {
  var date=new Date(date1);
  var month = date.toLocaleString('en-us', { month: 'long' });
  var mdate  =date.getDate();
  var year  =date.getFullYear();
  var hours = date.getHours();
  var minutes = date.getMinutes();
  var ampm = hours >= 12 ? 'pm' : 'am';
  hours = hours % 12;
  hours = hours ? hours : 12; // the hour '0' should be '12'
  minutes = minutes < 10 ? '0'+minutes : minutes;
  var strTime = mdate+"-"+month+"-"+year+" "+hours + ':' + minutes + ' ' + ampm;
  return strTime;
}
var ampm=timeformat("2019-01-11 12:26:43");
console.log(ampm);

Ici, la fonction pour convertir l'heure en am ou pm avec Date, ce peut être aider quelqu'un.

0
Rahul Saini

Voici mon chemin en utilisant les déclarations if.

const converTime = (time) => {
  let hour = (time.split(':'))[0]
  let min = (time.split(':'))[1]
  let part = hour > 12 ? 'pm' : 'am';
  
  min = (min+'').length == 1 ? `0${min}` : min;
  hour = hour > 12 ? hour - 12 : hour;
  hour = (hour+'').length == 1 ? `0${hour}` : hour;

  return (`${hour}:${min} ${part}`)
}

console.log(converTime('18:00:00'))
console.log(converTime('6:5:00'))

0
avc

Assurez-vous que votre heure est dans ce format HH: MM: SS (PM/AM)

function timeConversion(s) {

    s = s.split(':');
    var time = s[2];
    if(time.charAt(2) === 'A' && parseInt(s[0]) == 12) s[0] = '00';
    if(time.charAt(2) === 'P' && parseInt(s[0]) <12) s[0] = parseInt(s[0])+12;
    if(s[0] >=24) s[0]-=24;
    var x = time.split('').slice(0,2);
    s[2] = x.join('');
    console.log(s.join(':'));
}
0
Sandeep Ranjan

En supposant que vous obteniez la chaîne de date dans un format approprié, j'ai une solution.

function parseDateTime(dt) {
        var date = false;
        if (dt) {
            var c_date = new Date(dt);
            var hrs = c_date.getHours();
            var min = c_date.getMinutes();
            if (isNaN(hrs) || isNaN(min) || c_date === "Invalid Date") {
                return null;
            }
            var type = (hrs <= 12) ? " AM" : " PM";
            date = ((+hrs % 12) || hrs) + ":" + min + type;
        }
        return date;
    }

    parseDateTime("2016-11-21 12:39:08");//"12:39 AM"
    parseDateTime("2017-11-21 23:39:08");//"11:39 PM"
0

toLocaleTimeString () rend cela très simple. Qu'est-ce que je rate ?

const timeString = '18:00:00'
// Append any date. Use your birthday.
const timeString12hr = new Date('1970-01-01T' + timeString + 'Z')
  .toLocaleTimeString({},
    {timeZone:'UTC',hour12:true,hour:'numeric',minute:'numeric'}
  );
document.getElementById('myTime').innerText = timeString12hr
<h1 id='myTime'></h1>

0
bbsimonbb

Voici quelques variations qui fonctionneront.

const oneLiner = (hour = "00", min = "00", sec = "00") => `${(hour % 12) || 12}:${("0" + min).slice(-2)}:${sec} ${(hour < 12) ? 'am' : 'pm'}`
console.log('oneliner', oneLiner(..."13:05:12".split(":")))



const oneLinerWithObjectInput = ({hour = "00", min = "00", sec = "00"} = {}) => `${(hour % 12) || 12}:${("0" + min).slice(-2)}:${sec} ${(hour < 12) ? 'am' : 'pm'}`
console.log('onelinerWithObjectInput', oneLinerWithObjectInput({
   hour: "13:05:12".split(":")[0],
   min: "13:05:12".split(":")[1],
   sec: "13:05:12".split(":")[2]
}))


const multiLineWithObjectInput = ({hour = "00", min = "00", sec = "00"} = {}) => {
   const newHour = (hour % 12) || 12
       , newMin  = ("0" + min).slice(-2)
       , ampm    = (hour < 12) ? 'am' : 'pm'
   return `${newHour}:${newMin}:${sec} ${ampm}`
}
console.log('multiLineWithObjectInput', multiLineWithObjectInput({
   hour: "13:05:12".split(":")[0],
   min: "13:05:12".split(":")[1],
   sec: "13:05:12".split(":")[2]
}))

0
DrBojingle

Merci à @HBP pour avoir ouvert la voie!

J'ai trouvé que cela ajoute un peu de flexibilité à la solution.

Le RegEx a été mis à jour pour s'adapter aux heures avant midi.

Cette solution vous permet de lui passer n'importe quelle chaîne. Tant qu'une heure valide (au format 18:00 || 18:00:00 || 3:00 || 3:00:00) figure quelque part dans cette chaîne, vous êtes prêt à partir.

Remarque: vous pouvez utiliser uniquement la variable militaryToTweleveHourConverter ou prendre le courage de la variable parseTime. Cependant, je formate une date à partir d'une base de données avec date-fns, puis je passe cette date au convertisseur. 

Totalement fonctionne. J'espère que cela t'aides.

import dateFns from 'date-fns';



//* +---------------------------+
//* Format ex. Sat 1/1/18 1:00pm
//* +---------------------------+
const formatMonthDayYearTime = date =>
  militaryToTweleveHourConverter(
    dateFns.format(new Date(date), 'ddd M/DD/YY H:mm')
  );

//* +-------------------------------+
//* Convert MILITARY TIME to 12 hour
//* +-------------------------------+
const militaryToTweleveHourConverter = time => {
  const getTime = time.split(' ');

  const parseTime = getTime.map(res => {
    // Check for correct time format and split into components or return non-time units unaltered
    let timeUnit = res
      .toString()
      .match(/^([\d]|[0-1]\d|2[0-3])(:)([0-5]\d)(:[0-5]\d)?$/) || [res];

    console.log('timeUnit', timeUnit);
    // If the time format is matched, it will break the components into an array
    // ie. ["19:00", "19", ":", "00", undefined]
    if (timeUnit.length > 1) {
      // Remove full string match value
      timeUnit = timeUnit.slice(1);
      // Set am/pm and assign it to the last index in the array
      timeUnit[5] = timeUnit[0] < 12 ? 'am' : 'pm';
      // Adjust hours by subtracting 12 from anything greater than 12 and replace the value in the hours index
      timeUnit[0] = timeUnit[0] % 12 || 12;
    }
    // return adjusted time or original string
    return timeUnit.join('');
  });
  // Re-assemble the array pieces into a string
  return parseTime.join(' ');
};


console.log(formatMonthDayYearTime('Sat 9/17/18 18:30'));
// console log returns the following
// Mon 9/17/18 6:30pm

console.log(militaryToTweleveHourConverter('18:30'));
// console log returns the following
// 6:30pm

console.log(militaryToTweleveHourConverter('18:30:09'));
// console log returns the following
// 6:30:09pm

console.log(militaryToTweleveHourConverter('8:30:09'));
// console log returns the following
// 8:30:09am
0
jameygleason

Cela pourrait aider à formater si vous utilisez ES6.
L'extrait de code ci-dessous ignorera les secondes. Si vous souhaitez prendre en compte les secondes, vous pouvez l'ajouter comme premier paramètre. 

   const formatFrom24Hrsto12Hrs = (time, ignoreZero = true) => {
      let [hours, minutes] = time.split(':')
      let modifier = +hours < 12 ? 'am' : 'pm'
      hours = +hours % 12 || 12
      minutes = ignoreZero && +minutes === 0 ? '' : `:${minutes}`
      return hours + minutes + modifier
    }
0
Sachin