Schrift
[thread]8513[/thread]

Zeitangaben addieren: h:min + h:min = ?

Leser: 2


<< >> 9 Einträge, 1 Seite
MartinR
 2006-11-17 15:06
#71829 #71829
User since
2004-06-17
305 Artikel
BenutzerIn
[default_avatar]
Hi,

gibt es eine einfachere Möglichkeit Zeitangaben zu addieren?

Also z.B: 1h40min + 30min + 20min = 2h30min

Ich löse es z.Zt. über Date::Calc. Dafür nehme ich einen fiktiven Tag (1.1.2000 0:00) und addiere nun alle h/min-Werte nacheinander über Add_Delta_DHMS die Werte um dann am Ende das Ergebnis vom fiktiven Startzeitpunkt mit Delta_DHMS wieder abzuziehen. Nun muss ich aber noch, wenn das Ergebnis größer ist als 24h (also 1 Tag) die Tage in Minuten umrechnen und addieren.

Geht es auch einfacher?
murphy
 2006-11-17 17:35
#71830 #71830
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
Ob's einfach ist, wage ich zu bezweifeln, aber es geht natürlich auch von Hand -- zum Beispiel mit Hilfe solch einer Konversionsroutine, die natürlich keine Rücksicht auf Zeitzonen, Schaltsekunden oder ähnliche Hässlichkeiten nimmt ;-)

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
sub timespan2seconds {
my $ts = shift;
my $sc = 0;
if ($ts =~ m/(?:(\d+)\s+)?(\d+):(\d+)(?::(\d+))?/) {
$sc += $1 || 0;
$sc *= 24;
$sc += $2;
$sc *= 60;
$sc += $3;
$sc *= 60;
$sc += $4 || 0;
}
else {
my @pt = $ts =~ m/(\d+)([dhms])/g;
my %sf = (
'd' => 24 * 60 * 60,
'h' => 60 * 60,
'm' => 60,
's' => 1
);
$sc += shift(@pt) * $sf{shift(@pt)} while (@pt);
}
return $sc;
}


Damit gehen dann Berechnungen wie diese:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
my $x = timespan2seconds('1 20:19:33');
print "$x\n";
my $y = timespan2seconds('20h 33s 1d 19m');
print "$y\n";

$x -= timespan2seconds('2d');
$x -= timespan2seconds('34s');
$x -= timespan2seconds('20:19');
$x += timespan2seconds('1d1s');
print "$x\n";

$y += timespan2seconds('4h');
$y -= timespan2seconds('0:19:33');
$y -= timespan2seconds('2d');
print "$y\n";


(edit: Formatierungsfehler korrigiert)\n\n

<!--EDIT|murphy|1163777895-->
When C++ is your hammer, every problem looks like your thumb.
betterworld
 2006-11-17 17:55
#71831 #71831
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
[quote=murphy,17.11.2006, 16:35]Ob's einfach ist, wage ich zu bezweifeln, aber es geht natürlich auch von Hand -- zum Beispiel mit Hilfe solch einer Konversionsroutine, die natürlich keine Rücksicht auf Zeitzonen, Schaltsekunden oder ähnliche Hässlichkeiten nimmt ;-)[/quote]
Wenn man nur Zeiten unabhängig vom Datum addiert, muss (darf) man auch keine Ruecksicht auf Schaltsekunden nehmen. Von daher hat die manuelle Methode einen Vorteil gegenueber Date::Calc. Der gewaehlte Tag 1. 1. 2000 ist aber insofern gut, als die naechste Schaltsekunde erst am 31. 12. 2005 auftritt und daher die Rechnung nur bei Zeiten, die groesser als 6 Jahre sind, verfaelscht. (Da ist die Sommerzeit gefaehrlicher.)\n\n

<!--EDIT|betterworld|1163778939-->
MartinR
 2006-11-18 19:03
#71832 #71832
User since
2004-06-17
305 Artikel
BenutzerIn
[default_avatar]
[quote=betterworld,17.11.2006, 16:55](Da ist die Sommerzeit gefaehrlicher.)[/quote]
Huch,

