ugrás a tartalomhoz

Idő összeadás

szpistomi · 2009. Dec. 15. (K), 11.48
Sziasztok!

Ismét a közösséghez fordulok segítségért.
Olyan problémám lenne, hogy szeretnék az oldalamon időt (óra:perc) összeadni.
Az idők 2 (vagy több) változóban vannak eltárolva, vagy adatbázisból lekérve, vagy felhasználó által megadva.

A művelet valami ilyesmi lenne:

$ossz_ido = $adatok['time1'] + $adatok['time2'] + $adatok['time3'];
echo $ossz_ido;
Az adatok óó:pp:mm formátumban vannak, de a kimeneten csak egy egész számot kapok. Lényeges lenne, hogy óra percet kapjak vissza (tehát se nap vagy nagyobb osztás, se másodperc), pl. 513:34. Hogyan oldható ez meg?

Előre is köszi a segítséget!
 
2

az strtotime fuggvenyt

duplabe · 2009. Dec. 15. (K), 12.18
az strtotime es date fuggvenyeket ajanlom megtekintesre.
1

string

gphilip · 2009. Dec. 15. (K), 12.17
Hali!

Mivel az adatbázis csatoló (pl mysql-nél) stringként térÍti vissza a TIME tÍpusú mezőket, ezért a PHP is stringként kezeli őket. Összeadás előtt egész számmá alakÍtja az idősztringeket úgy, hogy az első csoportot (a kettőspont előtt) értelmezi számként.

A legegyszerűbb megoldás egy saját függvény Írása a strngek feldolgozására. Nem érdemes ebben az esetben az idő/dátumkezelő függvényekkel szopatnod magad.

Mivel én vagyok a Mikulás, megÍrtam neked:

<?php

function time_add()
{
	$return_parts=array( 0=>0, 1=>0, 2=>0 );
	
	for ( $i=0; $i<func_num_args(); ++$i )
	{
		$parts = func_get_arg( $i );
		$parts = explode( ":", $parts );
		if ( count( $parts ) != 3 ) return false;
		
		$return_parts[0] += $parts[0];
		$return_parts[1] += $parts[1];
		$return_parts[2] += $parts[2];
	}
	
	$return_parts[1] += floor( $return_parts[2] / 60 );
	$return_parts[2] = $return_parts[2] % 60;
	$return_parts[0] += floor( $return_parts[1] / 60 );
	$return_parts[1] = $return_parts[1] % 60;
	
	return implode( ":", $return_parts );
}

echo time_add( "1:00:00", "0:55:55", "0:15:20" );
3

összeadás mktime-mal

Poetro · 2009. Dec. 15. (K), 12.27
$adatok = array(
  'time1' => '2:15:00',
  'time2' => '3:25:00',
  'time3' => '1:10:00',
);
// A mai napon adjuk össze az időket.
$start = mktime(0, 0, 0);
// A kezdeti összeget 0-nak vesszük.
$time = 0;
foreach ($adatok as $name => $adat) {
  if (substr($name, 0, 4) == 'time') {
    // Hozzáadjuk az aktuális időt, amiből levonjuk a kezdetit.
    $time += call_user_func_array('mktime', explode(':', $adat)) - $start;
  }
}
// Kiírjuk az összeget megfelelő formátumban.
print date('h:i:s', $time + $start);
4

Köszönöm!

szpistomi · 2009. Dec. 15. (K), 14.53
Köszi gphilip (alias Mikulás :D) és Poerto!
Mindkét megoldást megnéztem, nagyon jók, bár a második csak 12 órákat ír, ha ennél nagyobb egész óra jön ki a végén, akkor csak az ezen felüli részt írja ki, bár ez módosítható sztem.
A első viszont remek, mivel több helyen is egyszerűen alkalmazható, ha bekerül a "functions.php"-be.

Mégegyszer köszi!

Időközben találtam egy ilyesmi oldalt, de úgy nézem, itt külső JAVA fájlokkal oldotta meg az illető, igen ügyesen:
http://www.miraclesalad.com/webtools/timesheet.php
5

