fork download
  1. import java.text.*;
  2. import java.util.*;
  3.  
  4. class Eveniment {
  5. private Date dataInceput, dataSfarsit;
  6. private String nume;
  7.  
  8. public Eveniment(String dataInceput, String dataSfarsit, String nume) {
  9. SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  10. try {
  11. this.dataInceput = format.parse(dataInceput);
  12. this.dataSfarsit = format.parse(dataSfarsit);
  13. } catch (ParseException e) {
  14. System.out.println("Data nu este in formatul cerut!");
  15. }
  16. this.nume = nume;
  17. }
  18.  
  19. public Date getDataInceput() {
  20. return dataInceput;
  21. }
  22.  
  23. public Date getDataSfarsit() {
  24. return dataSfarsit;
  25. }
  26.  
  27. public String getNume() {
  28. return nume;
  29. }
  30. }
  31.  
  32. class EvenimentRecurent extends Eveniment {
  33. private int intervalRecurentaOre;
  34.  
  35. public EvenimentRecurent(String dataInceput, String dataSfarsit, String nume, int numarOre) {
  36. super(dataInceput, dataSfarsit, nume);
  37. this.intervalRecurentaOre = numarOre;
  38. }
  39.  
  40. public String urmatorulEveniment(String dataCurentaString) {
  41. SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  42. try {
  43. Date dataCurenta = format.parse(dataCurentaString);
  44. Date dataInceputEveniment = this.getDataInceput();
  45.  
  46. long diferentaMilisecunde = dataCurenta.getTime() - dataInceputEveniment.getTime();
  47. long intervalMilisecunde = (long) intervalRecurentaOre * 60 * 60 * 1000;
  48.  
  49. long numarRecurenteTrecute = diferentaMilisecunde / intervalMilisecunde;
  50.  
  51. Calendar urmatorulEvenimentCalendar = Calendar.getInstance();
  52. urmatorulEvenimentCalendar.setTime(dataInceputEveniment);
  53. urmatorulEvenimentCalendar.add(Calendar.HOUR_OF_DAY, (int) (numarRecurenteTrecute + 1) * intervalRecurentaOre);
  54.  
  55. return format.format(urmatorulEvenimentCalendar.getTime());
  56.  
  57. } catch (ParseException e) {
  58. System.out.println("Data curentă nu este în formatul cerut!");
  59. return null;
  60. }
  61. }
  62. }
  63.  
  64. public class Main {
  65. public static void main(String[] args) {
  66. EvenimentRecurent er = new EvenimentRecurent("2019-03-09 22:46:00",
  67. "2019-03-09 23:00:00", "Scris probleme", 24);
  68. System.out.println(er.urmatorulEveniment("2019-04-19 22:46:23"));
  69. // 2019-04-20 22:46:00
  70. }
  71. }
  72.  
  73. /*Sigur, iată ideea generală și pașii pentru a rezolva problema creării clasei
  74. EvenimentRecurent:
  75.  
  76. Ideea Generală:
  77.  
  78. Trebuie să creezi o clasă nouă (EvenimentRecurent) care "moștenește"
  79. caracteristicile clasei Eveniment (data de început, data de sfârșit, nume)
  80. și adaugă funcționalitatea specifică evenimentelor care se repetă la un anumit
  81. interval de timp (în ore). Scopul principal este ca, dată fiind o anumită dată
  82. și oră (dataCurenta), clasa să poată calcula și returna data și ora la care va
  83. avea loc următoarea instanță a evenimentului recurent.
  84.  
  85. Pași de Rezolvare:
  86.  
  87. Definește clasa EvenimentRecurent ca subclasă a clasei Eveniment:
  88.  
  89. Folosește cuvântul cheie extends în declarația clasei: class EvenimentRecurent
  90. extends Eveniment { ... }.
  91. Adaugă un câmp pentru intervalul de recurență:
  92.  
  93. În interiorul clasei EvenimentRecurent, declară o variabilă privată de tip int
  94. pentru a stoca numărul de ore după care evenimentul se repetă (de exemplu,
  95. private int intervalRecurentaOre;).
  96. Implementează constructorul clasei EvenimentRecurent:
  97.  
  98. Constructorul trebuie să primească ca argumente: dataInceput (String),
  99. dataSfarsit (String), nume (String), și numarOre (int).
  100. În interiorul constructorului:
  101. Apelează constructorul clasei părinte Eveniment folosind super(dataInceput,
  102. dataSfarsit, nume); pentru a inițializa câmpurile moștenite.
  103. Initializează câmpul intervalRecurentaOre cu valoarea primită pentru numarOre.
  104. Implementează metoda urmatorulEveniment(String dataCurentaString):
  105.  
  106. Această metodă primește un String (dataCurentaString) reprezentând data și
  107. ora curente.
  108. Parseează datele:
  109. Creează un obiect SimpleDateFormat cu formatul "yyyy-MM-dd HH:mm:ss".
  110. Încearcă să convertești atât dataCurentaString cât și dataInceput (obținut din
  111. câmpul moștenit) în obiecte java.util.Date folosind metoda
  112. parse() a SimpleDateFormat. Trebuie să gestionezi excepția ParseException în
  113. cazul în care formatul stringului este incorect.
  114. Calculează diferența de timp și numărul de recurențe:
  115. Calculează diferența în milisecunde dintre dataCurenta și dataInceput folosind
  116. metoda getTime() a clasei Date.
  117. Calculează intervalul de recurență în milisecunde (înmulțește
  118. intervalRecurentaOre cu 60 * 60 * 1000).
  119. Determină de câte ori s-a repetat evenimentul complet până la dataCurenta
  120. împărțind diferența de timp la intervalul de recurență.
  121. Calculează momentul următorului eveniment:
  122. Creează un obiect java.util.Calendar și setează-l la data de început a
  123. evenimentului (dataInceput).
  124. Adaugă la această dată un număr de ore egal cu (numărul de recurențe
  125. complete + 1) * intervalRecurentaOre. Adăugăm + 1 pentru a obține
  126. următorul eveniment.
  127. Formatează rezultatul:
  128. Folosește același obiect SimpleDateFormat pentru a formata obiectul Date
  129. rezultat (din Calendar) înapoi într-un String în formatul "yyyy-MM-dd HH:mm:ss".
  130. Returnează rezultatul: Returnează stringul formatat. În cazul unei erori
  131. de parsare, poți returna null sau arunca o excepție.*/
Success #stdin #stdout 0.24s 59056KB
stdin
Standard input is empty
stdout
2019-04-20 22:46:00