Foros del Web » Programando para Internet » PHP »

APORTE Validar Fecha con DatePicker

Estas en el tema de APORTE Validar Fecha con DatePicker en el foro de PHP en Foros del Web. Bueno les traigo este aporte para los que lo necesiten, con el podran validar en tiempo real si hay disponibilidad de una fecha solo al ...
  #1 (permalink)  
Antiguo 27/06/2015, 13:12
Avatar de xfxstudios  
Fecha de Ingreso: junio-2015
Ubicación: Valencia - Venezuela
Mensajes: 2.448
Antigüedad: 8 años, 10 meses
Puntos: 263
Información APORTE Validar Fecha con DatePicker

Bueno les traigo este aporte para los que lo necesiten, con el podran validar en tiempo real si hay disponibilidad de una fecha solo al seleccionarla:
  #2 (permalink)  
Antiguo 27/06/2015, 13:13
Avatar de xfxstudios  
Fecha de Ingreso: junio-2015
Ubicación: Valencia - Venezuela
Mensajes: 2.448
Antigüedad: 8 años, 10 meses
Puntos: 263
Respuesta: APORTE Validar Fecha con DatePicker

Parte 1:
Llamamos los archivos necesarios para que funcione nuestro Datepicker:
Código HTML:
Ver original
  1. <link href="../../jQueryAssets/jquery.ui.core.min.css" rel="stylesheet" type="text/css">
  2.         <link href="../../jQueryAssets/jquery.ui.theme.min.css" rel="stylesheet" type="text/css">
  3.         <link href="../../jQueryAssets/jquery.ui.datepicker.min.css" rel="stylesheet" type="text/css">
  4.         <script src="../../jQueryAssets/jquery-1.11.1.min.js" type="text/javascript"></script>
  5.         <script src="../../jQueryAssets/jquery.ui-1.10.4.datepicker.min.js" type="text/javascript"></script>
  #3 (permalink)  
Antiguo 27/06/2015, 13:14
Avatar de xfxstudios  
Fecha de Ingreso: junio-2015
Ubicación: Valencia - Venezuela
Mensajes: 2.448
Antigüedad: 8 años, 10 meses
Puntos: 263
Respuesta: APORTE Validar Fecha con DatePicker

Parte 2:
Luego creamos nuestro FORM:
Código HTML:
Ver original
  1. <input type="text" id="Datepicker1" name="fecha"  onChange="javascript:recargar();" value="" required>
  2. <div id="recargado"></div><!--este es el div que se va a actualizar con la informacion-->
  3. </form>
  #4 (permalink)  
Antiguo 27/06/2015, 13:20
Avatar de xfxstudios  
Fecha de Ingreso: junio-2015
Ubicación: Valencia - Venezuela
Mensajes: 2.448
Antigüedad: 8 años, 10 meses
Puntos: 263
Respuesta: APORTE Validar Fecha con DatePicker

Como pueden ver tiene la funcion onChange que llama nuestro script.
aqui el script que consulta la fecha sin refrescar la pagina:
Código Javascript:
Ver original
  1. <script type="text/javascript">
  2. function recargar(){
  3. valorCaja2 = document.getElementById("Datepicker1").value;/*aqui selecciona el input que tiene el valor a pasar*/
  4. $.ajax({
  5. /*data: parametros,*/
  6. url: 'consulta_fecha.php?fecha='+valorCaja2,
  7. type: 'get',
  8. beforeSend: function () {
  9. $("#recargado").html("Consultando, espere por favor...");
  10. },
  11. success: function (response) {
  12. $("#recargado").html(response);
  13. //document.getElementById("primer").style.display = "none";
  14. }
  15. });
  16. }
  17. var estado = 0;
  18. function pasarProceso(valor1, valor2) {
  19. if (estado == 0) {
  20. setTimeout(realizaProceso,2000,valor1,valor2);
  21. estado = estado + 1;
  22. }
  23. else {
  24. estado = 0;
  25. }
  26. }
  27. </script>
  #5 (permalink)  
