Programmēšana

Darbs Java laikā

Šis raksts ir balstīts uz informāciju, kas sniegta manā rakstā Java datumu aprēķināšana (JavaWorld, 2000. gada 29. decembris). Šeit es esmu uzskaitījis dažus šī raksta galvenos punktus, kas jums būtu labi jāpārzina. Ja šie punkti jums nav skaidri, iesaku izlasīt sadaļu "Java datumu aprēķināšana", lai saņemtu sīkāku skaidrojumu.

  1. Java rēķina laiku milisekundēs pirms vai pēc 1970. gada 1. janvāra sākuma.
  2. The Datums klases konstruktors Datums() atgriež objektu, kas attēlo objekta izveidošanas brīdi. Datums's getTime () metode atgriež a ilgi vērtība, kuras skaitlis ir vienāds ar milisekunžu skaitu pirms vai pēc 1970. gada 1. janvāra.
  3. The Datuma formāts klase tiek izmantota, lai pārveidotu Datumss līdz Stīgas, un otrādi. Statiskā getDateInstance () metode atgriež a Datuma formāts objekts noklusējuma formātā; getDateInstance (DateFormat.FIELD) atgriež a Datuma formāts objekts ar noteiktu formātu. The formāts (datums d) metode atgriež a Stīga kas apzīmē datumu, piemēram, "2002. gada 1. janvāris". Un otrādi parsēšana (virknes) metode atgriež a Datums objekts, pamatojoties uz datumu Stīga arguments pārstāv.
  4. Izskats Stīgas atgriezās formāts () metode var mainīties atkarībā no reģionālajiem iestatījumiem datorā, kurā tiek palaista programma.
  5. The Gregora kalendārs klasei ir divi svarīgi konstruktori: GregorianCalendar (), kas atgriež objektu, kas atspoguļo tā izveidošanas brīdi, un GregorianCalendar (int gads, vid mēnesis, int datums) konstruktors, ko izmanto, lai izveidotu objektu, kas apzīmē patvaļīgu datumu. The Gregora kalendārs klases getTime () metode atgriež a Datums objekts. The pievienot (int lauks, int summa) metode aprēķina datumus, saskaitot vai atņemot laika vienības, piemēram, dienas, mēnešus vai gadus.

Gregora kalendārs un laiks

Divas Gregora kalendārs klases konstruktori var tikt izmantoti laika risināšanai. Pirmais izveido objektu, kas apzīmē datumu, stundu un minūti:

GregorianCalendar (int gads, int mēnesis, int datums, int stunda, int minūte) 

Otrais izveido objektu, kas attēlo datumu, stundu, minūti un otro:

GregorianCalendar (int gads, int mēnesis, int datums, int stunda, int minūte, int otrais) 

Pirmkārt, man jāņem vērā, ka katram konstruktoram papildus laika informācijai ir nepieciešama informācija par datumu (gads, mēnesis un diena). Ja vēlaties runāt par 14:30, jums jānorāda datums.

Arī katrs Gregora kalendārs konstruktors izveido objektu, kas attēlo laika momentu, kas aprēķināts ar precizitāti līdz milisekundēm. Tādējādi, ja jūsu konstruktors ņem argumentus tikai par gadu, mēnesi un datumu, tad stundu, minūšu, sekunžu un milisekunžu vērtības tiek iestatītas uz nulli. Līdzīgi, ja jūsu konstruktors ņem argumentus par gadu, mēnesi, datumu, stundām un minūtēm, tad sekundes un milisekundes tiek iestatītas uz nulli.

DateFormat un laiks

Lai izveidotu Datuma formāts Lai parādītu laiku un datumu, varat izmantot statisko metodi getDateTimeInstance (int dateStyle, int timeStyle). Šī metode nosaka datuma un laika stilus, kurus vēlaties izmantot. Ja esat apmierināts ar noklusējuma stiliem, varat aizstāt īsākos getDateTimeInstance ().

Lai izveidotu Datuma formāts objektu, lai parādītu tikai laiku, varat izmantot statisko metodi getTimeInstance (int timeStyle).

Zemāk redzamā programma parāda, kā getDateTimeInstance () un getTimeInstance () metodes darbojas:

