Java kiegészítő lecke – Időkülönbség

Csak akkor olvass tovább, ha az Időkülönbség feladatot megoldottad, vagy nem sikerült megoldani.

Az alap feladatot a fenti linken megtalálod, az ott bemeneti adatokat fogom használni. A feladat az volt, hogy határozzuk meg, két időpont között eltelt időt. A forrásadatokat tekintve több helyzet is előfordulhat az alap adatoknál.

Különféle esetek

A vég időpont minden rész adata nagyobb vagy egyenlő a kezdeti időpont megfelelő adataival:

String ido1 = "7:35:40";
String ido2 = "8:35:55";

Csak a későbbi időpont másodperc adata a kisebb:

String ido1 = "7:35:40";
String ido2 = "7:45:25";

Csak a későbbi időpont perc adata a kisebb:

String ido1 = "7:35:40";
String ido2 = "8:25:50";

A későbbinél több adat is kisebb:

String ido1 = "7:35:40";
String ido2 = "9:30:30";

Az adatokat mindegyik esetben fel kell darabolni, az átalakítást a feladat megoldásában is láthattad, a lényeg, hogy legyenek óra-perc-másodperc bontásban a megfelelő adatok. Az óra1, perc1, mperc1 a kezdeti időpont megfelelő adatait jelenti, a vég időpontot ehhez hasonlóan 2-es sorszámmal tárolom.

Az első esetben nincs gond, hiszen a megfelelő adatokat egymásból kivonva megkapjuk a kívánt eredményt. Abban megegyezhetünk, hogy az időkülönbséget másodpercben akarjuk megkapni, mert az könnyen átszámítható bármelyik másikba:

String ido1 = "7:35:40";
String ido2 = "8:35:55";
int kul = (ora2-ora1)*3600 + (perc2-perc1)*60 + mperc2-mperc1;

A különbség 3615, ami hibátlan. De mi van akkor, amikor mondjuk a másodpercnél a későbbi a kisebb? A második esetben pont ilyet látunk. Akkor gondolhatnád, hogy mivel a kisebből vonod ki a nagyobbat, ezért a negatív szám gondot fog jelenteni. Lássuk, így van-e!

String ido1 = "7:35:40";
String ido2 = "7:45:25";
int kul = (ora2-ora1)*3600 + (perc2-perc1)*60 + mperc2-mperc1;

Az eredmény itt 585. Számoljunk akkor, hogy helyes-e. Az órák egyeznek, azzal nincs teendő. A percek különbsége 10, vagyis 600 másodperc, de a másodperceknél a második a kisebb, vagyis a különbségük -15, ami helyes, mert ez korrigálja azt, hogy a percek különbségénél egy picit többel számoltunk. Az eredmény fejben is ellenőrizhető, hiszen a 10 percből 15 másodperc hiányzik, az 600-15.

Másodpercek rendben, mi van, ha a perceknél kisebb a későbbi időpont adata?

String ido1 = "7:35:40";
String ido2 = "8:25:50";
int kul = (ora2-ora1)*3600 + (perc2-perc1)*60 + mperc2-mperc1;

A különbség ebben az esetben 3010 másodperc. Ez pontosan mi is? Láthatod, hogy az órák különbsége 1, vagyis 3600 másodperc lenne. De ebből hiányzik 10 perc, vagyis -600 másodperc, akkor 3000-nál járunk. A másodpercek különbsége pedig 10, vagyis valóban 3010 az eredmény. Az órák különbségénél fennálló hibalehetőséget (nem egész óra) korrigálta a percek negatív eredménye. Vagyis a képlet most is helyes.

És ha az órán kívül mindig a percek és másodpercek adatai is kisebbek a második időpontnál?

String ido1 = "7:35:40";
String ido2 = "9:30:30";
int kul = (ora2-ora1)*3600 + (perc2-perc1)*60 + mperc2-mperc1;

Az eredmény 6890, vezessük is le. Az órák különbsége kettő, vagyis 7200 másodpercről indulunk. A két órából viszont hiányzik 5 perc, ami -300 másodperc, akkor 6900-nál járunk. A másodpercekből pedig 10 hiányzik, vagyis -10 másodperc, azaz, 6890.

Univerzális megoldás

Láthatod, hogy bármilyen esetről is legyen szó, az időkülönbségeket minden esetben azonos módon, egyszerűen megkaphatod. A megoldás a megfelelő időpontok azonos adatainak különbségéből áll össze, melyeket a mértékegységeknek megfelelő szorzással tetszőleges időmértékben kaphatunk meg. A legegyszerűbb talán másodpercekben megkapni, azzal egész könnyű számolni. A megoldás tehát:

kulonbseg = (ora2-ora1)*3600 + (perc2-perc1)*60 + mperc2-mperc1;

Másodpercek átszámítása “rendes” időmértékbe

Az utolsó feladat eredményét adjuk meg óra:perc:másodperc formátumban. A kulcs a maradékos osztás:

String ido1 = "7:35:40";
String ido2 = "9:30:30";
int kulonbseg = (ora2-ora1)*3600 + (perc2-perc1)*60 + mperc2-mperc1;
int ora, perc, mperc, maradek;
ora = kulonbseg / 3600;
maradek = kulonbseg % 3600;
perc = maradek / 60;
maradek = maradek % 60;
mperc = maradek;
System.out.println( ora+":"+perc+":"+mperc );

Azért jó ezt megjegyezni, mert több emelt szintű érettségi feladatban is előfordult hasonló rész feladat. Természetesen ez azt is kezelni tudja, amikor az időpontok más-más naphoz tartoznak, de ott már a hónapfordulókra is figyelni kell, amely kezelésekor már célszerű dátumosztályokat is használni. Ha adott hónapon belül maradunk, akkor az előzőekben ismertetett megoldást kell csak kibővíteni a napokkal.

One Reply to “Java kiegészítő lecke – Időkülönbség”

  1. Pingback: Java egyperces – Időkülönbség megoldása |

Vélemény, hozzászólás?

Az e-mail címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük

*

Ez az oldal az Akismet szolgáltatást használja a spam csökkentésére. Ismerje meg a hozzászólás adatainak feldolgozását .