Jak zapisywać czasy okrążeń w MySQL np. 2:10.602

Odpowiedz Nowy wątek
2019-01-01 13:53
0

Witam serdecznie, jestem tutaj nowy. Interesuje się od niedawna PHP ;)

Natrafiłem na problem, ponieważ tworzę skrypt , który ma wyświetlać punktacje zawodników oraz wyświetlać ich najlepszy czas okrążenia z danego wyścigu.
Pytanie brzmi w jakim formacie zapisywać czasy okrążeń, którę są podawane do 3 miejsc po przecinku np. 2:10.602 to 2 minuty 10 sekund i 602 tysięczne sekundy .

Zapisywać to w bazie MySql w milisekundach 12010602 i potem przetwarzać na taki czas 2:10.602 przez funckcje czy jest na to jakiś prostszy sposób ?
Dopiero zaczynam wprowadzać dane, więc na tym etapie fajnie było by to robić dobrze, no i chcę dobrze filtrować potem po najlepszych czasach itd.

Pozdrawiam i Szczęśliwego Nowego Roku ;)

Pozostało 580 znaków

2019-01-01 14:15
0

IMO zapis w milisekundach jest najlepszym podejściem - da Ci to zarówno dokładność, jak i prostotę w obsłudze.


Pozostało 580 znaków

2019-01-01 14:49
0

Ok mamy taki kod:

$input = 130620; // w minutach to  2:10,602 
/* 
2 min
10 sec
602 tysięczne sec
*/

$uSec = $input % 1000;
$input = floor($input / 1000);

$seconds = $input % 60;
$input = floor($input / 60);

$minutes = $input % 60;
$input = floor($input / 60);

$hour = $input ;

echo sprintf('%02d %02d %02d %03d', $hour, $minutes, $seconds, $uSec);

No i super tylko ja chce dodawać do bazy danych z formularza poprzez wpisanie w pole input wartości dla mnie logicznej czyli:
2:10,602
Chce zaby skrypt przerobił to na milisekundy i dodał do bazy danych bo nie wyobrażam sobie liczenia w pamięci co chwile ;)
teraz jak by to rozbić ? na tablice ?
Rozdziela to w sumie dwukropek .
Nie chce dwóch pół input tylko jedno , które zweryfikuje poprawność .
Raczej nie wystąpi czas powyżej 25minut.

Pozdrawiam

Pozostało 580 znaków

2019-01-01 14:52
0

Możesz przeparsować to np. wyrażeniem regularnym albo rozbić za pomocą explode po : i ,.


edytowany 1x, ostatnio: Patryk27, 2019-01-01 14:52

Pozostało 580 znaków

2019-01-01 15:12
0

Zrobiłem taki kod , czy jest on w miare poprawny ? :

$czas_z_formularza_przed = "2:10.602";
    print_r(explode(':', $czas_z_formularza));

$czas_z_formularza_po = explode(':', $czas_z_formularza_przed);
$minuty = $czas_z_formularza_po[0];
$sekundy = $czas_z_formularza_po[1];

echo "sekundy z tablicy:";
echo $sekundy;
echo "<br><br>";
$minuty = $minuty * 60000;
$sekundy = (float)($sekundy * 1000);
$czas_ms = $minuty + $sekundy;

echo "czas z formularza: $czas_z_formularza_przed <br>";
echo "czas w milisekundach:".$czas_ms." <br>";

Dodam jeszcze warunki , gdybym podał np. błednie czas ponad 60 sekund itp.

Pozostało 580 znaków

2019-01-01 15:40
0

Wykorzystując po drodze floaty niszczysz całą dokładność polegającą na późniejszym zapisie do milisekund (liczby zmiennoprzecinkowe są dosyć specyficzne w działaniu - lepiej ich unikać, o ile nie jest to wymagane).

Może coś takiego (pisane z palca)?

if (preg_match('/^(\d+)\:(\d+)(\.|\,)(\d+)$/', $time, $matches)) {
  var_dump($matches[1]); // "2"
  var_dump($matches[2]); // "10"
  var_dump($matches[3]); // "602"

  $parsedTime = $matches[1] * 60000 + $matches[2] * 1000 + $matches[3];
}

Na margniesie: do pisania i sprawdzania wyrażeń regularnych możesz wykorzystać np. regex101 - ułatwi Ci to zrozumienie sposobu działania tego wyrażenia.


edytowany 2x, ostatnio: Patryk27, 2019-01-01 15:41
Wykorzystanie wyrażeń regularnych pozwoli też na obsługę ciekawszych formatów, np. samego 2:10 (co ciężko zrobić bawiąc się w explodey). - Patryk27 2019-01-01 15:42

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0