En busca de ayuda para crear citas 15 min, en la actualidad no modificable durante 1 hora

Kevin:

Primero tiempo de post - Soy más reciente de Java / JavaFX

Estoy tratando de conseguir mi código para guardar en 15 min gradualista. El proyecto cuenta con una lista observable que alberga seleccionables horas de las citas.

ApptAddController.java

private final ObservableList<String> times = FXCollections.observableArrayList("8:00 AM", "9:00 AM", "10:00 AM", "11:00 AM", "12:00 PM", "1:00 PM", "2:00 PM", "3:00 PM", "4:00 PM");

ApptDB.Java

Los "tiempos" seleccionado pasa al método "saveAppt"

public static boolean saveAppt(int id, String type, String contact, String location, String date, String time) {
        //Time stamp for booking times
        String tsStart = createTimeStamp(date, time, location, true);
        String tsEnd = createTimeStamp(date, time, location, false);
        try {
            //get date for Appointment createDate
            DateTimeFormatter dt = DateTimeFormatter.ofPattern("YYYY-MM-dd HH:mm:ss");
            String nowString = LocalDateTime.now(Clock.systemUTC()).format(dt);
            Statement statement = DBConnection.getConnection().createStatement();
            //Query
            String queryInsertOne = "INSERT INTO appointment(customerId, type, contact, location, start, end,  createDate, lastUpdateBy, createdBy) values ('" + id + "', '" + type + "', '" + contact + "', '" + location + "','" + tsStart + "','" + tsEnd + "','" + nowString + "','" + UserDB.getCurrentUser() + "','" + UserDB.getCurrentUser() + "')";
            int updateOne = statement.executeUpdate(queryInsertOne);         
            return true;
       } catch (SQLException e) {
            System.out.println("SQLException: " + e.getMessage());
        }
        return false;
    }

El método createTimeStamp está codificado en el siguiente método con el "00":

public static String createTimeStamp(String date, String time, String location, boolean startMode) {
        String t = time.split(":")[0];
        int baseH = Integer.parseInt(t);
        if(baseH < 8) {
            baseH += 12;
        }
        if(!startMode) {
            baseH += 1;
        }
        String baseD = String.format("%s %02d:%s", date, baseH, "00");
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd kk:mm");
        LocalDateTime ldt = LocalDateTime.parse(baseD, dtf);
        ZoneId zid;
        zid = TimeZone.getDefault().toZoneId();
           ZonedDateTime zdt = ldt.atZone(zid);
        ZonedDateTime utcDate = zdt.withZoneSameInstant(ZoneId.of("UTC"));
        ldt = utcDate.toLocalDateTime();
        Timestamp ts = Timestamp.valueOf(ldt); 
        return ts.toString();
    }

Id gustaría tener las citas de 15 incrementales min. El usuario seleccionará veces al azar (08:00, 08:15, 08:30, 08:45). ¿Cómo puedo obtener el código para detectar lo que el usuario selecciona y pone int en la base de datos en consecuencia. Si cambio de "00" a "15" Va a codificar cada cita para 15 después.

Gracias por tu tiempo.

Albahaca Bourque:

No soy capaz de seguir así su código. Así que aquí hay algunos consejos generales. Debería decir por adelantado, gestión de citas y horarios es un dominio del problema sorprendentemente complicado.

Usted parece estar centrado en las cadenas en lugar de tipos de datos adecuados, un problema común con los nuevos programadores. Aprender a utilizar objetos inteligentes, no cadenas tontas . Tenga en cuenta que ninguno de los código que se muestra a continuación consiste en cadenas, a excepción de la presentación a los usuarios. Los valores se intercambian con la base de datos como objetos, sin el uso de cadenas.

Java ofrece una variedad líder en la industria de las clases de fecha y hora, en los java.time paquetes. Así que los utilizan. LocalTimerepresenta un momento del día. LocalDaterepresenta una fecha solamente, sin la hora del día, y sin zona horaria.

Para la entrada de datos en el momento de su nombramiento, que debería estar recogiendo una hora y minuto. Trabajar internamente con el reloj de 24 horas LocalTimeobjetos.

List< LocalTime > hourTimes = 
    List.of( 
        LocalTime.of( 8 , 0 ) ,
        LocalTime.of( 9 , 0 ) ,
        LocalTime.of( 10 , 0 ) ,
        LocalTime.of( 11 , 0 ) ,
        LocalTime.of( 12 , 0 ) ,
        LocalTime.of( 13 , 0 ) ,
        LocalTime.of( 14 , 0 ) ,
        LocalTime.of( 15 , 0 ) ,
        LocalTime.of( 16 , 0 ) 
    )
;

Si su público espera un reloj de 12 horas , presentarán su pantalla con un formateador personalizado. Si su público espera un reloj de 12 horas, presentarán su pantalla con un formateador personalizado.

Locale locale = Locale.US ;
DateTimeFormatter formatterHourOfDay = DateTimeFormatter.ofPattern ( "h a" ).withLocale ( locale ) ;
String output = hourTimes.get( 7 ).format( formatterHourOfDay ) ;

Ver similares código ejecutar en vivo en IdeOne.com .

