Advertisement
am_dot_com

SW20210430

Apr 30th, 2021 (edited)
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.23 KB | None | 0 0
  1. <!DOCTYPE html>
  2. <!-- quantos_dias.html -->
  3. <html lang="en">
  4. <head>
  5. <meta charset="UTF-8">
  6. <title>Quantos dias já passaram desde uma data</title>
  7. <!-- genéricas -->
  8. <script src="util.js"></script>
  9. <!-- específicas para o projeto corrente -->
  10. <script src="quantos_dias.js"></script>
  11. </head>
  12. <body>
  13. <h1>Dias de intervalo entre uma data e agora</h1>
  14. <form>
  15. <fieldset>
  16. <legend>Uma data</legend>
  17. <label for="idNumberAno">Ano:</label>
  18. <input type="number"
  19. min="1"
  20. id="idNumberAno"
  21. size="4"
  22. value="2000">
  23.  
  24. <label for="idNumberMes">Mes:</label>
  25. <input type="number"
  26. min="1"
  27. max="12"
  28. id="idNumberMes"
  29. size="4"
  30. value="1">
  31.  
  32. <label for="idNumberDia">Dia:</label>
  33. <input type="number"
  34. min="1"
  35. max="31"
  36. size="4"
  37. id="idNumberDia"
  38. value="1">
  39.  
  40. <input type="button"
  41. value="calcular"
  42. id="idBtnCalcular">
  43. </fieldset>
  44. </form>
  45. <hr>
  46. <section id="idSectionFeedback">Aqui aparecerá a
  47. distância, em dias, entre a data escrita/entrada e
  48. a data de hoje.</section>
  49. </body>
  50. </html>
  51.  
  52. **
  53.  
  54. window.onload = boot;
  55.  
  56. const ID_NUMBER_ANO="idNumberAno",
  57. ID_NUMBER_MES="idNumberMes",
  58. ID_NUMBER_DIA="idNumberDia", //case-sensitive
  59. ID_BTN_CALCULAR="idBtnCalcular",
  60. ID_SECTION_FEEDBACK="idSectionFeedback";
  61.  
  62. var oAno, oMes, oDia,
  63. oBtnCalcular, oSectionFeedback;
  64.  
  65. function boot(){
  66. //associações
  67. oAno = $(ID_NUMBER_ANO);
  68. oMes = $(ID_NUMBER_MES);
  69. oDia = $(ID_NUMBER_DIA);
  70. oBtnCalcular = $(ID_BTN_CALCULAR);
  71. oSectionFeedback = $(ID_SECTION_FEEDBACK);
  72.  
  73. var aImportantes = [
  74. oAno, oMes, oDia,
  75. oBtnCalcular,
  76. oSectionFeedback
  77. ];
  78.  
  79. var bTudoOK = qualityControl(aImportantes);
  80.  
  81. if (!bTudoOK){
  82. window.alert ("Há 1+ objeto(s) null - sistema abortado.");
  83. return; //undefined
  84. }
  85.  
  86. //comportamentos
  87. noArranqueUtilizarADataCorrente();
  88. }//boot
  89.  
  90. function noArranqueUtilizarADataCorrente(){
  91. //nope!
  92. /*
  93. oAno.value=2021;
  94. oMes.value=4;
  95. oDia.value=30;
  96. */
  97. var momentoDeAgora = new Date(); //default construction
  98. var iAnoDeAgora = momentoDeAgora.getFullYear(); //2021
  99. var iMesDeAgora = momentoDeAgora.getMonth()+1; //3+1
  100. var iDiaDeAgora = momentoDeAgora.getDate();
  101.  
  102. /*
  103. outros métodos à nossa disposição
  104. getHours() - as horas, de 0 a 23
  105. getMinutes() - os minutos, de 0 a 59
  106. getSeconds() - os segundos, de 0 a 59
  107. getTime() - o nº de ms desde o "Unix Epoch" = 1970-01-01
  108. ????
  109. Quantos dias separam a data escrita pelo utilizador
  110. da data de AGORA
  111. dataUser.getTime()
  112. dataAgora.getTime()
  113. dataAgora.getTime()-dataUser.getTime() - a diferença entre as datas
  114. ...
  115. TODO:
  116. dataVálida
  117. matemática entre datas, para responder os #dias de diferença
  118.  
  119. em pausa até ~1002
  120. */
  121.  
  122. oAno.value=iAnoDeAgora;
  123. oMes.value=iMesDeAgora;
  124. oDia.value=iDiaDeAgora;
  125. }//noArranqueUtilizarADataCorrente
  126.  
  127.  
  128. ******
  129.  
  130.  
  131. window.onload = boot;
  132.  
  133. const ID_NUMBER_ANO="idNumberAno",
  134. ID_NUMBER_MES="idNumberMes",
  135. ID_NUMBER_DIA="idNumberDia", //case-sensitive
  136. ID_BTN_CALCULAR="idBtnCalcular",
  137. ID_SECTION_FEEDBACK="idSectionFeedback";
  138.  
  139. var oAno, oMes, oDia,
  140. oBtnCalcular, oSectionFeedback;
  141.  
  142. function boot(){
  143. //associações
  144. oAno = $(ID_NUMBER_ANO);
  145. oMes = $(ID_NUMBER_MES);
  146. oDia = $(ID_NUMBER_DIA);
  147. oBtnCalcular = $(ID_BTN_CALCULAR);
  148. oSectionFeedback = $(ID_SECTION_FEEDBACK);
  149.  
  150. var aImportantes = [
  151. oAno, oMes, oDia,
  152. oBtnCalcular,
  153. oSectionFeedback
  154. ];
  155.  
  156. var bTudoOK = qualityControl(aImportantes);
  157.  
  158. if (!bTudoOK){
  159. window.alert ("Há 1+ objeto(s) null - sistema abortado.");
  160. return; //undefined
  161. }
  162.  
  163. //comportamentos
  164. noArranqueUtilizarADataCorrente();
  165. }//boot
  166.  
  167. function noArranqueUtilizarADataCorrente(){
  168. //nope!
  169. /*
  170. oAno.value=2021;
  171. oMes.value=4;
  172. oDia.value=30;
  173. */
  174. var momentoDeAgora = new Date(); //default construction
  175. var iAnoDeAgora = momentoDeAgora.getFullYear(); //2021
  176. var iMesDeAgora = momentoDeAgora.getMonth()+1; //3+1
  177. var iDiaDeAgora = momentoDeAgora.getDate();
  178.  
  179. /*
  180. outros métodos à nossa disposição
  181. getHours() - as horas, de 0 a 23
  182. getMinutes() - os minutos, de 0 a 59
  183. getSeconds() - os segundos, de 0 a 59
  184. getTime() - o nº de ms desde o "Unix Epoch" = 1970-01-01
  185. ????
  186. Quantos dias separam a data escrita pelo utilizador
  187. da data de AGORA
  188. dataUser.getTime()
  189. dataAgora.getTime()
  190. dataAgora.getTime()-dataUser.getTime() - a diferença entre as datas
  191. ...
  192. TODO:
  193. dataValida (ficou com o nome diaValido)
  194. matemática entre datas, para responder os #dias de diferença
  195.  
  196. em pausa até ~1002
  197. */
  198.  
  199. //inicializar os valores nos campos à data atual
  200. oAno.value=iAnoDeAgora;
  201. oMes.value=iMesDeAgora;
  202. oDia.value=iDiaDeAgora;
  203.  
  204. //testara function diaValido
  205. oBtnCalcular.onclick = calcular;
  206. }//noArranqueUtilizarADataCorrente
  207.  
  208. function calcular(){
  209. var ano=Number(oAno.value);
  210. var mes=Number(oMes.value);
  211. var dia=Number(oDia.value);
  212.  
  213. var bDataValida = diaValido(
  214. ano,
  215. mes,
  216. dia
  217. );
  218.  
  219. oSectionFeedback.innerHTML =
  220. bDataValida ? "Data válida!" : "Ooops: data inválida";
  221.  
  222. if (bDataValida){
  223. var dataUtilizador =
  224. new Date(ano, mes-1, dia);
  225.  
  226. var dataAgora = new Date();
  227.  
  228. var msDataUtilizador = dataUtilizador.getTime();
  229. var msDataAgora = dataAgora.getTime();
  230.  
  231. var msDiferenca =
  232. Math.abs(msDataAgora - msDataUtilizador);
  233.  
  234. var diasDiferenca =
  235. //ms/segundos/minutos/horas/dias
  236. msDiferenca/1000/60/60/24;
  237.  
  238. oSectionFeedback.innerHTML = Math.floor(diasDiferenca);
  239. }
  240. }
  241.  
  242. function anoValido(pAno){
  243. //sol 1
  244. return pAno>=1;
  245.  
  246. //sol 2
  247. if (pAno>=1){
  248. return true;
  249. }
  250. else
  251. return false;
  252.  
  253. //sol 3
  254. return (pAno>=1) ? true : false;
  255.  
  256. //sol 4
  257. var bAnoMaiorOuIdentico1 = pAno>=1;
  258. if (bAnoMaiorOuIdentico1) return true;
  259. else return false;
  260. }//anoValido
  261.  
  262. function mesValido(pMes){
  263. //sol1
  264. return pMes>=1 && pMes<=12;
  265.  
  266. //sol2
  267. return !(pMes<1 || pMes>12);
  268.  
  269. //sol3
  270. return (bResultado=(pMes>=1 && pMes<=12)) ? true : false;
  271.  
  272. //sol4
  273. switch(pMe /* exp ordinal */){
  274. case 1:
  275. case 2: case 3: case 4: case 5: case 6:
  276. case 7: case 8: case 9: case 10: case 11:
  277. case 12:
  278. return true;
  279. default:
  280. return false;
  281. }//switch
  282. }//mesValido
  283.  
  284. function diaValido(
  285. pAno,
  286. pMes,
  287. pDia
  288. )
  289. {
  290. var bAnoValido = anoValido(pAno);
  291. var bMesValido = mesValido(pMes);
  292. if (!bAnoValido || !bMesValido){
  293. return false;
  294. }
  295.  
  296. var numTotalDeDiasDoMes = numeroDeDiasNoMes(pAno, pMes);
  297. return pDia>=1 && pDia<=numTotalDeDiasDoMes;
  298. }//diaValido
  299.  
  300. const MES_IMPOSSIVEL = -1;
  301. function numeroDeDiasNoMes (
  302. pAno,
  303. pMes
  304. ){
  305. /*
  306. var b31 = pMes==1 || pMes==3 || pMes==5 || pMes==7 || pMes==8
  307. || pMes==10 || pMes==12;
  308. var b30 = pMes==4 || pMes==6 || pMes==9 || pMes==11;
  309. var bFevereiro = pMes==2;
  310. if (b31) return 31;
  311. else if(b30) return 30;
  312. else if(bFevereiro) return bissexto(pAno) ? 29:28;
  313. else return MES_IMPOSSIVEL;
  314. */
  315.  
  316. /*
  317. if (pMes==1 || pMes==3 || pMes==5 || pMes==7 || pMes==8
  318. || pMes==10 || pMes==12) return 31;
  319. else{
  320. if (pMes==4 || pMes==6 || pMes==9 || pMes==11)
  321. return 30;
  322. else{
  323. if (pMes==2) return bissexto(pMes) ? 29:28;
  324. else return MES_IMPOSSIVEL;
  325. }
  326. }
  327. */
  328.  
  329. switch(pMes) {
  330. case 1:
  331. case 3:
  332. case 5:
  333. case 7:
  334. case 8:
  335. case 10:
  336. case 12:
  337. return 31;
  338.  
  339. case 4:
  340. case 6:
  341. case 9:
  342. case 11:
  343. return 30;
  344.  
  345. case 2:
  346. return bissexto(pAno) ? 29 : 28;
  347.  
  348. default:
  349. return MES_IMPOSSIVEL;
  350. }//switch
  351. }//numeroDeDiasNoMes
  352.  
  353. /*
  354. Exercício: escreva, em JS, a função "bissexto" ("leapYear"), que
  355. que, recebido um ano qualquer, retorna true se esse ano
  356. for um ano bissexto; e false, caso contrário.
  357. O que é um ano bissexto?
  358. É um ano múltiplo 4, excepto se for um ano secular
  359. (múltiplo de 100, que marca uma viragem de século),
  360. excepto se for múltiplo de 400 (por definição, anos
  361. múltiplos de 400 são sempre bissextos).
  362. */
  363. function bissexto (pAno){
  364. var bM4 = pAno%4===0;
  365. var bM100 = pAno%100===0;
  366. var bM400 = pAno%400===0;
  367.  
  368. var bC1 = bM4 && !bM100;
  369. var bC2 = bM400;
  370.  
  371. return bC1 || bC2;
  372.  
  373. return (pAno%4===0 && pAno%100!==0) || (pAno%400===0);
  374. }//bissexto
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement