Анализ ввода даты HTML в метку времени в сервлете Java

Недавно у меня возникла проблема с отметкой времени и типом ввода HTML Дата:

Это мой HTML/JSP:

<div class="form-group">
   <label>Your day of birth</label>
   <input class="form-control form-control-lg" type="date" name="txtBirthdate" required="">
</div>

Это мой Java-сервлет:

String birth = request.getParameter(Constants.BIRTHDATE_TXT);
System.out.println(birth);
Timestamp bDate = new Timestamp(((new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(birth)).getTime()));
System.out.println(bDate);
Timestamp joinDate = new Timestamp(Calendar.getInstance().getTime().getTime());

Я не могу разобрать рождение строки в метку времени, есть ли способы ее преобразовать? И также я прав, когда вы очищаете строку yyyy-MM-dd с помощью SimpleDateFormat, она устанавливает часть HH:mm:ss со значением по умолчанию 00:00:0000?

спасибо за помощь


person Jason    schedule 28.12.2020    source источник
comment
Я рекомендую вам не использовать Timestamp, SimpleDateFormat или Calendar. Все эти классы плохо спроектированы и давно устарели, SimpleDateFormat в частности, печально известные проблемы. Вместо этого используйте, например, LocalDateTime и DateTimeFormatter, оба из java.time, современного API даты и времени Java. .   -  person Ole V.V.    schedule 28.12.2020
comment
Нам не хватает некоторой информации: какой пример строки вы пытаетесь разобрать? Какое сообщение об ошибке вы получаете? Или какой неверный результат? А для чего ты думал, что тебе нужен Timestamp?   -  person Ole V.V.    schedule 28.12.2020
comment
Вы серьезно относились к тегу jodatime? Вы хотели использовать Joda-Time?   -  person Ole V.V.    schedule 28.12.2020
comment
@ОлеВ.В. Спасибо за ваше предложение. Моя проблема в том, что я действительно не знаю, как разобрать дату, например: 2020-12-28, в метку времени. Я попытаюсь использовать для этого LocalDateTime.   -  person Jason    schedule 28.12.2020
comment
Используйте LocalDate, LocalDate.parse("2020-12-28") работает без форматтера. И, как я уже сказал, вы, скорее всего, не хотите и не нуждаетесь в Timestamp. Что именно вам нужно вместо этого, я не знаю, так как это зависит от обстоятельств, о которых вы нам еще не сказали.   -  person Ole V.V.    schedule 28.12.2020


Ответы (1)


API даты и времени java.util и их API форматирования SimpleDateFormat устарели и подвержены ошибкам. Обратите внимание, что java.sql.Timestamp унаследовал те же недостатки, что и расширение java.util.Date. Рекомендуется полностью прекратить их использование и перейти на современный API даты и времени. По какой-либо причине, если вам нужно придерживаться Java 6 или Java 7, вы можете использовать ThreeTen-Backport, который переносит большую часть функций java.time на Java 6 и 7. Если вы работаете над проектом Android и вашим уровнем Android API по-прежнему не совместим с Java-8, проверьте Java 8+ API, доступные через дешугаринг и Как использовать ThreeTenABP в проекте Android.

Вы упомянули,

Моя проблема в том, что я действительно не знаю, как разобрать дату, например: 2020-12-28, в метку времени.

Вы также упомянули,

И также я прав, когда вы очищаете строку yyyy-MM-dd с помощью SimpleDateFormat, она устанавливает часть HH:mm:ss со значением по умолчанию 00:00:0000?

Из этих двух требований я делаю вывод, что вам нужна дата, например. 2020-12-28 в сочетании со временем, например. 00:00:00 это не что иное, как начало дня. java.time предоставляет чистый API, LocalDate#atStartOfDay для достижения этой цели.

Демонстрация:

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

public class Main {
    public static void main(String[] args) {
        String strDate = "2020-12-28";

        // Parse the given date string into LocalDate. Note that you do not need a
        // DateTimeFormatter to parse it as it is already in ISO 8601 format
        LocalDate date = LocalDate.parse(strDate);

        // Note: In the following line, replace ZoneId.systemDefault() with the required
        // Zone ID which specified in the format, Continent/City e.g.
        // ZoneId.of("Europe/London")
        ZonedDateTime zdt = date.atStartOfDay(ZoneId.systemDefault());

        // Print the default format i.e. the value of zdt#toString. Note that the
        // default format omits seconds and next smaller units if seconds part is zero
        System.out.println(zdt);

        // Get and print just the date-time without timezone information
        LocalDateTime ldt = zdt.toLocalDateTime();
        System.out.println(ldt);

        // Get and print zdt in a custom format
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSS", Locale.ENGLISH);
        String formatted = zdt.format(dtf);
        System.out.println(formatted);
    }
}

Вывод:

2020-12-28T00:00Z[Europe/London]
2020-12-28T00:00
2020-12-28T00:00:00.000

Узнайте о современном API даты и времени из Trail: Date Time.

person Arvind Kumar Avinash    schedule 28.12.2020