web-dev-qa-db-ja.com

Javascript:24時間の時刻文字列をAM / PMでタイムゾーンなしの12時間に変換します

サーバーは、次の形式の文字列を送信しています:_18:00:00_。これは、日付に依存しない時刻値です。 Javascriptでそれを_6:00PM_に変換するには?サーバーから送信された値に文字列として今日の日付を追加し、結合された値を解析してからDateオブジェクトの.toTimeString()メソッドを試すことができますが、timeメソッドが出力する形式は24時間です秒のチャンクで。関数を書くことはできますが、何かが組み込まれていますか?

25
Tim

何も組み込まれていない、私の解決策は次のようになります:

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');

この関数は、正規表現を使用して時間文字列を検証し、それをコンポーネント部分に分割します。また、時間の秒はオプションで省略できることに注意してください。有効な時間が提示された場合、AM/PM表示を追加し、時間を調整することにより調整されます。

戻り値は、有効な時間が提示された場合の調整された時間または元の文字列です。

実施例

(function() {

  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
  }

  var tel = document.getElementById('tests');

  tel.innerHTML = tel.innerHTML.split(/\r*\n|\n\r*|\r/).map(function(v) {
    return v ? v + ' => "' + tConvert(v.trim()) + '"' : v;
  }).join('\n');
})();
<h3>tConvert tests : </h3>
<pre id="tests">
  18:00:00
  18:00
  00:00
  11:59:01
  12:00:00
  13:01:57
  24:00
  sdfsdf
  12:61:54
</pre>
65
HBP

AM/PMを取得するには、時間の部分が12未満であるかどうかを確認し、午前または午後です。

時間を取得するには、(hour % 12) || 12

これはそれを行う必要があります:

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/

AM時間は、たとえば08:00:00。先行ゼロなしでフォーマットされている場合、最初のコロンの位置をテストする必要があります。

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/

22
gilly3

toLocaleTimeString()はこれを非常に単純にします。これを自分で行う必要はありません。文字列メソッドで日付を攻撃しなければ、あなたは幸せになり、長生きします。

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>
7
bbsimonbb

Gilly3の回答に基づきます。

変換する場合:

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

その後、これは動作します:

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/

5
Hugo

この同じ質問を研究すると、いくつかの複雑で理解しにくいソリューションに出くわし、それから私は思いつきました。読みにくい正規表現やその他の複雑なコードに依存しない非常にシンプルなソリューションがあります。明らかな何かを見逃さない限り、これは非常にシンプルで理解しやすいソリューションです。

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);

ここで、Dateで時刻をamまたはpmに変換する関数は、誰かの助けになるかもしれません。

0
Rahul Saini

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

時間の形式が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

適切な形式で日付文字列を取得すると仮定すると、解決策があります。

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"

動作するいくつかのバリエーションがあります。

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

ここに道を開いてくれた@HBPに感謝します!

これにより、ソリューションに柔軟性が少し追加されることがわかりました。

正午までの時間に対応するためにRegExが更新されました。

このソリューションでは、任意の文字列を渡すことができます。有効な時刻(この形式で18:00 || 18:00:00 || 3:00 || 3:00:00)がその文字列のどこかにある限り、準備は万端です。

注:militaryToTweleveHourConverterのみを使用するか、parseTime変数から内臓を取り出すことができます。ただし、データベースの日付をdate-fnsでフォーマットしてから、そのフォーマットされた日付をコンバーターに渡します。

完全に動作します。お役に立てれば。

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

ES6を使用している場合、これはフォーマットに役立つ場合があります。
以下のコードスニペットは秒を無視します。秒を考慮する場合は、最初のパラメーターとして追加できます。

   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

これの簡単なコードは次のようになります

time = time.split(':');// here the time is like "16:14"
let meridiemTime = time[0] >= 12 && (time[0]-12 || 12) + ':' + time[1] + ' PM' || (Number(time[0]) || 12) + ':' + time[1] + ' AM';

時間形式に応じて調整できます

0
akhil singhal