15:00

Tenga en cuenta que java.time utiliza objetos inmutables . Así que usted puede usar libremente el LocalTimeobjeto directamente desde la lista maestra sin necesidad de copiar, no hay necesidad de preocuparse por sus valores está cambiando de debajo de sus pies. Esto también significa que puede utilizar java.time objetos a través de los hilos, ya que están diseñados para ser seguro para subprocesos .

Mantenga una lista de los posibles minutos.

List< Integer > minutes = List.of( 0 , 15 , 30 , 45 ) ;

En que la interfaz de usuario, que el uso recoger uno de esos cuatro valores, que se apareó con su elección desde hourTimesarriba.

Ponga estos valores juntos para su hora del día para hacer una nueva LocalTime.

LocalTime localTime = hourTimes.get( 7 ).plusMinutes( minutes.get( 2 ) ) ;  // Adding 0, 15, 30, or 45 minutes to the on-the-hour `LocalTime` object, resulting in another `LocalTime` object. 

Combinar la hora del día con su fecha de la intención de obtener un LocalDateTimeobjeto.

LocalDate localDate = LocalDate.of( 2020 , Month.JANUARY , 23 ) ;
LocalDateTime localDateTime = LocalDateTime.of( localDate , localTime ) ;

Almacenar que, en una columna de la base de datos de tipo SQL estándar TIMESTAMP WITHOUT TIME ZONE. (que era "SIN", no "CON")

General es mejor usar comandos preparados en SQL en lugar de la combinación de cadena.

myPreparedStatement.setObject( … , localDateTime ) ;

Además, registrar la zona horaria destinada a tal cita. Hay un tipo de datos en Java para esto, ZoneId. Pero no en SQL. Así registrar el nombre de zona como texto en su base de datos.

ZoneId z = ZoneId.of( "America/Montreal" ) ;
…
myPreparedStatement.setObject( … , z.toString() ) ;  // Record name of zone as text.

Por cierto, no hay necesidad de pasar cuando se creó el registro o la última actualización. Usted debe configurar su base de datos para establecer dichos valores de forma automática en el lado del servidor.

Separar la lógica de negocio de su interfaz de usuario. Tenga en cuenta que ninguno de mi código anterior se refiere a JavaFX .

Definir una clase sólo para la cita. Esta clase debe conocer sólo las necesidades de una cita, las reglas de negocio para lo que define a una cita válida. Esta clase debe saber nada acerca de la base de datos, ni la interfaz de usuario.

No entiendo lo que está tratando de hacer con las zonas horarias en el uso de ZonedDateTime. Parece que están tratando de formar un java.sql.Timestampobjeto. Ese es el camino equivocado por dos razones. En primer lugar, que la clase es una de las clases de fecha y hora terrible legado suplantado por java.time ; nunca lo utilice. En segundo lugar, que es el camino equivocado para reservar citas. Citas futuros deben ser registrados como dos partes separadas, (a) Fecha-con-tiempo-de-día y (b) la zona horaria.

Los políticos de todo el mundo han mostrado una inclinación por la frecuencia Cambiar el avance de las zonas horarias de su jurisdicción. Lo hacen con poca, o ninguna, previo aviso. Así que si ha reservado 15:45 para el próximo enero como un momento, como un punto específico en la línea de tiempo, la hora del día para el tiempo del reloj de pared de esa zona podría ser cambiado para entonces, con 15:45 convirtiéndose 3: 15 pm o 16:45. Imagínese si su software reservado una cita para el momento específico que era 15:45 antes de cambiar la zona de su desplazamiento-de-UTC. Los clientes que guardan sus citas irán apareciendo a las 3 pm de la hora del reloj de pared actual, mientras que el software de libro de cita les mostrará lo más temprano (o tarde). Para evitar este problema, no programe citas como un momento, Mantener la fecha-con-tiempo-de-día ( LocalDateTime) separada de la zona horaria ( ZoneId).

Combinar los dos (fecha-con-tiempo del día y zona horaria) sólo cuando la construcción de un calendario donde se necesita momentos específicos.

ZoneId z = ZoneId.of( zoneNameFromDatabase ) ;
ZonedDateTime zdt = localDateTimeFromDatabase.atZone( z ) ;

Si necesita ver ese momento en UTC, ajuste mediante la extracción de un Instantobjeto.

Instant instant = zdt.toInstant() ;

Pero no almacene o bien el ZonedDateTimeo Instantpara el futuro. Almacenarlos sólo después del hecho, cuando la grabación de la historia. Y aun así, grabar OffsetDateTime, ya que curiosamente la especificación JDBC no necesita soporte para ZonedDateTimeo Instant. Se podría almacenar ese OffsetDateTimeobjeto en una columna de SQL estándar Tipo TIMESTAMP WITH TIME ZONE( "CON" y no "SIN" como se ve arriba).

OffsetDateTime odt = zdt.toOffsetDateTime() ;
myPreparedStatement.setObject( … , odt ) ;  // Record history as a moment, a specific point on the timeline.

Tabla de tipos de fecha y hora en Java (tanto legado y moderna) y en SQL estándar.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=230281&siteId=1
Recomendado
Clasificación