Я не могу реализовать преобразователь часового пояса в своем классе как функцию, даже если он работает в моем основном классе - PullRequest
0 голосов
/ 03 февраля 2020

У меня есть таблица базы данных MySQL, в которой есть список рейсов, который содержит, помимо прочего, дату и время посадки ( отметка времени ) в стране источника, и я хочу добавить дату и время посадки (также timestamp ) к нему.

У меня есть другая таблица, в которой содержится список аэропортов, включая их название, страну и часовой пояс.

Я создал функцию, которая получает часовой пояс в зависимости от названия аэропорта называется getAirportTimeZone . Теперь, посмотрев на stackoverflow, я обнаружил этот вопрос , который позволяет мне конвертировать из одного часового пояса в другой, поэтому, когда я попробовал его в основном классе, он работал нормально, но когда я пытаюсь реализовать его в методе в моем класс соединения, где я мог бы позже использовать этот метод, когда я пытаюсь создать новый полет, я получаю ошибку Eclipse: Этот метод должен возвращать результат типа Timestamp .

Вот как я это попробовал в моем основном классе:

String s = class1.getAirportTimeZone("Gabes Airport");
System.out.println(s);
DateFormat df1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.ROOT);
df1.setTimeZone(TimeZone.getTimeZone(s));
DateFormat df2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.ROOT);
df2.setTimeZone(TimeZone.getTimeZone(class1.getAirportTimeZone("Arcata Airport")));
try {
    System.out.println(df1.format(df2.parse("2020-02-03 19:30:00")));
} catch (ParseException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

А вот как функция в другом классе:

public String getAirportTimeZone(String airport) {
    connect();
    String sql="SELECT tz FROM airports WHERE name=?";
    PreparedStatement statement;
    String tz="";
    try {
        statement = connection.prepareStatement(sql);
        statement.setString(1, airport);
        ResultSet rs = statement.executeQuery();
        while(rs.next()) {
            tz = rs.getString("tz");
        }
    } catch (SQLException e) {
        e.printStackTrace();
    }
    return tz;
}

public Timestamp conv(String airportName1, String airportName2, Timestamp ts1) {
DateFormat dfAirport1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.ROOT);
dfAirport1.setTimeZone(TimeZone.getTimeZone(getAirportTimeZone(airportName1)));
DateFormat dfAirport2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.ROOT);
dfAirport2.setTimeZone(TimeZone.getTimeZone(getAirportTimeZone(airportName2)));
try {
    return Timestamp.valueOf(dfAirport2.format(dfAirport1.parse(ts1.toString())));
} catch (ParseException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
}

1 Ответ

0 голосов
/ 03 февраля 2020

Как заметил @Compass, ключом к этой проблеме является ожидаемое поведение при выдаче ParseException. В случае «счастливого пути», когда нет проблем с анализом формата даты, ваша функция возвращает значение, и это здорово. Но когда выдается ParseException, выводится отпечаток стека и ... что тогда? Eclipse сообщает вам, что вам нужно указать возвращаемое значение для случая, когда выполняется блок catch. Например:

public String conv(...) {
    try {
        return Timestamp.valueOf(dfAirport2.format(dfAirport1.parse(ts1.toString())));
    } catch (ParseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    // This line will be executed if a ParseException is thrown within the try block above. We're returning a default timestamp string here because I don't know what your expected behavior is when the given format is invalid.
    return "00:00:00";
}
...