Java миллис времени с часовым разрешением - PullRequest
0 голосов
/ 09 октября 2019

Как получить миллисекунды по времени Java в UTC, игнорируя минуты и секунды.

Например: если это 10 октября 2019 года, 1:10:59 утра, он должен получить Time или миллисза 10 октября 2019 года, 01:00.

Ответы [ 4 ]

4 голосов
/ 09 октября 2019

java.time, современный API даты и времени Java имеет именно тот метод, который вам нужен: во многих классах есть метод truncatedTo для нужд, подобных вашей.

    Instant now = Instant.now();
    System.out.println("Rough milliseconds:                        " + now.toEpochMilli());
    Instant currentWholeHour = now.truncatedTo(ChronoUnit.HOURS);
    System.out.println("Milliseconds ignoring minutes and seconds: "
            + currentWholeHour.toEpochMilli());

При запуске этого фрагментатолько сейчас вывод был:

Rough milliseconds:                        1570604053787
Milliseconds ignoring minutes and seconds: 1570600800000

Я очень хорошо знаю, что первая строка - это то, что вы просили , а не . Я включил его только для того, чтобы вы увидели разницу.

Усечение происходит в UTC. Если вы находитесь в часовом поясе, смещение которого не равно целому числу часов от UTC, результаты могут отличаться от ожидаемых. Примерами таких часовых поясов являются Азия / Катманду, Америка / St_Johns, а также Австралия / Lord_Howe.

Ссылка: Учебное пособие по Oracle: Дата и время

2 голосов
/ 09 октября 2019

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

LocalDate.now().atTime(LocalDateTime.now().getHour(), 0, 0);

Это даст вам текущую дату с часами, минутами и секундами, установленными в 0.

И для получения миллисекунд в UTC:

LocalDate.now().atTime(LocalDateTime.now().getHour(), 0, 0).toInstant(ZoneOffset.UTC).toEpochMilli();

Джон Скит замечает, что вызов now может дать неожиданные результаты в угловых случаях. Конечно, мы можем вызвать его один раз, а затем преобразовать в LocalDate с указанным решением:

var currentTime = LocalDateTime.now();
var currentDate = currentTime.toLocalDate();

Или наоборот - сначала набрать LocalDate и использовать LocalDate#atStartOfDay.

1 голос
/ 09 октября 2019

Учитывая, что вас интересуют миллисекунды UTC, а количество миллисекунд в час - целое, вы можете сделать это с помощью простой арифметики. Для большинства календарных вычислений я действительно не рекомендовал бы это, но в этом случае я думаю, что это самый простой подход. Примерно так:

private static final long MILLISECONDS_PER_HOUR = TimeUnit.HOURS.toMillis(1);

// Injecting a clock makes the method testable. You can use Clock.systemUTC()
// for the system clock.
public static long truncateMillisToHour(Clock clock) {
    long millisSinceEpoch = clock.millis();
    // Truncate to the nearest hour
    long hoursSinceEpoch = millisSinceEpoch / MILLISECONDS_PER_HOUR;
    // Then multiply up again
    return hoursSinceEpoch * MILLISECONDS_PER_HOUR;
}  

Обратите внимание, что если часы предназначены для до эпохи, это округлит до до ближайшего часа, но если выесли взять истинное «текущее время», то это вряд ли будет проблемой.

(я написал этот ответ, прежде чем увидел ответ Оле ВВ с truncatedTo, что является очень хорошим подходом.)

0 голосов
/ 09 октября 2019

Это метод, который игнорирует время и мятную секунду и возвращает время utc

private static SimpleDateFormat dateToString = new SimpleDateFormat("yyyy-MM-dd");

public static String dateToString(Date date) {

dateToString.setTimeZone(TimeZone.getTimeZone("UTC "));

String strDate = "";
  strDate =  dateToString.format(date);

  return strDate;
}
...