daran habe ich ja gar nicht gedacht. Zum Glück geht es hier nur um Additionen, die in Summe nur ein paar Stunden ergeben werden (tägliche Arbeitszeiten).
bloonix
 2006-11-18 20:32
#71833 #71833
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
use strict;
use warnings;

my @times = (
'13:45:23',
'14:12:43',
);

my $d = 0; # day
my $h = 0; # hour
my $m = 0; # min
my $s = 0; # sec

foreach my $time (@times) {
  my ($hour, $min, $sec) = split /:/, $time;
  $s += $hour * 3600 + $min * 60 + $sec;
}

$s >= 86400 and $d = sprintf('%i',$s / 86400) and $s = $s % 86400;
$s >= 3600  and $h = sprintf('%i',$s / 3600)  and $s = $s % 3600;
$s >= 60    and $m = sprintf('%i',$s / 60)    and $s = $s % 60;

print "${d}d ${h}h ${m}m ${s}s\n";


1d 3h 58m 6s\n\n

<!--EDIT|opi|1163874815-->
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
betterworld
 2006-11-18 21:34
#71834 #71834
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
[quote=MartinR,18.11.2006, 18:03][quote=betterworld,17.11.2006, 16:55](Da ist die Sommerzeit gefaehrlicher.)[/quote]
daran habe ich ja gar nicht gedacht. Zum Glück geht es hier nur um Additionen, die in Summe nur ein paar Stunden ergeben werden (tägliche Arbeitszeiten).[/quote]
Andererseits steht in der Dokumentation von Date::Calc bei den meisten Subroutinen, dass sie UTC verwenden (zumindest auf Unix). Und in UTC gibt es afaik keine Sommerzeit (wohl aber Schaltsekunden, was ich experimentell mit Date::Calc aber irgendwie nicht nachweisen konnte.)
docsnyder
 2006-11-23 14:31
#71835 #71835
User since
2005-09-08
300 Artikel
BenutzerIn
[Homepage] [default_avatar]
Nur mal so zum Spaß, es geht auch so:

Code: (dl )
1
2
3
4
5
sub addTimes {
return(sprintf("%d %d:%d:%d", $d=int(($ts=((@ta=split(':', $_[0]))[0]*3600+$ta[1]*60+$ta[2]+(@tb=split(':', $_[1]))[0]*3600+$tb[1]*60+$tb[2]))/86400), $h=int(($ts=$ts-($d*86400))/3600), $m=int(($ts=$ts-($h*3600))/60),$s=int(($ts=$ts-($m*60))/60)));
}

print addTimes('13:45:23', '14:12:43') . "\n";


Hihi!

Gruß, Doc
bloonix
 2006-11-23 18:33
#71836 #71836
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
[quote=docsnyder,23.11.2006, 13:31]
Code: (dl )
1
2
3
4
5
sub addTimes {
 return(sprintf("%d %d:%d:%d", $d=int(($ts=((@ta=split(':', $_[0]))[0]*3600+$ta[1]*60+$ta[2]+(@tb=split(':', $_[1]))[0]*3600+$tb[1]*60+$tb[2]))/86400), $h=int(($ts=$ts-($d*86400))/3600), $m=int(($ts=$ts-($h*3600))/60),$s=int(($ts=$ts-($m*60))/60)));
}

print addTimes('13:45:23', '14:12:43') . "\n";
[/quote]
Aber nicht ...

Code: (dl )
print addTimes('13:45:23', '14:12:43', '15:21:23') . "\n";


:p
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
docsnyder
 2006-11-23 19:46
#71837 #71837
User since
2005-09-08
300 Artikel
BenutzerIn
[Homepage] [default_avatar]
@opi

Klar, aber Ziel war ja nur (aus Spieltrieb) die Addition von Zeiten in einer Zeile zu bewerkstelligen.

Wenn es um eine "Liste" von Zeiten geht, könnte ich das auch noch reinbasteln, aber wozu? (was ich wollte, habe ich geschafft)

Greetz, Doc\n\n

<!--EDIT|docsnyder|1164304032-->
<< >> 9 Einträge, 1 Seite



View all threads created 2006-11-17 15:06.