#java #date #calendar #simpledateformat #date-format
#java #Дата #Календарь #simpledateformat #дата-формат
Вопрос:
Я пытаюсь создать кнопку отправки, которая сохраняет пользовательский ввод при нажатии, и у меня возникла проблема с частью условия if. Я хочу, чтобы это произошло, когда пользователь нажал кнопку после 10:00 часов (в зависимости от системного времени), отчет по базе данных был бы «поздним», иначе отчет был бы «Не поздним». Но каждый раз, когда я нажимал на кнопку, даже если системное время до 10:00, оно всегда говорит «Поздно». Как это исправить?
Код:
try {
String sql = "INSERT INTO studentregisterlogin" "(SSN, TimeIn, TimeOut, Report)" "VALUES (?,?,?,?)";
con = DriverManager.getConnection("jdbc:mysql://localhost/studentlogin", "root", "");
pst = con.prepareStatement(sql);
pst.setString(1, tfSerialNumber.getText());
pst.setTimestamp(2, new Timestamp(System.currentTimeMillis()));
pst.setString(3, " ");
// My Problem is this Condition
SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm");
Date date = new Date(System.currentTimeMillis());
try {
if (date.after(dateFormat.parse("10:00"))) {
pst.setString(4, "Late");
} else if (date.before(dateFormat.parse("10:00"))){
pst.setString(4, "NotLate");
}
} catch (ParseException ex) {
Logger.getLogger(Menu.class.getName()).log(Level.SEVERE, null, ex);
}
pst.executeUpdate();
//updateTable();
} catch (SQLException | HeadlessException ex) {
JOptionPane.showMessageDialog(null, ex);
}
Комментарии:
1. Я рекомендую вам не использовать
Timestamp
,SimpleDateFormat
иDate
. Эти классы плохо спроектированы и давно устарели,SimpleDateFormat
в частности, заведомо неприятны. Вместо этого используйтеLocalTime
and / или другие классы из java.time, современного Java date и time API .
Ответ №1:
У вас есть строка DateFormat.parse(«10:00»).
Это фактически анализирует дату как 1 января 1970 года. Итак, если вы сравните его с текущим временем, оно всегда будет после. Именно по этой причине ваше условие if всегда истинно.
Вместо этого вы можете получить текущее время, используя приведенный ниже код.
Calendar rightNow = Calendar.getInstance();
int hour = rightNow.get(Calendar.HOUR_OF_DAY); //hour is in 24 hour format.
Вы можете использовать это значение, чтобы сравнить его с вашим 10:00 (10, если AM. 22, если PM) часовым пределом. Перед сравнением убедитесь, что вы конвертируете в 24-часовой формат.
Итак, это было бы что-то вроде
if(hour > 22){
// Too late
}else{
// Not late
}
Комментарии:
1. Спасибо, что оно работает сейчас, но как добавить минуты в условие. Например, я меняю позднее время на 10:35?
2. Вы могли бы использовать тот же метод. Используйте календарь. МИНУТА и получите текущую минуту.
3. Хорошо, еще раз спасибо за вашу помощь!
4. @Octavio — Вы можете избавиться от всех подобных подверженных ошибкам сложностей и накладных расходов, используя современный API даты и времени (
java.time
API), предложенный Ole V.V. Я настоятельно рекомендую вам последовать его совету.5. Хорошо, я попробую. Спасибо!
Ответ №2:
java.time
Я рекомендую вам использовать java.time, современный Java date и time API, для работы с датой и временем.
Если вы уверены, что дата одинакова, и вам нужно только сравнить время суток, вам нужно следующее. Давайте сначала объявим константу, чтобы удерживать ваш порог 10 утра:
private static final LocalTime DUE_TIME = LocalTime.of(10, 0);
Теперь сравнение продолжается:
LocalTime now = LocalTime.now(ZoneId.systemDefault());
if (now.isAfter(DUE_TIME)) {
System.out.println("Late");
} else {
System.out.println("On time");
}
При запуске только сейчас (12:42 в моем часовом поясе) я получил этот вывод:
Поздно
LocalTime
это время суток без даты (и без часового пояса или смещения UTC). Это происходит с 00:00 до 23:59:59.999999999. Таким образом, каждый раз с 00:00 до 10:00 будет считаться своевременным, а все остальное время суток — поздним.
Ссылки
- Учебное пособие по Oracle: дата и время, объясняющее, как использовать java.time.
Комментарии:
1. Я тоже попробую это. Спасибо!