Antiguo 27/06/2015, 13:20
Avatar de xfxstudios  
Fecha de Ingreso: junio-2015
Ubicación: Valencia - Venezuela
Mensajes: 2.448
Antigüedad: 8 años, 10 meses
Puntos: 263
Respuesta: APORTE Validar Fecha con DatePicker

Parte 4:
codigo que llama al datepicker:
Código Javascript:
Ver original
  1. <script type="text/javascript">
  2. $(function() {
  3.     $( "#Datepicker1" ).datepicker({
  4.         autoSize: true,
  5.             dayNames: ['Domingo', 'Lunes', 'Martes', 'Miércoles', 'Jueves', 'Viernes', 'Sábado'],
  6.             dayNamesMin: ['Dom', 'Lu', 'Ma', 'Mi', 'Je', 'Vi', 'Sa'],
  7.             firstDay: 1,
  8.             monthNames: ['Enero','Febrero','Marzo','Abril','Mayo','Junio','Julio','Agosto','Septiembre','Octubre','Noviembre','Diciembre'],
  9.             monthNamesShort: ['Ene','Feb','Mar','Abr','May','Jun','Jul','Ago','Sep','Oct','Nov','Dic'],
  10.             dateFormat: 'yy-mm-dd',
  11.             minDate: 0,
  12.             changeMonth: true,
  13.             /*numberOfMonths: 2,
  14.             showButtonPanel: true*/
  15.             /*changeYear: true*/
  16.             });
  17. });
  18. </script>
  #6 (permalink)  
Antiguo 27/06/2015, 13:26
Avatar de xfxstudios  
Fecha de Ingreso: junio-2015
Ubicación: Valencia - Venezuela
Mensajes: 2.448
Antigüedad: 8 años, 10 meses
Puntos: 263
Respuesta: APORTE Validar Fecha con DatePicker

Paso 5:
y este es el script php que consulta la fecha y nos envia la info desde otra pagina:
Código PHP:
Ver original
  1. <?php
  2. $fecha = $_GET['fecha'];
  3. ?>
  4. <?php
  5. $mysqli = new MySQLi($hostname_seguridad, $username_seguridad, $password_seguridad, $database_seguridad);
  6. $fechas = $mysqli->query("SELECT fecha FROM cronograma_cursos WHERE fecha = '$_GET[fecha]'");
  7. $row_fechas = $fechas->fetch_assoc();
  8. $totalRows_fechas = mysqli_num_rows($fechas);
  9. $total = mysqli_num_rows($fechas);
  10. //aqui validamos el parametro que necesitamos en este caso si el registro esta repetido 3 o mas veces
  11. if($total >= 3) {
  12.     echo "<b style='color:#FF0004'>Fecha No disponible</b>";
  13. }
  14.     else {
  15.        
  16.     echo "<b style='color:#00B503'>Fecha Disponible</b>";
  17.     }
  18. ?>
  #7 (permalink)  
Antiguo 27/06/2015, 13:28
Avatar de xfxstudios  
Fecha de Ingreso: junio-2015
Ubicación: Valencia - Venezuela
Mensajes: 2.448
Antigüedad: 8 años, 10 meses
Puntos: 263
Respuesta: APORTE Validar Fecha con DatePicker

paso 6:
En caso de querer bloquear las fechas directamente al cargar la pagina, estros serían lso script:
Codigo que consulta al abrir la pagina y convierte el resultado en json para bloquear las fechas recuperadas:

Código PHP:
Ver original
  1. <?php
  2. $data = new MySQLi($hostname_seguridad, $username_seguridad, $password_seguridad, $database_seguridad);
  3. $fecha = $data->query("SELECT * FROM cronograma_cursos");
  4. $row_fecha = $fecha->fetch_assoc();
  5. $totalRows_fecha = mysqli_num_rows($fecha);
  6. if(mysqli_num_rows($fecha)>0)
  7. {
  8. while($row = mysqli_fetch_assoc($fecha))
  9. {
  10.     $dispo[] = $row['fecha'];
  11. }
  12. $dispo_json = json_encode($dispo);
  13. $dispo_json = stripslashes($dispo_json);
  14. $dispo_json = str_replace("[","", $dispo_json);
  15. $dispo_json = str_replace("]","", $dispo_json);
  16. }
  17. ?>
  #8 (permalink)  