date

Poetro · 2009. Dec. 15. (K), 17.54
Igen, a date függvénynél elrontottam, és 12 órás formátumot ír ki 24 órás helyet... helyesen:
print date('H:i:s', $time + $start);
, különbség csak abban áll, hogy H-t kell írni h helyett.
6

btw

gphilip · 2009. Dec. 15. (K), 19.25
btw mit történik, ha ilyeneket adsz össze?

12:10:00
+
8:20:00
+
21:30:00
+
38:40:00
7

Feladat kiírás

Poetro · 2009. Dec. 15. (K), 20.38
Mivel a feladat szerint csak óra:perc a kérdés, ezért semmi. Mivel ezek nem fedik le a feladat kiírást. Arra teljesen más megoldást kellene csinálni.
8

...

gphilip · 2009. Dec. 15. (K), 20.45
Hát ilyesmin semivel nem veszek össze, de a feladat idő összeadásáról szólt szó szerint, márpedig az idő az idő, lehet 14 óra 28 perc is. :)
9

strtotime

Poetro · 2009. Dec. 15. (K), 21.10
Mostmár azt is támogatja, de teljesen másként működik:
$adatok = array(
  'time1' => '10:15:00',
  'time2' => '29:25:00',
  'time3' => '29:10:00',
);

/**
 * Módosítja az itemet a következő formára:
 * +$item hour|minute|second[s]
 * például: +2 minutes vagy +1 hour.
 */
function timemap(&$item, $key) {
  $keys = array('hour', 'minute', 'second');
  $val = intval($item);
  $item = '+'. $val .' '. $keys[$key] . ($val != 1 ? 's' : '');
}

$time = 0;
foreach ($adatok as $name => $adat) {
  if (substr($name, 0, 4) == 'time') {
    $fragments = explode(':', $adat);
    // Szép időeltéréseket gyártunk az strtotime-nak.
    array_walk($fragments, 'timemap');
    $time += strtotime(implode(' ', $fragments)) - time();
  }
}
$times = array();
foreach (array('s', 'm', 'h') as $fragment) {
  $times[$fragment] = $fragment == 'h' ? $time : $time % 60;
  // Kiegészítjuk 0-val az elejet
  while (strlen(strval($times[$fragment])) < 2)
    $times[$fragment] = '0'. $times[$fragment];
  $time = floor($time / 60);
}
print implode(':', array_reverse($times));

// másodperc nélkül:
array_shift($times);
print implode(':', array_reverse($times));
10

..

carstepPCE · 2009. Dec. 15. (K), 22.02
es ha jol lattam a kerdest feltevo szerette volna meg a 24 oras idoszakot is kiterjeszteni, hisz 500 ora felett volt a minta a kimenetre :-)

Udv
Sanyi
11

time to sec

Kérésre törölve 12. · 2009. Dec. 16. (Sze), 11.20
Én legutóbb átalakítottam másodpercre, összeadtam, majd vissza time formátumra.
12

...

szpistomi · 2009. Dec. 16. (Sze), 12.16
Köszi srácok, nem gondoltam, hogy ennyire beleássátok magatokat. Remek megoldások, megnéztem őket.

carstepPCE jól látta, szeretnék akár több száz órás adatokkal is dolgozni, egyfajta "üzemidő számláló" lesz majd, ezért adtam példának az 500 óra feletti kimenetet. Az első megoldás, "gphilip"-é élből tökéletes volt, már át is ültettem az oldalra.
A konkrét oldalon 6 különböző helyszínen töltött üzemidőt kell összeadni, de az oldal más részén a felhasználó hozzá tud majd adni plusz üzemidőt valamelyik értékhez.

Ezeket a kiegészítő dolgokat azért nem írtam be a kiírásba, mert igazából csak a metódusra voltam kíváncsi, de látva a nagy megmozdulást, nem győzöm megköszönni a társaságnak! Igen ritka az ilyen csapat, legtöbb helyen (név nélkül) csak a "mennyé' olvassá' meg tanuljá' még, aszt utána gyere ide" stílussal találkozok...