Как перевести число во время? - PullRequest
2 голосов
/ 25 октября 2019

Я пытаюсь создать функцию, которая принимает число и возвращает метку времени (ЧЧ: мм), используя date-fns версии 1.30.1 или простой JavaScript.

То, чего я пытаюсь достичь, эточтобы помочь пользователю при вводе времени. Я использую Vue.js для обновления поля, когда пользователь отходит от поля ввода. Поэтому, если пользователь вводит 21, а затем удаляется, в идеале поле должно обновляться до 21: 00.

Некоторые примеры могут быть:

21 = 21:00  
1 = 01:00  
24 = 00:00  
2115 = 21:15  

Числа, подобные 815, не должны возвращать 08:15. Числа, такие как 7889, должны возвращать ошибку.

Я пытался использовать регулярное выражение:

time = time
    .replace(/^([1-9])$/, '0$1')
    .replace(/^([0-9]{2})([0-9]+)$/, '$1:$2')
    .replace(/^24/, '00:00')

Я также пытался использовать метод синтаксического анализа в date-fns, но не могу обернуть головувокруг, как решить эту проблему.

Ответы [ 3 ]

0 голосов
/ 25 октября 2019

Реализация DateFns

ИМХО, работа над добавление и удаление минут и часов - более чистый способ управления этим преобразованием:

function formattedTime(val) {
  let helperDate; 
  if(val.length <= 2) {
   if(val > 24)return 'error';       
   helperDate = dateFns.addHours(new Date(0), val-1);   
   return dateFns.format(helperDate, 'HH:mm');
  }
  if(val.length > 2) {
   let hhmm = val.match(/.{1,2}/g);
   if(hhmm[0] > 24 || hhmm[1] > 60) return 'error';
   helperDate = dateFns.addHours(new Date(0), hhmm[0]-1);
   helperDate = dateFns.addMinutes(helperDate, hhmm[1]);
   return dateFns.format(helperDate, 'HH:mm');
  }
}

const myArr = [21, 1, 24, 2115, 815];

myArr.forEach(
  val => console.log(formattedTime(val.toString()))
)
<script src="https://cdnjs.cloudflare.com/ajax/libs/date-fns/1.30.1/date_fns.min.js"></script>
0 голосов
/ 25 октября 2019

Вы можете использовать первый символ в качестве часа и последний символ в качестве минуты, вы должны добавить 0, если число символов меньше 4.

Когда вам нужен 1 или 0 символдля заполнения как влево, так и вправо.
При наличии 2 или 3 символов вы дополняете только вправо.

time_str = '230'
date = new Date('1970-01-01T' + time_str.slice(0,2).padStart(2,"0") + ':' + time_str.slice(2,4).padEnd(2,"0") + 'Z');
console.log(date)
console.log(("0" + date.getUTCHours()).slice(-2) + ":" + ("0" + date.getUTCMinutes()).slice(-2))

time_str = '24'
date = new Date('1970-01-01T' + time_str.slice(0,2).padStart(2,"0") + ':' + time_str.slice(2,4).padEnd(2,"0") + 'Z');
console.log(date)
console.log(("0" + date.getUTCHours()).slice(-2) + ":" + ("0" + date.getUTCMinutes()).slice(-2))

time_str = '3'
date = new Date('1970-01-01T' + time_str.slice(0,2).padStart(2,"0") + ':' + time_str.slice(2,4).padEnd(2,"0") + 'Z');
console.log(date)
console.log(("0" + date.getUTCHours()).slice(-2) + ":" + ("0" + date.getUTCMinutes()).slice(-2))

time_str = '78'
date = new Date('1970-01-01T' + time_str.slice(0,2).padStart(2,"0") + ':' + time_str.slice(2,4).padEnd(2,"0") + 'Z');
console.log(date)
console.log(("0" + date.getUTCHours()).slice(-2) + ":" + ("0" + date.getUTCMinutes()).slice(-2))
0 голосов
/ 25 октября 2019

Преобразование на основе <100 (только часы) и >=100 (100 * часы + минуты), а также некоторые битвы с 24 и однозначными числами (часы и минуты):

function num2time(num){
  var h,m="00";
  if(num<100)
    h=num;
  else {
    h=Math.floor(num/100);
    m=("0"+(num%100)).slice(-2);
  }
  h=h%24;
  return ("0"+h).slice(-2)+":"+m;
}

console.log(num2time(8));
console.log(num2time(801));
console.log(num2time(24));
console.log(num2time(2401));
console.log(num2time(2115));
console.log(num2time("8"));
console.log(num2time("2115"));

Исходный ответ, сохраняется только для комментария, но не будет правильно обрабатывать 24 или однозначные минуты:

Например, вы можете сделать очень механическое преобразование

function num2time(num){
  if(num<10)
    t="0"+num+":00";
  else if(num<100)
    t=num+":00";
  else {
    if(num<1000)
      t="0"+Math.floor(num/100);
    else if(num<2400)
      t=Math.floor(num/100)
    else
      t="00";
    t+=":"+(num%100);
  }
  return t;
}

console.log(num2time(8));
console.log(num2time(2115));
console.log(num2time("8"));
console.log(num2time("2115"));

Пример проверки:

function num2time(num){
  var h,m="00";
  if(num<100)
    h=num;
  else {
    h=Math.floor(num/100);
    m=("0"+(num%100)).slice(-2);
  }
  if(h<0 || h>24) throw "Hour must be between 0 and 24"
  if(m<0 || m>59) throw "Minute must be between 0 and 59"
  h=h%24;
  return ("0"+h).slice(-2)+":"+m;
}

var numstr=prompt("Enter time code");
while(true) {
  try {
    console.log(num2time(numstr));
    break;
  } catch(ex) {
    numstr=prompt("Enter time code, "+numstr+" is not valid\n"+ex);
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...