Antiguo 27/06/2015, 13:28
Avatar de xfxstudios  
Fecha de Ingreso: junio-2015
Ubicación: Valencia - Venezuela
Mensajes: 2.448
Antigüedad: 8 años, 10 meses
Puntos: 263
Respuesta: APORTE Validar Fecha con DatePicker

paso 7:
Funcion datepicker que bloquea las fechas recibidas:
Código Javascript:
Ver original
  1. <script type="text/javascript">
  2. $(function() {
  3.     $( "#Datepicker1" ).datepicker({
  4.         autoSize: true,
  5.             dayNames: ['Domingo', 'Lunes', 'Martes', 'Miércoles', 'Jueves', 'Viernes', 'Sábado'],
  6.             dayNamesMin: ['Dom', 'Lu', 'Ma', 'Mi', 'Je', 'Vi', 'Sa'],
  7.             firstDay: 1,
  8.             monthNames: ['Enero','Febrero','Marzo','Abril','Mayo','Junio','Julio','Agosto','Septiembre','Octubre','Noviembre','Diciembre'],
  9.             monthNamesShort: ['Ene','Feb','Mar','Abr','May','Jun','Jul','Ago','Sep','Oct','Nov','Dic'],
  10.             dateFormat: 'yy-mm-dd',
  11.             minDate: 0,
  12.             beforeShowDay: checkAvailability,
  13.             changeMonth: true,
  14.             /*numberOfMonths: 2,
  15.             showButtonPanel: true*/
  16.             /*changeYear: true*/
  17.             });
  18. var $myBadDates = new Array(<?php echo $dispo_json ?>);
  19.     function checkAvailability(mydate){
  20.     var $return=true;
  21.     var $returnclass ="available";
  22.     $checkdate = $.datepicker.formatDate('yy-mm-dd', mydate);
  23.     for(var i = 0; i < $myBadDates.length; i++)
  24.         {    
  25.            if($myBadDates[i] == $checkdate)
  26.               {
  27.             $return = false;
  28.             $returnclass= "unavailable";
  29.             }
  30.         }
  31.     return [$return,$returnclass];
  32.     }
  33. });
  34. </script>
espero les sirva....
  #9 (permalink)  
Antiguo 27/06/2015, 13:31
Avatar de xfxstudios  
Fecha de Ingreso: junio-2015
Ubicación: Valencia - Venezuela
Mensajes: 2.448
Antigüedad: 8 años, 10 meses
Puntos: 263
Respuesta: APORTE Validar Fecha con DatePicker

Disculpen, lo cree así porque no me deja crearlo en un solo post, me manda a un capcha a cada rato y luego se queda en blanco la pantalla.
  #10 (permalink)  
Antiguo 28/06/2015, 22:10
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 11 años, 11 meses
Puntos: 320
Respuesta: APORTE Validar Fecha con DatePicker

2 librerías js, 3 hojas de estilo, 30 lineas de configuración, un script php vulnerable a ataques de inyección sql: ¿todo eso para un simple datepicker?
No es por menospreciar tu aporte, pero vamos, que con 50 lineas de css, 100 de js nativo (sin librerías) y unas 40 de php se puede hacer sin problemas y logrando un efecto mejor.

Personalmente le veo mas problemas que soluciones. No te lo tomes a mal, solo es mi opinión. Saludos.
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios
  #11 (permalink)  
Antiguo 29/06/2015, 05:13
Avatar de xfxstudios  
Fecha de Ingreso: junio-2015
Ubicación: Valencia - Venezuela
Mensajes: 2.448
Antigüedad: 8 años, 10 meses
Puntos: 263
Respuesta: APORTE Validar Fecha con DatePicker

