Š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ų.
- Java skaičiuoja laiką milisekundėmis prieš arba po 1970 m. Sausio 1 d. Pradžios.
-
Data
klasės konstruktoriusData()
pateikia objektą, kuris atspindi objekto sukūrimo momentą.Data
's„getTime“ ()
metodas grąžina ailgas
vertė, kurios skaičius lygus milisekundžių skaičiui prieš 1970 m. sausio 1 d. arba vėliau. -
Datos formatas
klasė naudojama konvertuotiData
s įStygos
s ir atvirkščiai. Statiškas„getDateInstance“ ()
metodas grąžina aDatos formatas
objektas numatytuoju formatu;„getDateInstance“ (DateFormat.FIELD)
grąžina aDatos formatas
nurodyto formato objektas.formatas (data d)
metodas grąžina aStygos
tai reiškia datą, pvz., „2002 m. sausio 1 d.“ Priešingai,analizuoti (eilutės)
metodas grąžina aData
objektas pagal datąStygos
argumentas atstovauja. - Išvaizda
Stygos
s grąžinoformatas ()
metodas gali skirtis atsižvelgiant į regioninius parametrus kompiuteryje, kuriame vykdoma programa. -
Grigaliaus kalendorius
klasėje yra du svarbūs konstruktoriai:Grigaliaus kalendorius()
, kuris pateikia objektą, kuris atspindi jo sukūrimo momentą, irGrigaliaus kalendorius (int metai, int mėnuo, int data)
konstruktorius, naudojamas sukurti objektą, nurodantį savavališką datą.Grigaliaus kalendorius
klasės„getTime“ ()
metodas grąžina aData
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: 1000Ta 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ą:
- Apskaičiuokite didžiausią vienetą, atitinkamai sumažindami sekundžių skaičių
- Apskaičiuokite kitą didžiausią vienetą, atitinkamai sumažindami sekundžių skaičių
- 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ą:
- Padarykite dviejų datų kopijas.
klonas ()
metodas gali padaryti jums kopijas. - 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. - 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š ()
irpo ()
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.