importēt java.util. *; importēt java.text. *; publiskā klase Apollo {public static void main (String [] args) {GregorianCalendar liftOffApollo11 ​​= new GregorianCalendar (1969, Kalendārs.Jūlijs, 16, 9, 32); Datums d = liftOffApollo11.getTime (); DateFormat df1 = DateFormat.getDateTimeInstance (DateFormat.MEDIUM, DateFormat.MEDIUM); DateFormat df2 = DateFormat.getTimeInstance (DateFormat.SHORT); Virkne s1 = df1.formāts (d); Virkne s2 = df2.formāts (d); System.out.println (s1); System.out.println (s2); }} 

Manā datorā iepriekš minētā programma parāda:

1969. gada 16. jūlijs 9:32:00

9:32

(Izeja var atšķirties atkarībā no datora reģionālajiem iestatījumiem.)

Aprēķinot pagājušo laiku

Dažreiz jums var būt nepieciešams aprēķināt pagājušo laiku; piemēram, iespējams, vēlēsities uzzināt ražošanas procesa ilgumu, ņemot vērā sākuma un beigu laiku. Nomas uzņēmumam, kas nomā priekšmetus pēc stundas vai dienas, var būt noderīgi arī aprēķināt pagājušo laiku. Līdzīgi finanšu pasaulē bieži vien ir jāaprēķina procentu maksājumi pagājušajā laikā.

Lai sarežģītu šo problēmu, cilvēki aprēķina pagājušo laiku vismaz divos veidos. Var teikt, ka ir pagājusi diena, kad ir pagājušas 24 stundas vai kad kalendārs mainās no vienas dienas uz otru. Tagad es apspriedīšu šos divus domāšanas veidus.

Pagājušais laiks, 1. gadījums: pilnas vienības

Šajā gadījumā diena nav pagājusi, kamēr nav pagājušas 24 stundas, stunda nav pagājusi, kamēr nav pagājušas 60 minūtes, minūte nav pagājusi, kamēr nav pagājušas 60 sekundes utt. Izmantojot šo metodi, 23 stundas pēc pagājušā laika nozīmē nulles dienas.

Lai šādi aprēķinātu pagājušo laiku, vispirms jāaprēķina pagājušās milisekundes. Lai to izdarītu, vispirms konvertējiet katru datumu uz milisekunžu skaitu kopš 1970. gada 1. janvāra sākuma. Pēc tam pirmo milisekunžu vērtību atņemat no otrās milisekundes vērtības. Šeit ir aprēķina paraugs:

