Как прочитать время из MySQL назначения базы данных как UT C, преобразовать в локальное системное время и отобразить его в столбце TableView в JavaFX? - PullRequest
0 голосов
/ 07 февраля 2020

У меня есть 2 столбца базы данных в базе данных MySQL, показывающие время начала и окончания встреч. он хранится как «2019-01-01 00:00:00». Как взять это время (при условии, что оно в UT C) и преобразовать его в локальное системное время (например, P C, установленное в EST), а затем отобразить его внутри начального и конечного столбцов TableView?

Я настраиваю столбцы табличного представления следующим образом:

        appTableViewStartColumn.setCellValueFactory(new PropertyValueFactory<Appointment, Calendar>("start"));
        appTableViewEndColumn.setCellValueFactory(new PropertyValueFactory<Appointment, Calendar>("end"));

И это мой код для метода getAllAppointments:

    public static ObservableList<Appointment> getAllAppointments() throws SQLException, Exception {
        DatabaseConnection.makeConnection();
        String sqlStatement = "SELECT appointmentId, customerId, type, start, end, customerName FROM appointment LEFT JOIN customer " +
                "USING (customerId)";
        Query.makeQuery(sqlStatement);
        ResultSet result = Query.getResult();

        while (result.next()) {
            int appointmentId = result.getInt("appointmentId");
            int customerIdIn = result.getInt("customerId");
            String type = result.getString("type");
            String customerName = result.getString("customerName");

            // Following gets date as string, then converts it to Calendar
            String startString = result.getString("start");
            String endString = result.getString("end");
            Calendar start = stringToCalendar(startString);
            Calendar end = stringToCalendar(endString);

            Appointment appointmentResult = new Appointment (appointmentId, customerIdIn, type, start, end, customerName);
            allAppointments.add(appointmentResult);
        }

Это метод, который я использовал для преобразования строки в календарь объект:

    public static Calendar stringToCalendar (String stringDate) throws ParseException {

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        Date date = sdf.parse(stringDate);
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        return calendar;
    }

Ответы [ 2 ]

1 голос
/ 07 февраля 2020

Я предполагаю, что вы используете тип столбца DATETIME в БД.

Я рекомендую сделать себе одолжение и использовать API java.time вместо использования Calendar.

Вы можете получить время напрямую через ResultSet и применить соответствующие преобразования либо к LocalDateTime, либо к ZonedDateTime. Преимущество первого заключается в наличии реализации StringConverter в API JavaFX, но для настройки отображения оба варианта работают.

Извлечение данных

final ZoneId est = ZoneId.of("America/New_York"); // ZoneId.systemDefault();
while (result.next()){
    ...
    Timestamp time = result.getTimestamp("start"); // utc is offset 0; no offset required
    ZonedDateTime zTime = time.toInstant().atZone(est);
    LocalDateTime start = zTime.toLocalDateTime();
    ...
}

Настройка колонки

TableColumn<Appointment, LocalDateTime> appTableViewStartColumn = ...

...

final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
appTableViewStartColumn.setCellFactory(col -> new TableCell<Appointment, LocalDateTime>() {
    @Override
    protected void updateItem(LocalDateTime item, boolean empty) {
        super.updateItem(item, empty);
        setText(item == null ? "" : formatter.format(item));
    }
});
0 голосов
/ 07 февраля 2020

Прежде всего часть кода отсутствует в вопросе (stringToCalendar())

Но при условии, что вы пытаетесь проанализировать строковую дату в формате UTC / GMT, а затем использовать функцию календаря в другом часовой пояс, должно работать следующее:

// Parse date - use your format
SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy");
Date date = sdf.parse(strDate);
//instantiates a calendar using the current time in the specified timezone
Calendar cal= Calendar.getInstance(TimeZone.getTimeZone("GMT"));
cal.setTime(date);
//change the timezone
cal.setTimeZone(TimeZone.getDefault());
// or cal.setTimeZone(TimeZone.getTimeZone("Asia/Calcutta"));
//get the current hour of the day in the new timezone
cal.get(Calendar.HOUR_OF_DAY);
//...

Часть кода взята из: Как изменить TIMEZONE для java .util.Calendar / Date

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...