Programavimas

Darbas Java laiku

Šis straipsnis remiasi informacija, pateikta mano straipsnyje „Java Dates“ skaičiavimas („JavaWorld“, 2000 m. Gruodžio 29 d.). Čia išvardijau keletą svarbiausių to straipsnio punktų, kurie jums turėtų būti žinomi. Jei šie klausimai jums nėra aiškūs, rekomenduoju perskaityti „Java datų skaičiavimas“, kad gautumėte daugiau paaiškinimų.

  1. Java skaičiuoja laiką milisekundėmis prieš arba po 1970 m. Sausio 1 d. Pradžios.
  2. Data klasės konstruktorius Data() pateikia objektą, kuris atspindi objekto sukūrimo momentą. Data's „getTime“ () metodas grąžina a ilgas vertė, kurios skaičius lygus milisekundžių skaičiui prieš 1970 m. sausio 1 d. arba vėliau.
  3. Datos formatas klasė naudojama konvertuoti Datas į Stygoss ir atvirkščiai. Statiškas „getDateInstance“ () metodas grąžina a Datos formatas objektas numatytuoju formatu; „getDateInstance“ (DateFormat.FIELD) grąžina a Datos formatas nurodyto formato objektas. formatas (data d) metodas grąžina a Stygos tai reiškia datą, pvz., „2002 m. sausio 1 d.“ Priešingai, analizuoti (eilutės) metodas grąžina a Data objektas pagal datą Stygos argumentas atstovauja.
  4. Išvaizda Stygoss grąžino formatas () metodas gali skirtis atsižvelgiant į regioninius parametrus kompiuteryje, kuriame vykdoma programa.
  5. Grigaliaus kalendorius klasėje yra du svarbūs konstruktoriai: Grigaliaus kalendorius(), kuris pateikia objektą, kuris atspindi jo sukūrimo momentą, ir Grigaliaus kalendorius (int metai, int mėnuo, int data) konstruktorius, naudojamas sukurti objektą, nurodantį savavališką datą. Grigaliaus kalendorius klasės „getTime“ () metodas grąžina a Data objektas. pridėti (int lauke, int suma) metodas skaičiuoja datas, pridedant arba atimant laiko vienetus, pvz., dienas, mėnesius ar metus.

Grigaliaus kalendorius ir laikas

Du Grigaliaus kalendorius klasės konstruktoriai gali būti naudojami laikui spręsti. Pirmasis sukuria objektą, nurodantį datą, valandą ir minutę:

Grigaliaus kalendorius (int metai, int mėnuo, int data, int valanda, int minutė) 

Antrasis sukuria objektą, nurodantį datą, valandą, minutę ir antrą:

Grigaliaus kalendorius (int metai, int mėnuo, int data, int valanda, int minutė, int sekundė) 

Pirma, turėčiau atkreipti dėmesį į tai, kad kiekvienas konstruktorius, be laiko informacijos, reikalauja informacijos apie datas (metus, mėnesį ir dieną). Jei norite kalbėti apie 14.30 val., Turite nurodyti datą.

Be to, kiekvienas Grigaliaus kalendorius konstruktorius sukuria objektą, kuris atspindi laiko momentą, apskaičiuotą milisekundžių tikslumu. Taigi, jei jūsų konstruktorius pateikia argumentus tik metams, mėnesiui ir datai, tada valandų, minučių, sekundžių ir milisekundžių vertės nustatomos į nulį. Panašiai, jei jūsų konstruktorius ima argumentus už metus, mėnesį, datą, valandas ir minutes, tada sekundės ir milisekundės nustatomos į nulį.

DataFormatas ir laikas

Norėdami sukurti Datos formatas objektą, kad būtų rodomas laikas ir data, galite naudoti statinį metodą getDateTimeInstance (int dateStyle, int timeStyle). Šis metodas nurodo norimus naudoti datos ir laiko stilius. Jei esate patenkinti numatytaisiais stiliais, galite pakeisti trumpesnį getDateTimeInstance ().

Norėdami sukurti Datos formatas objektui rodyti tik laiką, galite naudoti statinį metodą getTimeInstance (int timeStyle).

Žemiau pateikta programa parodo, kaip getDateTimeInstance () ir „getTimeInstance“ () metodai veikia:

