Ohjelmointi

Työskentely Java-aikaa

Tämä artikkeli perustuu Java Datesin laskeminen -artikkelin (JavaWorld, 29. joulukuuta 2000). Tässä olen luetellut joitain avainkohtia tuosta artikkelista, joiden pitäisi olla tuttu sinulle. Jos nämä kohdat eivät ole sinulle selkeitä, suosittelen, että luet lisätietoja "Java-päivämäärien laskeminen" saadaksesi lisätietoja.

  1. Java laskee ajan millisekunteina ennen 1. tammikuuta 1970 tai sen jälkeen.
  2. Päivämäärä luokan rakentaja Päivämäärä() palauttaa objektin, joka edustaa objektin luomishetkeä. Päivämääräon getTime () method palauttaa a pitkä arvo, jonka lukumäärä vastaa millisekuntien lukumäärää ennen 1. tammikuuta 1970 tai sen jälkeen.
  3. Päivämäärämuoto luokkaa käytetään muuntamiseen Päivämääräs Merkkijonos ja päinvastoin. Staattinen getDateInstance () method palauttaa a Päivämäärämuoto objekti oletusmuodossa; getDateInstance (DateFormat.FIELD) palauttaa a Päivämäärämuoto objekti määritetyssä muodossa. muoto (päivämäärä d) method palauttaa a Merkkijono joka edustaa päivämäärää, kuten "1. tammikuuta 2002". Päinvastoin jäsentää (merkkijonot) method palauttaa a Päivämäärä objektin päivämäärän perusteella Merkkijono argumentti edustaa.
  4. Ulkonäkö Merkkijonos palautti muoto() menetelmä voi vaihdella sen tietokoneen alueellisten asetusten mukaan, jossa ohjelmaa suoritetaan.
  5. Gregoriaaninen kalenteri luokassa on kaksi tärkeää rakentajaa: Gregoriaaninen kalenteri (), joka palauttaa objektin, joka edustaa sen luomishetkeä, ja Gregoriaaninen kalenteri (int vuosi, int kuukausi, int päiväys) konstruktori, jota käytetään luomaan objekti, joka edustaa mielivaltaista päivämäärää. Gregoriaaninen kalenteri luokan getTime () method palauttaa a Päivämäärä esine. lisää (int-kenttä, int-määrä) menetelmä laskee päivämäärät lisäämällä tai vähentämällä aikayksiköitä, kuten päivät, kuukaudet tai vuodet.

Gregoriaaninen kalenteri ja aika

Kaksi Gregoriaaninen kalenteri luokan rakentajia voidaan käyttää ajan käsittelemiseen. Ensimmäinen luo objektin, joka edustaa päivämäärää, tuntia ja minuuttia:

Gregoriaaninen kalenteri (int vuosi, int kuukausi, int päivämäärä, int tunti, int minuutti) 

Toinen luo objektin, joka edustaa päivämäärää, tuntia, minuuttia ja toista:

Gregoriaaninen kalenteri (int vuosi, int kuukausi, int päivämäärä, int tunti, int minuutti, int sekunti) 

Ensinnäkin minun on huomattava, että kukin rakentaja vaatii päivämäärätietoja (vuosi, kuukausi ja päivä) aikatietojen lisäksi. Jos haluat puhua kello 14.30, sinun on määritettävä päivämäärä.

Myös jokainen Gregoriaaninen kalenteri konstruktori luo objektin, joka edustaa millisekunnin tarkkuudella laskettua ajanhetkeä. Jos rakentajasi ottaa argumentteja vain vuodelle, kuukaudelle ja päivämäärälle, tuntien, minuuttien, sekuntien ja millisekuntien arvot nollataan. Vastaavasti, jos rakentajasi ottaa argumentteja vuodelle, kuukaudelle, päivämäärälle, tunnille ja minuuteille, sekunnit ja millisekunnit asetetaan nolliksi.

DateFormat ja aika

Voit luoda a Päivämäärämuoto Jos haluat näyttää ajan ja päivämäärän, voit käyttää staattista menetelmää getDateTimeInstance (int dateStyle, int timeStyle). Tämä menetelmä määrittää päiväys- ja aikatyylit, joita haluat käyttää. Jos olet tyytyväinen oletustyyleihin, voit korvata lyhyemmän getDateTimeInstance ().

Voit luoda a Päivämäärämuoto objekti näyttää vain ajan, voit käyttää staattista menetelmää getTimeInstance (int timeStyle).

