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.
Pingback: Java egyperces – Időkülönbség megoldása |