Cita:
Iniciado por NSD Ver Mensaje
2 librerías js, 3 hojas de estilo, 30 lineas de configuración, un script php vulnerable a ataques de inyección sql: ¿todo eso para un simple datepicker?
No es por menospreciar tu aporte, pero vamos, que con 50 lineas de css, 100 de js nativo (sin librerías) y unas 40 de php se puede hacer sin problemas y logrando un efecto mejor.

Personalmente le veo mas problemas que soluciones. No te lo tomes a mal, solo es mi opinión. Saludos.
Gracias por tu opinión, en tal caso fuere sido mas apreciable la solución que mencionas, pero igual gracias fue muy productivo de verdad!
  #12 (permalink)  
Antiguo 29/06/2015, 13:46
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 11 años, 11 meses
Puntos: 320
Respuesta: APORTE Validar Fecha con DatePicker

Cita:
Gracias por tu opinión, en tal caso fuere sido mas apreciable la solución que mencionas, pero igual gracias fue muy productivo de verdad!
Note el sarcasmo.
Mas allá de eso, es tu aporte no el mio.

¿Quieres ver la solución terminada? el merito esta en encontrarla y luego en compartirla, no en pedirla hecha.

En fin.

calendario.sql
Código MySQL:
Ver original
  1. CREATE TABLE IF NOT EXISTS `reservas` (
  2.   `fecha` date NOT NULL,
  3.   PRIMARY KEY (`codigo`),
  4.   UNIQUE KEY `fecha` (`fecha`)
  5. ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci AUTO_INCREMENT=6 ;
  6.  
  7. INSERT INTO `reservas` (`codigo`, `fecha`) VALUES
  8. (3, '2015-06-04'),
  9. (1, '2015-06-10'),
  10. (2, '2015-06-13'),
  11. (5, '2015-06-16'),
  12. (4, '2015-06-25');

calendario.php
Código PHP:
Ver original
  1. <?php
  2.     if($_SERVER["REQUEST_METHOD"] === "POST") {
  3.         $date = DateTime::createFromFormat("Y-m-d", $_POST["datepicker"]);
  4.         if(!($date && ($date->format("Y-m-d") === $_POST["datepicker"])))
  5.             die("Fecha invalida.");
  6.  
  7.         $mysqli = new Mysqli("localhost", "root", "", "calendario");
  8.         $reservas = $mysqli->query("SELECT DATE_FORMAT(fecha, '%d') dia
  9.                        FROM reservas
  10.                        WHERE fecha BETWEEN '".$date->format("Y-m-")."01' AND LAST_DAY('".$date->format("Y-m-d")."')
  11.                        ORDER BY fecha ASC
  12.                        LIMIT 31");
  13.        
  14.         $fechas = [];        
  15.         while($reserva = $reservas->fetch_assoc()) {
  16.             $fechas = array_pad($fechas, $reserva["dia"] - 1, false);
  17.             $fechas[] = true;
  18.         }
  19.         $fechas = array_pad($fechas, 31, false);
  20.        
  21.         die(json_encode($fechas));
  22.     }

calendario.css
Código CSS:
Ver original
  1. table.calendar{
  2.     width: 400px;
  3.     margin: 50px auto;
  4.     box-shadow: 0 0 4px #AAA;
  5.     font-family: arial;
  6.     border: 2px solid #2980b9;
  7.     padding: 0;
  8.     border-collapse: collapse;
  9. }
  10.  
  11. table.calendar th{
  12.     background-color: #2980b9;
  13.     color: #f9f9f9;
  14.     padding: 6px 0;
  15.     text-transform: uppercase;
  16.     text-align: center;
  17.     width: 14%;
  18. }
  19.  
  20. table.calendar th.action{
  21.     font-size: 20px;
  22.     cursor: pointer;
  23. }
  24.  
  25. table.calendar th.action:hover {
  26.     background-color: #ecf0f1;
  27.     color: #3498db;
  28. }
  29.  
  30. table.calendar td{
  31.     background-color: #f9f9f9;
  32.     border: 1px solid #eee;
  33.     color: #2c3e50;
  34.     padding: 6px 0;
  35.     text-transform: uppercase;
  36.     text-align: center;
  37.     user-select: none;
  38. }
  39.  
  40. table.calendar td.invalid {
  41.     background-color: #AAA;
  42.     color: #333;
  43. }
  44.  
  45. table.calendar td.valid:hover,
  46. table.calendar td.valid.active {
  47.     background-color: #3498db;
  48.     color: #ecf0f1;
  49. }

calendario.js
Código Javascript:
Ver original
  1. Calendar = function(form, params) {
  2.     params || (params = {});
  3.     params.name || (params.name = "datepicker");
  4.     this.ajxcheck = params.ajxcheck;
  5.     this.on = params.on;
  6.     this.actives = [];
  7.     this.date = (params.date ? params.date : new Date());
  8.     this.form = form;
  9.     this.input = document.createElement("input");
  10.     this.input.type = "hidden";
  11.     this.input.name = params.name;
  12.     this.input.value = this.getDate();
  13.     this.form.appendChild(this.input);
  14.     this.table = this.form.appendChild(document.createElement("table"));
  15.     this.table.classList.add("calendar");
  16.     this.check();
  17. }
  18.  
  19. Calendar.prototype = {
  20.     "i18n" : {
  21.         "months" : ["Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"],
  22.         "days" : ["Domingo", "Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado"]
  23.     },
  24.     "check" : function() {
  25.         if(this.ajxcheck)
  26.             this.ajax(this.ajxcheck, {
  27.                "success" : this.draw.bind(this),
  28.                "error" : function(e) { console.log(e); }
  29.             });
  30.         else
  31.             this.draw([]);
  32.     },
  33.     "draw" : function(check) {
  34.         var row, cell, firstDay, countDays, init = true, residue = 0, currentDay, thisDay;
  35.         while (this.table.firstChild) this.table.removeChild(this.table.lastChild);
  36.  
  37.         row = this.table.appendChild(document.createElement("tr"));
  38.  
  39.         cell = row.appendChild(document.createElement("th"));
  40.         cell.classList.add("action");
  41.         cell.innerHTML = "<";
  42.         cell.addEventListener("click", this.change_month.bind(this, -1));
  43.  
  44.         cell = row.appendChild(document.createElement("th"));
  45.         cell.colSpan = 5;
  46.         cell.innerHTML = this.i18n.months[this.date.getMonth()] + " " + this.date.getFullYear();
  47.         cell.addEventListener("click", this.change_month.bind(this, -1));
  48.  
  49.         cell = row.appendChild(document.createElement("th"));
  50.         cell.classList.add("action");
  51.         cell.innerHTML = ">";
  52.         cell.addEventListener("click", this.change_month.bind(this, 1));
  53.  
  54.         row = this.table.appendChild(document.createElement("tr"));
  55.         for(var day=0; day<this.i18n.days.length; day++)
  56.             row.appendChild(document.createElement("th")).innerHTML = this.i18n.days[day].substring(0, 3);
  57.  
  58.         firstDay = (new Date(this.date.getFullYear(), this.date.getMonth(), 1)).getDay();
  59.         countDays = (new Date(this.date.getFullYear(), this.date.getMonth() + 1, 0)).getDate();
  60.  
  61.         for(currentDay=0; currentDay < countDays+firstDay; currentDay++) {
  62.             if(currentDay % 7 == 0) {
  63.                 row = this.table.appendChild(document.createElement("tr"));
  64.                 residue = 7;
  65.             }
  66.  
  67.             if(init) {
  68.                 if(currentDay < firstDay)
  69.                     row.appendChild(document.createElement("td"));
  70.                 else
  71.                     init = false;
  72.             }
  73.  
  74.             if(!init) {
  75.                 thisDay = (currentDay - firstDay + 1);
  76.                 cell = row.appendChild(document.createElement("td"));
  77.                 cell.innerHTML = thisDay;
  78.  
  79.                 if(!check[currentDay - firstDay]) {
  80.                     cell.classList.add("valid");
  81.                     cell.addEventListener("click", function(cell, thisDay) {
  82.                         var active = this.table.getElementsByClassName("active");
  83.                         while(active.length) active[0].classList.remove("active");
  84.                         cell.classList.add("active");
  85.                         this.actives.push(cell);
  86.                         this.date.setDate(thisDay);
  87.                         this.input.value = this.getDate();
  88.  
  89.                         if(this.on && this.on.change)
  90.                             this.on.change(this.getDate());
  91.                     }.bind(this, cell, thisDay));
  92.  
  93.                     if(this.date.getDate() == thisDay) {
  94.                         cell.classList.add("active");
  95.                         this.actives.push(cell);
  96.                     }
  97.                 } else {
  98.                     cell.classList.add("invalid");
  99.                 }
  100.  
  101.             }
  102.  
  103.             residue--;
  104.         }
  105.  
  106.         for(currentDay=0; currentDay<residue; currentDay++)
  107.             row.appendChild(document.createElement("td"));
  108.     },
  109.     "change_month" : function(inc) {
  110.         var newMonth = this.date.getMonth() + inc,
  111.             newYear = this.date.getFullYear() + (newMonth < 0 ? -1 : (newMonth > 11 ? 1 : 0));
  112.         newMonth = (newMonth < 0 ? 11 : (newMonth > 11 ? 0 : newMonth));
  113.  
  114.         this.date = (new Date(newYear, newMonth, this.date.getDate()));
  115.         this.input.value = this.getDate();
  116.         this.check();
  117.         if(this.on && this.on.change)
  118.             this.on.change(this.getDate());
  119.     },
  120.     "getDate" : function() {
  121.         var month = (this.date.getMonth() + 1),
  122.             day = this.date.getDate();
  123.         return this.date.getFullYear() + "-" + (month < 10 ? "0" : "") + month + "-" + (day < 10 ? "0" : "") + day;
  124.     },
  125.     "ajax" : function(url, callbacks) {
  126.         var request = new XMLHttpRequest();
  127.         request.open("post", url);
  128.         request.onreadystatechange = function(callbacks) {
  129.             if(this.readyState === 4) {
  130.                 var response = this.responseText,
  131.                     success = false;
  132.  
  133.                 if(this.status == 200) {
  134.                     try {
  135.                         response = JSON.parse(response);
  136.                         success = true;
  137.                     } catch(e) { }
  138.                 }
  139.  
  140.                 if(success)
  141.                 {
  142.                     if(callbacks.success)
  143.                         callbacks.success(response);
  144.                 }
  145.                 else if(callbacks.error)
  146.                     callbacks.error({"response" : response});
  147.             }
  148.         }.bind(request, callbacks);
  149.  
  150.         request.send(new FormData(this.form));
  151.     }
  152. }

calendario.html
Código HTML:
Ver original
  1. <!DOCTYPE html>
  2.     <head>
  3.         <title>Calendario</title>
  4.         <link rel="stylesheet" href="calendario.css">        
  5.         <script src="calendario.js"></script>
  6.     </head>
  7.    
  8.     <body>   
  9.         <form id="calendar"></form>
  10.        
  11.         <script>
  12.             new Calendar(document.getElementById("calendar"), { "ajxcheck" : "calendario.php" });
  13.         </script>        
  14.     </body>  
  15. </html>

Por supuesto que se puede mejorar, pero eso te lo dejo a ti.
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios
  #13 (permalink)  
Antiguo 29/06/2015, 14:14
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: APORTE Validar Fecha con DatePicker

Definitivamente existen mejores formas, más estables, con pruebas y usando estándares modernos.

Sinceramente tampoco le veo el "aporte" a un código que parece escrito hace 10 años.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #14 (permalink)  
Antiguo 29/06/2015, 16:40
Avatar de xfxstudios  
Fecha de Ingreso: junio-2015
Ubicación: Valencia - Venezuela
Mensajes: 2.448
Antigüedad: 8 años, 10 meses
Puntos: 263
Respuesta: APORTE Validar Fecha con DatePicker

Ok amigo gracias por el apoyo, igual con esos comentarios aprende uno, recuerden, hasta de lo malo se saca algo bueno!!!!! cuídense (y no hay sarcasmo).

Etiquetas: datepicker, fecha
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 19:09.