Alla oleva ohjelma näyttää kuinka getDateTimeInstance () ja getTimeInstance () menetelmät toimivat:

tuo java.util. *; tuo java.text. *; julkinen luokka Apollo {public static void main (String [] args) {GregorianCalendar liftOffApollo11 ​​= new GregorianCalendar (1969, Kalenteri. heinäkuu 16, 9, 32); Päivämäärä d = liftOffApollo11.getTime (); DateFormat df1 = DateFormat.getDateTimeInstance (DateFormat.MEDIUM, DateFormat.MEDIUM); DateFormat df2 = DateFormat.getTimeInstance (DateFormat.SHORT); Merkkijono s1 = df1.formaatti (d); Merkkijono s2 = df2.formaatti (d); System.out.println (s1); System.out.println (s2); }} 

Tietokoneellani yllä oleva ohjelma näyttää seuraavat:

16. heinäkuuta 1969 9:32:00 AM

9:32 AM

(Tulostus voi vaihdella tietokoneen alueellisten asetusten mukaan.)

Kuluneen ajan laskeminen

Saatat joutua joskus laskemaan kuluneen ajan; saatat haluta tietää valmistusprosessin keston, ottaen huomioon aloitus- ja lopetusajat. Vuokraamo, joka vuokraa tavaroita tunti tai päivä, voi myös olla hyödyllistä laskea kulunut aika. Vastaavasti rahoitusmaailmassa on usein tarpeen laskea korkomaksut kuluneen ajan kuluessa.

Tämän ongelman monimutkaiseksi ihmiset laskevat kuluneen ajan vähintään kahdella tavalla. Voit sanoa, että päivä on kulunut, kun 24 tuntia on kulunut tai kun kalenteri vaihtuu päivästä toiseen. Keskustelen nyt näistä kahdesta ajattelutavasta.

Kulunut aika, tapaus 1: Täydet yksiköt

Tässä tapauksessa päivää ei ole kulunut, ennen kuin on kulunut 24 tuntia, tunti ei ole kulunut, ennen kuin 60 minuuttia on kulunut, minuutti ei ole kulunut, ennen kuin 60 sekuntia on kulunut, ja niin edelleen. Tällä menetelmällä 23 tunnin kulunut aika olisi nolla päivää.

Voit laskea kuluneen ajan tällä tavalla aloittamalla laskemalla kuluneen millisekunnin. Voit tehdä tämän muuntamalla ensin päivämäärät millisekuntien lukumääräksi 1. tammikuuta 1970 lähtien. Vähennät sitten ensimmäisen millisekunnin arvon toisesta millisekunnin arvosta. Tässä on esimerkkilaskelma:

