Hola, te doy la bienvenida a este nuevo video. Te falta codificar el método "daTransmisión", la documentación del método te dice que debe regresar una cadena con la fecha y hora en la que se solicita la transmisión, si es que hay disponibles, además de actualizar el número de transmisiones activas en ese caso. Para dar esta salida necesitas funciones que, cuando las invocas, regresen fecha y hora de ese momento. Revisando la documentación de Java, encuentras una clase que se llama "GregorianCalendar" que proporciona esta información. Esta clase está en el mismo paquete que "Scanner" por lo que también la tienes que importar. Colocas el "import" al principio del archivo, revisamos la clase "GregorianCalendar" en la documentación de Java 8, colocamos como un documento descargable. Se obtiene la fecha y hora al momento de construir un objeto de esta clase, el constructor que utilizaremos tiene el siguiente encabezado. Declaramos un objeto de esta clase al inicio de la implementación del método "daTransmisión". Al crearse un objeto usando este encabezado, se llenan los campos para fecha y hora en el momento en que se construye el objeto. Esta clase hereda de la clase "Calendar" muchas variables estáticas, que te van a indicar el campo donde se guarda el año, día, día de la semana, mes, hora, minutos, segundos, milisegundos. Tiene mucha información adicional que por el momento no vas a utilizar. Vas a escribir un método auxiliar tal que, dado un objeto de la clase "GregorianCalendar", te regrese la cadena que diga la hora del día en que ese objeto fue construido. Verás ahora cómo se forma el encabezado del método. Es un método auxiliar de clase, por lo que es público. El método regresa una cadena, se llama "daHora", recibe como entrada o parámetro un objeto de la clase "GregorianCalendar". Como no toca atributos de objeto, es un método de clase, por lo tanto "static". Damos el bloque para su implementación. Dentro de "daHora" usaremos este parámetro para obtener los datos, queremos saber la hora que tiene registrada el objeto "cal". En general, usaremos un método de "GregorianCalendar" para obtener la información, cuyo encabezado es, el parámetro campo elige, mediante constantes simbólicas de la clase "GregorianCalendar" al elemento que contiene la información solicitada por el parámetro. Entre las constantes simbólicas, todas ellas de acceso público, se encuentran "AM", "AM_PM", "DATE", "DAY_OF_MONTH", "DAY_OF_WEEK", "MINUTE", "MONTH", "PM", "YEAR". También tienes los nombres de los días y los meses, pero en inglés, por lo que no los vas a usar. Al usar el método "get" te va a regresar un entero en los rangos que indica cada constante simbólica que uses para ese campo. Las constantes simbólicas únicamente eligen el campo. El valor del campo es relativo al objeto de la clase "GregorianCalendar" que hayas construido. Ahora veremos la codificación del método "daHora". Para obtener la hora en este formato hacemos lo siguiente, utilizas la constante simbólica "HOUR" del calendario para obtener el contenido de ese campo en "cal", el objeto que construiste. Asignas ese valor a una variable local al método de tipo entero. Cuando usas alguna de estas variables de clase deberás recordar invocarlas desde la clase o desde algún objeto de la clase, más cómodo en este caso. De la misma manera que obtuviste la hora, obtienes los minutos. Para obtener si es "AM" o "PM", usamos nuevamente la expresión condicional y lo asignamos a una cadena. Obtenemos el valor "cal.get" y lo comparamos con el valor dado para "AM", si es verdadera, asignamos la cadena "AM", si es falso, asignamos la cadena "PM". Te acabas de dar cuenta que si se trata del medio día, la hora aparece como "cero horas PM", lo corriges con un enunciado condicional. Si la hora es cero y el tiempo del día "PM", lo cambias por un entero 12, si no, lo dejas igual. Te falta armar la cadena para regresarla, para que lo que sigue, que son enteros, se conviertan en cadenas. Empiezas la cadena a regresar con una cadena vacía, le concatenas el número que obtuviste para las horas, dos puntos y el número que obtuviste para los minutos, agregas un espacio. Por último, agregas la parte del día y regresas la cadena formada. Notas que si los minutos son menos de 10, la hora va a aparecer como "1:5 PM". Hay que agregar el cero en este caso para que diga "1:05 PM", lo haces con otra expresión condicional. El cálculo de "daFecha" es muy similar a "daHora", usando las constantes correspondientes. Vuelves a declarar un método estático de la clase a la que le pasas como parámetro un "GregorianCalendar". Es necesario revisar el código anterior, ya que tratar de indentar "daFecha" no permite moverlo. Eliminamos el paréntesis. Una vez encontrado el error, regresamos a "daFecha" y el problema queda resuelto. Cuando observamos lo que nos imprime "muestraDisco", vemos que nos faltaron dos cambios de línea, por lo que debemos regresar al código y corregirlo. Obtienes el día del mes, obtienes el mes recordando que el cero corresponde a enero, y obtienes el año. Quisieras, también, escribir el día de la semana que corresponde a esa fecha, para ello vas a programar un método estático cuyo encabezado va a ser "nombreDia". Usas ese método y la constante "DAY_OF_WEEK", ambos de la clase "GregorianCalendar", para obtenerlo. Regresamos la cadena con los datos de la fecha, separados por un espacio entre comillas seguido por el día, número de mes y año, separados entre ellos por diagonales. Para la codificación de nombre día necesitas tener los nombres de los días en una cadena, para no tenerla que crear cada vez que se llama al método, puedes declararla como constante simbólica de la clase. Para que puedas extraer fácilmente el nombre dado el número de día, necesitas que cada uno ocupe exactamente el mismo número de posiciones. Eliges nueve posiciones que son las que tiene miércoles, que es el nombre más grande y declaras una constante simbólica con este valor. Regresamos a codificar el método que regresa el nombre del día de la semana, cuyo encabezado es "daDia". Usas el método "substring" de la clase "string" para extraer el nombre del día que tienes. Hay que calcular en qué posición empieza la subcadena que corresponde a "numDia", hay que brincar "TAM_DIA" a lugares por cada día que haya transcurrido, la cadena "N_DIAS" tiene "TAM_DIA" espacios al principio, porque el número de día empieza en uno, no en cero, la posición en la que termina es "TAM_DIA" lugares a la derecha. Tomas esa subcadena de la cadena "N_DIAS" y le quitas los espacios del final, con el método "trim". Regresas la subcadena limpia. Ahora regresas a la codificación de "daTransmisión", con las funciones de clase "daFecha" y "daHora" es más sencilla esta codificación. Necesitas construir un objeto de la clase "GregorianCalendar", si no hay transmisiones disponibles no vas a usar este objeto. Es importante colocar aquí "miCal". A continuación, debes verificar si hay transmisiones disponibles en el disco con el que se va a invocar y asignamos esta evaluación a una variable "booleana". Si hay transmisiones disponibles, incrementamos activas en uno, usando la autoasignación con suma más igual, similar al autoresta, menos igual, que ya usamos. Usando una expresión condicional, regresamos la cadena dependiendo si hubo o no transmisiones disponibles. Puedes agregar un método "main" a esta clase para probar algunos de los métodos que has codificado. Por ejemplo, "daHora" o "daFecha". Como los métodos "daHora" y "daFecha" también son de la clase, entonces no necesitas construir objetos para llamarlos. Sin embargo, como reciben un objeto de la clase "GregorianCalendar" como argumento, debes construir uno. Ahora imprimes el resultado de llamar a "daHora" y, por último, imprimes el resultado de llamar a "daFecha". Ya utilizaste el método "main" para probar los métodos relacionados con "GregorianCalendar", agregas ahora algunas invocaciones más para ver cómo funcionan los métodos de la clase "Disco". Declaras y construyes un objeto de esta clase para poder probar métodos de objeto. Ahora prueba las dos maneras de ver el contenido del disco, con "muestraDisco" y con "twoString". Cuando observamos lo que nos imprime "muestraDisco", vemos que nos faltaron dos cambios de línea, por lo que debemos regresar al código y corregirlo. Agregamos los cambios de línea en los enunciados correspondientes, que es después del tipo de disco y del nombre del disco. Compilamos y ejecutamos, y vemos que ya escribe bien con los cambios de línea. Pides tres transmisiones seguidas y, como el máximo es dos, te debería dar las dos primeras, pero la tercera ya no. Puedes volver a ejecutar tu clase usuario, pero ahora vas a trabajar con la versión que codificaste de la clase Disco, verás que se comporta como esperabas. En el próximo módulo veremos repetición y selección en datos y ejecución. Espero verte en el siguiente módulo.