Добавьте несколько часов / минут к текущей дате и получите будущее время - PullRequest
0 голосов
/ 30 апреля 2019

Мне нужно получить значение будущей метки для определенного времени.Мне нужно будет добавить строковое значение к текущей метке времени и получить значение будущей метки времени.

Я получаю текущую метку времени, как показано ниже:

Timestamp timestamp = new Timestamp(System.currentTimeMillis());

У меня есть строковое значение как "02:00:00", поэтому в основном мне нужно добавить 2 часа к этому времени и получить значение будущей метки времени, которое необходимо вставить.

Например, если текущая метка времени: 2019-04-29 16:59:21.43 и строка "02:00:00".
Мне нужен вывод как 2019-04-29 18:59:21.43.

Может кто-нибудь помочь, пожалуйста

Ответы [ 4 ]

1 голос
/ 30 апреля 2019

ТЛ; др

Вставьте момент через два часа.

myPreparedStatement                     // Use a `PreparedStatement` to exchange data with your database, to avoid SQL-injection risk. Use JDBC 4.2 or later for *java.time* support.
.setObject(                             // Fill a placeholder `?` in your SQL statement.
    … ,                                 // Specify which placeholder. 
    OffsetDateTime                      // Use `OffsetDateTime` to specify a moment in JDBC 4.2. Optionally, your JDBC might support `Instant` or `ZonedDateTime` types, while support for `OffsetDateTime` is required.
    .now(                               // Capture the current moment.
        ZoneOffset.UTC                  // Set the offset-from-UTC to zero. We do not need to account for any time zone in this particular business scenario.
    )                                   // Returns an `OffsetDateTime` object.
    .plus(                              // Adds a span-of-time to the moment held in the `OffsetDateTime` object.
        Duration.parse( "PT2H" )        // Specify the span-of-time using standard ISO 8601 format for a duration.
    )                                   // Per Immutable Objects pattern, returns a new `OffsetDateTime` rather than changing ("mutating") the original.
)                          

Подробнее

У меня есть строковое значение как «02:00:00», поэтому в основном мне нужно добавить 2 часа к этому времени и получить значение будущей метки времени, которое необходимо вставить

Это плохой способ сообщить промежуток времени, не привязанный к временной шкале.

Стандартный способ - это PnYnMnDTnHnMnS, где P отмечает начало, а T отделяет годы-месяцы-дни от часов-минут-секунд. Так что 2 часа - это PT2H.

Чтобы разобрать такую ​​строку, используйте класс Duration для часов-минут-секунд (или Period для лет-месяцев-дней).

String input = "PT2H" ;
Duration d = Duration.parse( input ) ;

Вы можете сгенерировать такую ​​строку.

String output = Duration.ofHours( 2 ).toString() ;  // Yields "PT2H" string.

Захватить текущий момент в UTC .

OffsetDateTime odt = OffsetDateTime.now( ZoneOffset.UTC ) ;

Добавьте продолжительность в два часа, используя стандартные обозначения ISO 8601 .

Duration d = Duration.parse( "PT2H" ) ;
ZonedDateTime odtLater = odt.plus( d ) ;  // Add 2 hours to the current moment.

Отправьте это в свою базу данных, используя JDBC 4.2 или более позднюю версию.

myPreparedStatement.setObject( … , odtLater ) ;

индексирование.

OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;

О java.time

Фреймворк java.time встроен в Java 8 и более поздние версии. Эти классы вытесняют старые классные устаревшие классы даты и времени, такие как java.util.Date, Calendar и & SimpleDateFormat.

Чтобы узнать больше, см. Oracle Tutorial . И поиск переполнения стека для многих примеров и объяснений. Спецификация JSR 310 .

Проект Joda-Time , теперь в режиме обслуживания , рекомендует перейти на классы java.time .

Вы можете обмениваться java.time объектами напрямую с вашей базой данных. Используйте драйвер JDBC , совместимый с JDBC 4.2 или более поздней версии. Нет необходимости в строках, нет необходимости в java.sql.* классах.

Где получить классы java.time?

Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java.time. Здесь вы можете найти несколько полезных классов, таких как Interval, YearWeek, YearQuarter и more .

1 голос
/ 30 апреля 2019

Вы можете сделать что-то вроде этого

    Instant now = Instant.now();
    Duration diff = Duration.between(
            LocalTime.MIN,
            LocalTime.parse("02:00:00")
    );
    Instant res = now.plus(diff);

    System.out.println("res = " + Timestamp.from(res));
1 голос
/ 30 апреля 2019

Вы можете использовать функцию MySQL TIMESTAMP, чтобы добавить заданную строку времени к значению вашей отметки времени:

TIMESTAMP(expr), TIMESTAMP(expr1,expr2)

С одним аргументом эта функция возвращает дату или дату и время выражение expr в качестве значения даты и времени. С двумя аргументами он добавляет выражение времени expr2 к выражению даты или даты и времени expr1 и возвращает результат в виде значения даты и времени.

mysql> SELECT TIMESTAMP('2003-12-31 12:00:00','12:00:00');
-> '2004-01-01 00:00:00'

Ссылка

0 голосов
/ 30 апреля 2019

Мне нравится рассматривать мои метки времени как неподписанные целые. Их довольно сложно модифицировать: в вашем случае попробуйте получить представление uint и просто добавьте 2 * 3600 * 1000 к отметке времени, а затем отформатируйте ее так, как вам нужно.

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