importuoti java.util. *; importuoti java.text. *; public class Apollo {public static void main (String [] args) {GregorianCalendar liftOffApollo11 ​​= new GregorianCalendar (1969, Kalendorius. LIEPOS 16, 9, 32); Data d = liftOffApollo11.getTime (); DateFormat df1 = DateFormat.getDateTimeInstance (DateFormat.MEDIUM, DateFormat.MEDIUM); DateFormat df2 = DateFormat.getTimeInstance (DateFormat.SHORT); Eilutė s1 = df1.formatas (d); Eilutė s2 = df2.formatas (d); System.out.println (s1); System.out.println (s2); }} 

Mano kompiuteryje aukščiau nurodyta programa rodo:

1969 m. Liepos 16 d. 9:32:00

9:32 val

(Išvestis gali skirtis atsižvelgiant į jūsų kompiuterio regioninius nustatymus.)

Praėjusio laiko skaičiavimas

Kartais gali tekti apskaičiuoti praėjusį laiką; pavyzdžiui, galbūt norėsite sužinoti gamybos proceso trukmę, atsižvelgiant į pradžios ir pabaigos laiką. Nuomos bendrovei, kuri nuomoja daiktus pagal valandą ar dieną, taip pat gali būti naudinga apskaičiuoti praėjusį laiką. Panašiai ir finansų pasaulyje dažnai reikia apskaičiuoti palūkanų mokėjimus per praėjusį laiką.

Norėdami apsunkinti problemą, žmonės skaičiuoja praėjusį laiką bent dviem būdais. Galite sakyti, kad praėjo diena, kai praėjo 24 valandos arba kai kalendorius keičiasi iš vienos dienos į kitą. Dabar aptarsiu tuos du mąstymo būdus.

Praėjęs laikas, 1 atvejis: visi vienetai

Tokiu atveju nepraėjo para, kol nepraėjo 24 valandos, nepraėjo valanda, kol nepraėjo 60 minučių, nepraėjo nė minutė, kol nepraėjo 60 sekundžių ir pan. Taikant šį metodą, 23 valandos praėjusio laiko reikštų nulinę dieną.

Norėdami tokiu būdu apskaičiuoti praėjusį laiką, pirmiausia skaičiuokite praėjusį milisekundę. Norėdami tai padaryti, pirmiausia konvertuokite kiekvieną datą į milisekundžių skaičių nuo 1970 m. Sausio 1 d. Pradžios. Tada atimkite pirmosios milisekundės vertę iš antrosios milisekundės vertės. Štai pavyzdinis skaičiavimas:

