Jump to content

Formatação de Time para formato HH:MM:SS e vice-versa


Recommended Posts

Posted

Boas, tenho a seguinte função para transformar uma string, num formato MYSQL TIME correcto (HH:MM:SS)

o que venho aqui perguntar é uma forma de fazer melhor possivelmente, pois embora funcione, acho que fiz de forma um pouco arbitrária

aqui fica a função:

   public function parseLength($length){
    $length = preg_replace("/^([\d]{1,2})\[\d]{2})$/", "00:$1:$2", $length);
    sscanf($length, "%d:%d:%d");
    return  date('H:i:s',strtotime($length));
   }

o que preciso é que pegue em strings num destes possiveis formatos:

01:23:45

00:12:34

12:34

2:34

e que converta no HH:MM:SS correspondente:

01:23:45

00:12:34

00:12:34

00:02:34

e já agora, qual a melhor maneira de fazer "trim" aos 00 inutilizados?

digo, imaginando que temos a string 00:02:34, mostrar apenas 02:34

obrigado, isto sao coisas que já fiz, mas quero reavaliar se existe uma melhor forma, obrigado 🙂

B2R » Beat2Revolution v3.0b | Regista e divulga-nos

beat2revolution.net
Posted (edited)

uma solução :

<?php
echo "<pre>";
$values = array('01:23:45', '00:12:34', '12:34', '2:34');
array_walk($values, function(&$item) {
   $item = strpos($item, ':') == strrpos($item, ':') ?
               date("H:i:s", strtotime('00:'.$item)) :
               date("H:i:s", strtotime($item));
});
print_r($values);

array_walk($values, function(&$item) {
   while (strpos($item, '00:') === 0)
       $item = substr($item, 3);
});
print_r($values);
echo "</pre>";
?>
Edited by HappyHippyHippo
  • Vote 1
IRC : sim, é algo que ainda existe >> #p@p
Posted

Creio que funciona como pretendes.

$time = '2:34';
list($h, $m, $s) = (strlen($time) != 8 ? explode(':', '00:' . $time) : explode(':', $time));
echo gmdate('H:i:s', ($h * 3600) + ($m * 60) + $s);

sim, funciona para todos os formatos apresentados pelo I-NOZex (também conhecido como antigo CTRF agora Unsigned User ...)

mas existe um caso particular que não sei se é para ter em conta:

$time = '1:23:45'
  • Vote 1
IRC : sim, é algo que ainda existe >> #p@p
Posted

Bem, leva mais uma condição lá pó meio..mas se calhar já começa a ficar um pouco confuso..e talvez já não se seja tão good-looking. 😁

list($h, $m, $s) = (strlen($time) != 8 ? (strlen($time) == 7 ? explode(':', '0' . $time) : explode(':', '00:' . $time)) : explode(':', $time));
  • Vote 1
Posted (edited)

Se esses tipos de input ('1:1:1') forem válidos, então o meu código anula-se.

como disse acima ... não sei se é válido ou não ...

ps : se é para um 1-liner:

echo "<pre>";

$values = array('01:23:45',
               '1:23:45',
               '1:2:3',
               '00:12:34',
               '12:34',
               '2:34',
               '34');
array_walk($values, function(&$item) {
   $item = date('H:i:s', strtotime(str_repeat('0:', 2 - substr_count($item, ':')).$item));
});
print_r($values);

echo "</pre>";

resultado

Array
(
   [0] => 01:23:45
   [1] => 01:23:45
   [2] => 01:02:03
   [3] => 00:12:34
   [4] => 00:12:34
   [5] => 00:02:34
   [6] => 00:00:34
)
Edited by HappyHippyHippo
IRC : sim, é algo que ainda existe >> #p@p
Posted (edited)

I-NOZex (também conhecido como antigo CTRF agora Unsigned User ...)

CLRF amico 😁

peço desculpa pela demora

sim, esqueci-me de referir

uma entrada do genero 1:23:19 é considerada válida e deve ser convertida para o formato correto

1:2:3 cria demasiada redundancia de dados, pelo que tenho ideias de nao tornar valida

resumindo, o 1º zero da entrada pode ser ignorado: 34 = 34 segundos; 2:10 (2minutos e 10seg); 1:02:34 (1h,2min,34seg)

esse teu ultimo codigo é o que recomendas entao happyhippo?

e quanto a "anulaçao" dos leading zeros recomendas a segunda parte do codigo da tua primeira resposta?

anyway, obrigado a ambos, happy e bioshock pelas vossas opinioes 😄

entretanto precisava de ajuda com outra coisa, agora ja nao é tao php, mas ainda é a questao das formatações

como fazer mask a um input field, de modo a puder inserir-se 9.99 ou 99.99 ou 999.99 (é um campo para inserir um tamanho em MB)

ou seja, pode ser 1.05 (mb), 11.7, 234.56...

tinha grande preferencia que fosse usa solução com base neste plugin http://digitalbush.com/projects/masked-input-plugin/

obrigado desde ja 🙂

Edited by I-NOZex

B2R » Beat2Revolution v3.0b | Regista e divulga-nos

beat2revolution.net
Posted

É um bocado desnecessário a utilização de um plugin para obteres o que pretendes. Com regex fazes bem isso.

^[0-9]+(\.)?[0-9]{0,2}$

E se precisares de vírgulas

^[0-9]+(\.|,)?[0-9]{0,2}$

Mas pelo que estive a ler, acho que o plugin te permite ter regex.

http://stackoverflow.com/questions/17995998/masked-input-plugin-and-regular-expressions-for-decimal-numbers

http://stackoverflow.com/questions/4787763/allowing-dash-with-jquery-masked-input-plugin

http://stackoverflow.com/questions/9667836/jquerys-maskedinput

Posted

esse teu ultimo codigo é o que recomendas entao happyhippo?

sim, como podes ver o resultado dos testes, passou a tudo ...

e quanto a "anulaçao" dos leading zeros recomendas a segunda parte do codigo da tua primeira resposta?

sim, é a mais simples

tinha grande preferencia que fosse usa solução com base neste plugin http://digitalbush.com/projects/masked-input-plugin/

obrigado desde ja 🙂

só testando ... nunca usei esse plugin

IRC : sim, é algo que ainda existe >> #p@p
Posted (edited)

thanks @happyhippyhippo

@bishock a framework (YII) tem um maskedinput baseado nesse plugin, dai a minha preferencia

é que eu queria por um lado facilitar a inserção dos dados para o utilizador, e por outro, facilitar a validação

o "problema" desse plugin, é que eu penso que ele nao permite ter apenas uma parte opcional, tudo que esteja á direita do ? passa a opcional

ou seja, se um meter uma mask ?999.99 vai ser tudo opcional, eu so queria que o 1º caracter fosse opcional...

Edited by I-NOZex

B2R » Beat2Revolution v3.0b | Regista e divulga-nos

beat2revolution.net

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.