Как мне сказать, 5 секунд в Java? - PullRequest
56 голосов
/ 31 октября 2009

Я просматриваю документацию Дата и пытаюсь понять, как я могу выразить СЕЙЧАС + 5 секунд. Вот некоторый псевдокод:

import java.util.Date
public class Main {

    public static void main(String args[]) {
         Date now = new Date();
         now.setSeconds(now.getSeconds() + 5);
    }
}

Ответы [ 11 ]

76 голосов
/ 31 октября 2009

Дата почти полностью устарела и все еще существует по причинам обратной совместимости. Если вам нужно установить конкретные даты или сделать арифметику, используйте Календарь :

Calendar calendar = Calendar.getInstance(); // gets a calendar using the default time zone and locale.
calendar.add(Calendar.SECOND, 5);
System.out.println(calendar.getTime());
51 голосов
/ 31 октября 2009

Вы можете использовать:

now.setTime(now.getTime() + 5000);

Date.getTime() и setTime() всегда относятся к миллисекундам с 1 января 1970 года в 12:00 UTC.

Joda-Time

Однако я настоятельно рекомендую вам использовать Joda Time , если вы делаете что-то большее, чем простейшая обработка даты / времени. Это намного более способная и дружественная библиотека, чем встроенная поддержка в Java.

DateTime later = DateTime.now().plusSeconds( 5 );

java.time

Joda-Time позже вдохновил новый пакет java.time , встроенный в Java 8.

22 голосов
/ 31 октября 2009

Из однострочного хакерского депо .:1001*

new Date( System.currentTimeMillis() + 5000L)

Насколько я понимаю из вашего примера, «сейчас» - это действительно «сейчас», а «System.currentTimeMillis ()» представляет ту же концепцию «сейчас»: -)

Но, да, из-за всего более сложного, чем это, время Joda API крутится.

6 голосов
/ 01 ноября 2009

Как уже отмечали другие, в Йода это намного проще:

DateTime dt = new DateTime();
DateTime added = dt.plusSeconds(5);

Я бы настоятельно рекомендовал вам перейти на Joda. Практически любой связанный с датой Java вопрос о SO разрешается рекомендацией Joda :-) Предполагается, что Joda API является основой нового стандартного API даты Java (JSR310), поэтому вы будете переходить на новый стандарт. *

5 голосов
/ 30 января 2015

Игнорирование Dates и сосредоточение внимания на вопрос.

Я предпочитаю использовать java.util.concurrent.TimeUnit, поскольку это добавляет ясности моему коду.

В Java

long now = System.currentTimeMillis();

5 секунд от now с использованием TimeUtil:

long nowPlus5Seconds = now + TimeUnit.SECONDS.toMillis(5);

Ссылка: http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/TimeUnit.html

3 голосов
/ 01 февраля 2015

ОБНОВЛЕНИЕ: См. мой новый ответ с использованием java.time классов. Я оставляю этот Ответ нетронутым как история.

Ответ Паскаля Тивента и Ответ Джона Скита верны и хороши. Вот немного дополнительной информации.

Пять секунд = PT5S (ISO 8601)

Еще один способ выразить идею «пять секунд спустя» - использовать строку, используя стандартные форматы, определенные ISO 8601 . формат продолжительности / периода имеет этот шаблон PnYnMnDTnHnMnS, где P отмечает начало, а T отделяет часть даты от части времени.

Итак, пять секунд - это PT5S.

Joda-Time

Библиотека Joda-Time 2.8 может генерировать и анализировать такие строки длительности / периода. См. Классы Period, Duration и Interval. Вы можете добавлять и вычитать объекты Period в / из DateTime объектов.

Поиск StackOverflow для многих примеров и обсуждений. Вот один быстрый пример.

DateTimeZone zone = DateTimeZone.forID( "America/Montreal" );
DateTime now = DateTime.now( zone );
DateTime then = now.plusSeconds( 5 );
Interval interval = new Interval( now, then );
Period period = interval.toPeriod( );

DateTime thenAgain = now.plus( period );

Дамп на консоль.

System.out.println( "zone: " + zone );
System.out.println( "From now: " + now + " to then: " + then );
System.out.println( "interval: " + interval );
System.out.println( "period: " + period );
System.out.println( "thenAgain: " + thenAgain );

При запуске.

zone: America/Montreal
From now: 2015-06-15T19:38:21.242-04:00 to then: 2015-06-15T19:38:26.242-04:00
interval: 2015-06-15T19:38:21.242-04:00/2015-06-15T19:38:26.242-04:00
period: PT5S
thenAgain: 2015-06-15T19:38:26.242-04:00
2 голосов
/ 31 октября 2009

Я только что нашел это из java docs

import java.util.Calendar;

public class Main {

  public static void main(String[] args) {
    Calendar now = Calendar.getInstance();
    System.out.println("Current time : " + now.get(Calendar.HOUR_OF_DAY) + ":"
        + now.get(Calendar.MINUTE) + ":" + now.get(Calendar.SECOND));

    now.add(Calendar.SECOND, 100);
    System.out.println("New time after adding 100 seconds : " + now.get(Calendar.HOUR_OF_DAY) + ":"
        + now.get(Calendar.MINUTE) + ":" + now.get(Calendar.SECOND));
  }
}

Есть ли соглашение, о котором я должен знать?

1 голос
/ 11 июня 2019

ТЛ; др

Instant             // Use modern `java.time.Instant` class to represent a moment in UTC.
.now()              // Capture the current moment in UTC.
.plusSeconds( 5 )   // Add five seconds into the future. Returns another `Instant` object per the Immutable Objects pattern.

java.time

Используйте современные java.time классы, которые много лет назад вытеснили ужасные Date & Calendar классы.

UTC

Для работы в UTC используйте Instant.

Instant later = Instant.now().plusSeconds( 5 ) ;

Часовой пояс

Для работы в определенном часовом поясе используйте ZonedDateTime.

ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime later = ZonedDateTime.now( z ).pluSeconds( 5 ) ;

Duration

Вы можете софтово кодировать количество и детализацию времени, чтобы добавить. Используйте класс Duration.

Duration d = Duration.ofSeconds( 5 ) ;
Instant later = Instant.now().plus( d ) ;  // Soft-code the amount of time to add or subtract.
1 голос
/ 25 ноября 2016
        String serverTimeSync = serverTimeFile.toString();
        SimpleDateFormat serverTime = new SimpleDateFormat("yyyy,MM,dd,HH,mm,ss");
        Calendar c = Calendar.getInstance();
        c.setTime(serverTime.parse(serverTimeSync));
        c.add(Calendar.MILLISECOND, 15000);
        serverTimeSync = serverTime.format(c.getTime());
0 голосов
/ 11 июня 2019

Попробуйте это ..

    Date now = new Date();
    System.out.println(now);

    Calendar c = Calendar.getInstance();
    c.setTime(now);
    c.add(Calendar.SECOND, 5);
    now = c.getTime();

    System.out.println(now);

    // Output
    Tue Jun 11 16:46:43 BDT 2019
    Tue Jun 11 16:46:48 BDT 2019
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...