importēt java.util. *; public class ElapsedMillis {public static void main (String [] args) {GregorianCalendar gc1 = jauns GregorianCalendar (1995, 11, 1, 3, 2, 1); GregorianCalendar gc2 = jauns GregorianCalendar (1995, 11, 1, 3, 2, 2); // iepriekš minētie divi datumi ir ar vienas sekundes starpību Datums d1 = gc1.getTime (); Datums d2 = gc2.getTime (); garš l1 = d1.getTime (); garš l2 = d2.getTime (); garā starpība = l2 - l1; System.out.println ("Pagājušās milisekundes:" + starpība); }} 

Iepriekš minētā programma izdrukā:

Pagājušās milisekundes: 1000

Arī šī programma rada zināmu neskaidrību. The Gregora kalendārs klases getTime () atgriež a Datums objekts, bet Datums klases getTime () metode atgriež a ilgi skaitlis, kas apzīmē milisekundes pirms vai pēc 1970. gada 1. janvāra sākuma. Tātad, lai arī metodēm ir viens un tas pats nosaukums, to atdeves veidi ir atšķirīgi!

Varat konvertēt milisekundes sekundēs, izmantojot vienkāršu veselu skaitļu sadalījumu, kā norādīts šajā koda fragmentā:

garas milisekundes = 1999; garās sekundes = 1999/1000; 

Šāds milisekunžu konvertēšanas sekundēs veids izslēdz frakcijas, tāpēc 1999 milisekundes ir vienādas ar 1 sekundi, bet 2000 milisekundes ir vienādas ar 2 sekundēm.

Lai aprēķinātu lielākas vienības, piemēram, dienas, stundas un minūtes, ņemot vērā sekunžu skaitu, varat izmantot šādu procesu:

  1. Aprēķiniet lielāko vienību, attiecīgi samazinot sekunžu skaitu
  2. Aprēķiniet nākamo lielāko vienību, attiecīgi samazinot sekunžu skaitu
  3. Atkārtojiet, līdz atlikušas tikai sekundes

Piemēram, ja jūsu pagājušais laiks ir 10 000 sekundes un vēlaties uzzināt, cik stundām, minūtēm un sekundēm atbilst šī vērtība, jūs sākat ar lielāko vērtību: stundas. Lai aprēķinātu stundu skaitu, sadaliet 10 000 ar 3600 (sekundes stundā). Izmantojot veselu skaitļu dalījumu, atbilde ir 2 stundas (daļas tiek nokritušas vesela skaitļa dalījumā). Lai aprēķinātu atlikušās sekundes, samaziniet 10 000 par 3600 reizēm 2 stundas: 10 000 - (3 600 x 2) = 2800 sekundes. Tātad jums ir 2 stundas un 2800 sekundes.

Lai konvertētu 2800 sekundes minūtēs, daliet 2800 ar 60 (sekundes minūtē). Ar veselo skaitļu dalījumu atbilde ir 46. Un 2800 - (60 x 46) = 40 sekundes. Galīgā atbilde ir 2 stundas, 46 minūtes un 40 sekundes.

Iepriekšminētais aprēķins ir parādīts šādā Java programmā:

importēt java.util. *; public class Elapsed1 {public void calcHMS (int timeInSeconds) {int stundas, minūtes, sekundes; stundas = laiksInSekundes / 3600; timeInSeconds = timeInSeconds - (stundas * 3600); minūtes = laiksInSekundes / 60; timeInSeconds = timeInSeconds - (minūtes * 60); sekundes = laiksInSekundes; System.out.println (stundas + "stunda (s)" + minūtes + "minūte (s)" + sekundes + "sekunde (s)"); } public static void main (String [] args) {Elapsed1 elap = new Elapsed1 (); el.kalcHMS (10000); }} 

Iepriekš minētās programmas rezultāts ir:

2 stunda (s) 46 minūte (s) 40 sekunde (s)

Iepriekš minētā programma pareizi aprēķina stundu skaitu, pat ja pagājušais laiks ir mazāks par stundu. Piemēram, ja izmantojat iepriekšminēto programmu, lai aprēķinātu 1000 sekundes, rezultāts ir:

0 stunda (s) 16 minūte (s) 40 sekunde (s)

Lai parādītu reālu piemēru, šī programma aprēķina pagājušo laiku, pamatojoties uz Apollo 11 lidojumu uz Mēnesi:

importēt java.util. *; public class LunarLanding {public long getElapsedSeconds (GregorianCalendar gc1, GregorianCalendar gc2) {Datums d1 = gc1.getTime (); Datums d2 = gc2.getTime (); garš l1 = d1.getTime (); garš l2 = d2.getTime (); garā starpība = Math.abs (l2 - l1); atdeves starpība / 1000; } public void calcHM (long timeInSeconds) {garas stundas, minūtes, sekundes; stundas = laiksInSekundes / 3600; timeInSeconds = timeInSeconds - (stundas * 3600); minūtes = laiksInSekundes / 60; System.out.println (stundas + "stunda (s)" + minūtes + "minūte (s)"); } public static void main (String [] args) {GregorianCalendar lunarLanding = new GregorianCalendar (1969, Kalendārs.Jūlijs, 20, 16, 17); GregorianCalendar lunarDeparture = new GregorianCalendar (1969, Kalendārs. Jūlijs, 21, 13, 54.); GregorianCalendar startEVA = jauns GregorianCalendar (1969, Kalendārs. Jūlijs, 20, 22, 56); GregorianCalendar endEVA = jauns GregorianCalendar (1969, Kalendārs. Jūlijs, 21, 1, 9); LunarLanding apollo = jauns LunarLanding (); ilgi eva = apollo.getElapsedSeconds (startEVA, endEVA); System.out.print ("EVA ilgums ="); apollo.calcHM (eva); long lunarStay = apollo.getElapsedSeconds (lunarLanding, lunarDeparture); System.out.print ("Mēness uzturēšanās ="); apollo.calcHM (lunarStay); }} 

Iepriekš minētās programmas rezultāts ir:

EVA ilgums = 2 stundas (s) 13 minūte (s)

Mēness uzturēšanās = 21 stunda (s) 37 minūte (s)

Līdz šim esmu veicis aprēķinus, pamatojoties uz vienkāršām formulām, piemēram: "1 minūte = 60 sekundes", "1 stunda = 60 minūtes" un "1 diena = 24 stundas".

Kas par "1 mēnesis =? Dienas" un "1 gads =? Dienas"?

Mēneši var sastāvēt no 28, 29, 30 vai 31 dienas; gadi var būt 365 vai 366 dienas. Tāpēc problēmas rodas, mēģinot aprēķināt pilnas laika vienības mēnešiem un gadiem. Piemēram, ja izmantojat vidējo dienu skaitu mēnesī (aptuveni 30,4375) un aprēķināt pagājušo mēnešu skaitu, pamatojoties uz šādiem diviem intervāliem:

  • 1. jūlijā no pulksten 2:00 līdz 31. jūlija pulksten 10:00.
  • 1. februārī pulksten 2:00 līdz 29. februāra pulksten 10:00.

pirmā aprēķina rezultāts būs 1 mēnesis; otrais rezultāts būs nulle mēneši!

Tātad, ļoti rūpīgi padomājiet, pirms aprēķināt pagājušo laiku pilnās vienībās mēnešiem un gadiem.

Pagājušais laiks, 2. gadījums: Laika vienības maiņa

Laika vienības maiņas definīcija ir samērā vienkārša: ja jūs skaitāt dienas, jūs vienkārši saskaitāt datumu maiņas reižu skaitu. Piemēram, ja kaut kas sākas 15. dienā un beidzas 17. dienā, ir pagājušas 2 dienas. (Datums vispirms mainījās uz 16., pēc tam uz 17. datumu.) Līdzīgi, ja process sākas pulksten 3:25 pēcpusdienā un beidzas pulksten 16:10, ir pagājusi 1 stunda, jo stunda ir mainījusies vienu reizi (no 3 uz 4).

Bibliotēkas bieži šādi aprēķina laiku. Piemēram, ja es aizņemos grāmatu no savas bibliotēkas, man nav nepieciešams, lai grāmata būtu manā īpašumā vismaz 24 stundas, lai bibliotēka to uzskatītu par vienu dienu aizņemtu. Tā vietā grāmatā tiek ierakstīta diena, kad es aizņemos grāmatu. Tiklīdz datums pāriet uz nākamo dienu, esmu grāmatu aizņēmies uz vienu dienu, kaut arī laika daudzums bieži ir mazāks par 24 stundām.

Aprēķinot pagājušo laiku laika vienības maiņas nozīmē, parasti nav jēgas aprēķināt vairāk nekā vienu laika vienību. Piemēram, ja es aizņemos bibliotēkas grāmatu pulksten 21:00 un atdodu to nākamās dienas pusdienlaikā, es varu aprēķināt, ka grāmatu esmu aizņēmies uz vienu dienu. Tomēr nav lielas jēgas jautāt: "Viena diena un cik stundas?" Tā kā grāmata tika aizdota kopumā uz 15 stundām, vai atbilde ir viena diena un negatīva - deviņas stundas? Tādēļ šai apmācībai es aprēķināšu laika vienības maiņu tikai vienai laika vienībai.

Pārmaiņu laika vienības aprēķināšanas algoritms

Šādi jūs aprēķināt izmaiņu laika vienību starp diviem datumiem:

  1. Izveidojiet abu datumu kopijas. The klons () metode var izveidot jums kopijas.
  2. Izmantojot datumu kopijas, visiem laukiem, kas ir mazāki par izmaiņu vienību, iestatiet katra lauka minimālo vērtību. Piemēram, ja jūs skaitāt pagājušās dienas, tad iestatiet stundas, minūtes, sekundes un milisekundes uz nulli. Šajā gadījumā izmantojiet skaidrs () metode laika lauku iestatīšanai uz zemāko vērtību.
  3. Ņemiet agrāko datumu un pievienojiet to laukam, kuru skaitāt, atkārtojot, līdz abi datumi ir vienādi. Atbilde ir reižu skaits, kad pievienojat vienu. Jūs varat izmantot pirms () un pēc () metodes, kas atgriež Būla vērtību, lai pārbaudītu, vai viens datums ir pirms vai pēc cita datuma.

Šajā klasē ir metodes dienu un mēnešu skaitīšanai.

$config[zx-auto] not found$config[zx-overlay] not found