tuo java.util. *; public class ElapsedMillis {public static void main (String [] args) {GregorianCalendar gc1 = uusi GregorianCalendar (1995, 11, 1, 3, 2, 1); GregorianCalendar gc2 = uusi GregorianCalendar (1995, 11, 1, 3, 2, 2); // edellä mainitut kaksi päivämäärää ovat yhden sekunnin välein Päivämäärä d1 = gc1.getTime (); Päivämäärä d2 = gc2.getTime (); pitkä l1 = d1.getTime (); pitkä l2 = d2.getTime (); pitkä ero = l2 - l1; System.out.println ("Kuluneet millisekunnit:" + ero); }} 

Yllä oleva ohjelma tulostaa seuraavat:

Kuluneet millisekunnit: 1000

Tuo ohjelma aiheuttaa myös sekaannusta. Gregoriaaninen kalenteri luokan getTime () palauttaa a Päivämäärä esine, kun taas Päivämäärä luokan getTime () method palauttaa a pitkä luku, joka edustaa millisekunteja ennen tai jälkeen 1. tammikuuta 1970. Joten vaikka menetelmillä on sama nimi, niiden palautustyypit ovat erilaiset!

Voit muuntaa millisekunteja sekunneiksi käyttämällä yksinkertaista kokonaislukujakoa, kuten seuraavassa koodinpätkässä:

pitkät millisekunnit = 1999; pitkät sekunnit = 1999/1 000; 

Tällöin millisekuntien muuntaminen sekunneiksi eliminoi murto-osat, joten 1999 millisekuntia vastaa yhtä sekuntia, kun taas 2000 millisekuntia vastaa 2 sekuntia.

Jos haluat laskea suuremmat yksiköt - kuten päivät, tunnit ja minuutit - sekuntien määrä, voit käyttää seuraavaa prosessia:

  1. Laske suurin yksikkö vähentämällä sekuntien määrää vastaavasti
  2. Laske seuraavaksi suurin yksikkö vähentämällä sekuntien määrää vastaavasti
  3. Toista, kunnes vain sekunteja on jäljellä

Jos kulunut aika on esimerkiksi 10000 sekuntia ja haluat tietää, kuinka monta tuntia, minuuttia ja sekuntia kyseinen arvo vastaa, aloitat suurimmalla arvolla: tuntia. Jaa 10000 3600: lla (sekuntia tunnissa) tuntien määrän laskemiseksi. Käyttämällä kokonaislukujakoa vastaus on 2 tuntia (murtoluvut pudotetaan kokonaislukujaoksi). Laskeaksesi jäljellä olevat sekunnit, vähennä 10000 3600 kertaa 2 tuntia: 10000 - (3600 x 2) = 2800 sekuntia. Sinulla on siis 2 tuntia ja 2800 sekuntia.

Jos haluat muuntaa 2800 sekuntia minuutteiksi, jaa 2800 sekunnilla 60: llä (sekuntia minuutissa). Lukujaolla vastaus on 46. Ja 2800 - (60 x 46) = 40 sekuntia. Lopullinen vastaus on 2 tuntia, 46 minuuttia ja 40 sekuntia.

Yllä oleva laskelma näkyy seuraavassa Java-ohjelmassa:

tuo java.util. *; julkinen luokka Kulunut1 {public void calcHMS (int timeInSeconds) {int tuntia, minuuttia, sekuntia; tuntia = timeInSeconds / 3600; timeInSeconds = timeInSeconds - (tuntia * 3600); minuuttia = aikaSekunnissa / 60; timeInSeconds = timeInSeconds - (minuuttia * 60); sekuntia = timeInSeconds; System.out.println (tuntia + "tunti (t)" + minuuttia + "minuutti (a)" + sekuntia + "sekunti (s)"; } public static void main (Merkkijono [] argumentti) {Kierretty1 kulunut = uusi Kulunut1 (); kp. calcHMS (10000); }} 

Yllä olevan ohjelman tulos on:

2 tunti (a) 46 minuutti (a) 40 sekunti (a)

Yllä oleva ohjelma laskee tuntimäärän oikein, vaikka kulunut aika on alle tunti. Esimerkiksi, jos käytät yllä olevaa ohjelmaa laskeaksesi 1000 sekuntia, tulos on:

0 tunti (a) 16 minuutti (a) 40 sekunti (a)

Todellisen esimerkin osoittamiseksi seuraava ohjelma laskee kuluneen ajan Apollo 11: n kuun lennon perusteella:

tuo java.util. *; public class LunarLanding {public long getElapsedSeconds (GregorianCalendar gc1, GregorianCalendar gc2) {Päivämäärä d1 = gc1.getTime (); Päivämäärä d2 = gc2.getTime (); pitkä l1 = d1.getTime (); pitkä l2 = d2.getTime (); pitkä ero = Math.abs (l2 - l1); paluuero / 1000; } public void calcHM (long timeInSeconds) {pitkät tunnit, minuutit, sekunnit; tuntia = timeInSeconds / 3600; timeInSeconds = timeInSeconds - (tuntia * 3600); minuuttia = aikaSekunnissa / 60; System.out.println (tuntia + "tunti (t)" + minuuttia + "minuutti (a)"); } public static void main (String [] args) {GregorianCalendar lunarLanding = uusi GregorianCalendar (1969, Kalenteri. HEINÄKUU, 20, 16, 17); GregorianCalendar lunarDeparture = uusi GregorianCalendar (1969, kalenteri. HEINÄKUU, 21, 13, 54); GregorianCalendar startEVA = uusi GregorianCalendar (1969, kalenteri. HEINÄKUU, 20, 22, 56); GregorianCalendar endEVA = uusi GregorianCalendar (1969, kalenteri. HEINÄKUU, 21, 1, 9); LunarLanding apollo = uusi LunarLanding (); pitkä eva = apollo.getElapsedSeconds (startEVA, endEVA); System.out.print ("EVA-kesto ="); apollo.calcHM (eva); pitkä lunarStay = apollo.getElapsedSeconds (lunarLanding, lunarDeparture); System.out.print ("Lunar stay ="); apollo.calcHM (kuun pysyminen); }} 

Yllä olevan ohjelman tulos on:

EVA-kesto = 2 tunti (a) 13 minuutti (a)

Kuukauden aika = 21 tunti (a) 37 minuutti (a)

Toistaiseksi olen tehnyt laskelmia yksinkertaisten kaavojen perusteella: "1 minuutti = 60 sekuntia", "1 tunti = 60 minuuttia" ja "1 päivä = 24 tuntia".

Entä "1 kuukausi =? Päivät" ja "1 vuosi =? Päivät"?

Kuukaudet voivat olla 28, 29, 30 tai 31 päivää; vuotta voi olla 365 tai 366 päivää. Siksi ongelmia ilmenee, kun yrität laskea kokonaiset aikayksiköt kuukausille ja vuosille. Jos esimerkiksi käytät kuukausien keskimääräistä päivämäärää (noin 30,4375) ja lasket kuluneiden kuukausien määrän seuraavien kahden aikavälin perusteella:

  • 1. heinäkuuta klo 2.00–31.7. Klo 22.00
  • 1. helmikuuta klo 2.00 - 29. helmikuuta klo 22.00

ensimmäisen laskelman tulos on 1 kuukausi; toinen johtaa nollaan kuukauteen!

Ajattele siis hyvin huolellisesti, ennen kuin lasket kuluneen ajan kokonaisina yksikköinä kuukausina ja vuosina.

Kulunut aika, tapaus 2: Aikayksikön muutos

Aikayksikön muutoksen määritelmä on suhteellisen yksinkertainen: Jos lasket päiviä, lasket yksinkertaisesti päivämäärän muutosten määrän. Esimerkiksi jos jokin alkaa 15. päivänä ja päättyy 17. päivänä, on kulunut 2 päivää. (Päivämäärä muuttui ensin 16. päivään, sitten 17. päivään.) Vastaavasti, jos prosessi alkaa klo 15.25 iltapäivällä ja päättyy klo 16.10, on kulunut 1 tunti, koska tunti on muuttunut kerran (kolmesta kolmeen 4).

Kirjastot laskevat usein ajan tällä tavalla. Esimerkiksi, jos lainaan kirja kirjastostani, minun ei tarvitse olla kirjani hallussa vähintään 24 tuntia, jotta kirjasto voisi pitää sitä lainattuna yhdeksi päiväksi. Sen sijaan päivä, jolloin lainaan kirjaa, kirjataan tililleni. Heti kun päivämäärä vaihtuu seuraavaan päivään, olen lainannut kirjan yhdeksi päiväksi, vaikka aika on usein alle 24 tuntia.

Kun lasketaan kulunut aika aikayksikön muutoksen kannalta, ei yleensä ole järkevää laskea useampaa kuin yhtä aikayksikköä. Esimerkiksi, jos lainaan kirjastokirjan klo 21.00 ja palautan sen seuraavana päivänä keskipäivällä, voin laskea, että olen lainannut kirjan yhdeksi päiväksi. Ei ole kuitenkaan mitään järkeä kysyä: "Yksi päivä ja kuinka monta tuntia?" Koska kirjaa lainattiin yhteensä 15 tunniksi, onko vastaus yksi päivä ja kielteinen yhdeksän tuntia? Siksi tässä opetusohjelmassa lasken aikayksikön muutoksen vain yhdelle aikayksikölle.

Algoritmi muutoksen aikayksikön laskemiseksi

Näin lasket muutosajan yksikön kahden päivämäärän välillä:

  1. Tee kopiot kahdesta päivämäärästä. klooni() menetelmä voi tehdä kopioita sinulle.
  2. Aseta päivämäärien kopioilla jokaisen kentän vähimmäisarvoksi kaikki muutosyksikköä pienemmät kentät. Jos esimerkiksi lasket kuluneita päiviä, aseta tunnit, minuutit, sekunnit ja millisekunnit nollaksi. Käytä tässä tapauksessa asia selvä() menetelmä asettaa aikakentät pienimpään arvoonsa.
  3. Ota aikaisempi päivämäärä ja lisää yksi laskettavaan kenttään toistamalla, kunnes kaksi päivämäärää ovat samat. Vastaus on, kuinka monta kertaa lisäät yhden. Voit käyttää ennen() ja jälkeen() menetelmät, jotka palauttavat loogisen arvon, testatakseen, onko jokin päivämäärä ennen toista vai myöhempää päivämäärää.

Seuraavassa luokassa on menetelmiä päivien ja kuukausien laskemiseksi.