importuoti java.util. *; public class ElapsedMillis {public static void main (String [] args) {GregorianCalendar gc1 = naujas GregorianCalendar (1995, 11, 1, 3, 2, 1); „GregorianCalendar gc2“ = naujas „GregorianCalendar“ (1995, 11, 1, 3, 2, 2); // minėtos dvi datos skiriamos viena sekunde. Data d1 = gc1.getTime (); Data d2 = gc2.getTime (); ilgas l1 = d1.getTime (); ilgas l2 = d2.getTime (); ilgas skirtumas = l2 - l1; System.out.println ("Praėjusios milisekundės:" + skirtumas); }} 

Pirmiau nurodyta programa spausdina:

Praėjo milisekundės: 1000

Ta programa taip pat kelia tam tikrą painiavą. Grigaliaus kalendorius klasės „getTime“ () grąžina a Data objektas, o Data klasės „getTime“ () metodas grąžina a ilgas skaičius, nurodantis milisekundes prieš arba po 1970 m. sausio 1 d. pradžios. Taigi, nors metodai turi tą patį pavadinimą, jų grąžinimo tipai skiriasi!

Galite konvertuoti milisekundes į sekundes naudodami paprastą sveikojo skaičiaus padalijimą, kaip nurodyta šiame kodo fragmente:

ilgos milisekundės = 1999; ilgos sekundės = 1999/1 000; 

Tokiu būdu konvertuojant milisekundes į sekundes, pašalinamos trupmenos, taigi 1 999 milisekundės yra lygios 1 sekundei, o 2 000 milisekundžių - 2 sekundės.

Norėdami apskaičiuoti didesnius vienetus, pvz., Dienas, valandas ir minutes, atsižvelgiant į sekundžių skaičių, galite naudoti šį procesą:

  1. Apskaičiuokite didžiausią vienetą, atitinkamai sumažindami sekundžių skaičių
  2. Apskaičiuokite kitą didžiausią vienetą, atitinkamai sumažindami sekundžių skaičių
  3. Kartokite, kol liks tik sekundės

Pavyzdžiui, jei jūsų praėjęs laikas yra 10 000 sekundžių ir norite sužinoti, kiek valandų, minučių ir sekundžių ta vertė atitinka, pradedate nuo didžiausios vertės: valandų. Norėdami apskaičiuoti valandų skaičių, padalykite 10 000 iš 3 600 (sekundės per valandą). Naudojant sveikojo skaičiaus padalijimą, atsakymas yra 2 valandos (trupmenos numetamos sveikojo skaičiaus dalijimu). Norėdami apskaičiuoti likusias sekundes, sumažinkite 10 000 3 600 kartų 2 valandas: 10 000 - (3 600 x 2) = 2800 sekundžių. Taigi jūs turite 2 valandas ir 2800 sekundžių.

Norėdami konvertuoti 2800 sekundžių į minutes, padalykite 2800 iš 60 (sekundės per minutę). Skaičiuojant sveikąjį skaičių, atsakymas yra 46. Ir 2800 - (60 x 46) = 40 sekundžių. Galutinis atsakymas yra 2 valandos, 46 minutės ir 40 sekundžių.

Pirmiau pateiktas skaičiavimas parodytas šioje „Java“ programoje:

importuoti java.util. *; public class Elapsed1 {public void calcHMS (int timeInSeconds) {int valandos, minutės, sekundės; valandos = timeInSeconds / 3600; timeInSeconds = timeInSeconds - (valandos * 3600); minutės = laikasInSekundės / 60; timeInSeconds = timeInSeconds - (minutės * 60); sekundės = laikasInSekundės; System.out.println (valandos + "valanda (s)" + minutės + "minutė (-ės)" + sekundės + "sekundė (-ės)"); } public static void main (String [] args) {Praėjęs1 praėjęs = naujas Praėjęs1 (); praeina.calcHMS (10000); }} 

Iš minėtos programos išvestis yra:

2 valanda (s) 46 minutė (-ės) 40 sekundė (-ės)

Pirmiau nurodyta programa teisingai apskaičiuoja valandų skaičių, net jei praėjo mažiau nei valanda. Pvz., Jei naudojate aukščiau pateiktą programą 1000 sekundžių skaičiavimui, išvestis yra:

0 valanda (s) 16 minutė (-ės) 40 sekundė (-ės)

Norėdami parodyti realų pavyzdį, ši programa apskaičiuoja praėjusį laiką pagal „Apollo 11“ skrydį į mėnulį:

importuoti java.util. *; public class LunarLanding {public long getElapsedSeconds (GregorianCalendar gc1, GregorianCalendar gc2) {Data d1 = gc1.getTime (); Data d2 = gc2.getTime (); ilgas l1 = d1.getTime (); ilgas l2 = d2.getTime (); ilgas skirtumas = Math.abs (l2 - l1); grąžos skirtumas / 1000; } public void calcHM (long timeInSeconds) {ilgos valandos, minutės, sekundės; valandos = timeInSeconds / 3600; timeInSeconds = timeInSeconds - (valandos * 3600); minutės = laikasInSekundės / 60; System.out.println (valandos + "valanda (s)" + minutės + "minutė (s)"); } public static void main (String [] args) {GregorianCalendar lunarLanding = new GregorianCalendar (1969, Kalendorius. LIEPOS 20, 16, 17); GregorianCalendar lunarDeparture = new GregorianCalendar (1969, kalendorius. LIEPOS 21, 13, 54); „GregorianCalendar start“ EVA = naujas Grigaliaus kalendorius (1969, kalendorius. LIEPOS 20, 22, 56); GregorianCalendar endEVA = naujas GrigaliausCalendar (1969, kalendorius. LIEPOS 21, 1, 9); LunarLanding apollo = naujas LunarLanding (); ilgas eva = apollo.getElapsedSeconds (startEVA, endEVA); System.out.print ("EVA trukmė ="); apollo.calcHM (eva); long lunarStay = apollo.getElapsedSeconds (lunarLanding, lunarDeparture); System.out.print ("Mėnulio buvimas ="); apollo.calcHM (lunarStay); }} 

Iš minėtos programos išvestis yra:

EVA trukmė = 2 valandos 13 minučių

Mėnulio viešnagė = 21 valanda (s) 37 minutė (s)

Iki šiol skaičiavimus atlikau remdamasis tokiomis paprastomis formulėmis kaip: „1 minutė = 60 sekundžių“, „1 valanda = 60 minučių“ ir „1 diena = 24 valandos“.

O „1 mėnuo =? Dienos“ ir „1 metai =? Dienos“?

Mėnesiai gali būti 28, 29, 30 arba 31 dienos; metų gali būti 365 arba 366 dienos. Todėl kyla problemų, kai bandote apskaičiuoti pilnus laiko vienetus mėnesiams ir metams. Pvz., Jei naudojate vidutinį dienų skaičių per mėnesį (maždaug 30,4375) ir praėjusių mėnesių skaičių apskaičiuojate remdamiesi šiais dviem intervalais:

  • Liepos 1 d., Nuo 2:00 iki liepos 31 dienos, 10:00.
  • Vasario 1 d., Nuo 2:00 iki vasario 29 dienos, 10:00 val.

pirmas skaičiavimas bus atliktas per 1 mėnesį; antrasis rezultatas bus nulis mėnesių!

Taigi, gerai apgalvokite, prieš skaičiuodami praeitą laiką visais vienetais mėnesiams ir metams.

Praėjęs laikas, 2 atvejis: laiko vieneto pokytis

Laiko vieneto pakeitimo apibrėžimas yra gana paprastas: jei skaičiuojate dienas, tiesiog suskaičiuokite, kiek kartų pasikeitė data. Pavyzdžiui, jei kažkas prasideda 15 dieną ir baigiasi 17 dieną, praėjo 2 dienos. (Data pirmiausia pasikeitė į 16, tada į 17 d.) Panašiai, jei procesas prasideda 3:25 po pietų ir baigiasi 16:10, praėjo 1 valanda, nes valanda vieną kartą pasikeitė (nuo 3 iki 4).

Bibliotekos dažnai apskaičiuoja laiką tokiu būdu. Pavyzdžiui, jei skolinuosi knygą iš savo bibliotekos, man nereikia, kad knyga būtų mano rankose mažiausiai 24 valandas, kad biblioteka galėtų laikyti ją skolinta vienai dienai. Vietoj to mano sąskaitoje įrašoma diena, kai skolinuosi knygą. Kai tik data pasikeičia į kitą dieną, aš pasiskolinau knygą vienai dienai, nors laiko trukmė dažnai būna mažesnė nei 24 valandos.

Skaičiuojant praėjusį laiką laiko vieneto pokyčio prasme, paprastai nėra prasmės skaičiuoti daugiau nei vieną laiko vienetą. Pavyzdžiui, jei skolinuosi bibliotekos knygą 21.00 val., O grąžinsiu kitos dienos vidurdienį, galiu apskaičiuoti, kad knygą pasiskolinau vienai dienai. Tačiau nėra prasmės klausti: "Viena diena ir kiek valandų?" Kadangi knyga buvo paskolinta iš viso 15 valandų, ar atsakymas yra viena diena, o devynios - neigiamas? Todėl šiai pamokai apskaičiuosiu laiko vieneto keitimą tik vienam laiko vienetui.

Pokyčių laiko vieneto apskaičiavimo algoritmas

Taip apskaičiuosite laiko pasikeitimo tarp dviejų datų vienetą:

  1. Padarykite dviejų datų kopijas. klonas () metodas gali padaryti jums kopijas.
  2. Naudodami datų kopijas, nustatykite visus laukus, kurie yra mažesni už kiekvieno lauko minimalios vertės pakeitimo vienetą. Pvz., Jei skaičiuojate praėjusias dienas, tada nustatykite nulį valandoms, minutėms, sekundėms ir milisekundėms. Tokiu atveju naudokite aišku () metodas nustatyti laiko laukus iki mažiausios jų vertės.
  3. Paimkite ankstesnę datą ir įtraukite vieną į lauką, kurį skaičiuojate, kartodami tol, kol abi datos bus lygios. Kiek kartų pridedate, yra atsakymas. Galite naudoti prieš () ir po () metodai, kurie pateikia loginę reikšmę, siekiant patikrinti, ar viena data yra ankstesnė nei kita data.

Šioje klasėje yra dienų ir mėnesių skaičiavimo metodai.