Сортировать метку времени на полчаса - PullRequest
0 голосов
/ 28 апреля 2018

Итак, у меня есть куча временных меток, которые я хочу отсортировать по получасовым блокам, чтобы я мог отобразить их в таблице, которая показывает все объекты в соответствующем 30-минутном окне.

Я думал о том, чтобы пройтись по ним и преобразовать каждый в строку, а затем сравнить 2-часовой и 2-минутный разряды с оператором switch, но это кажется очень утомительным / неэффективным и уязвимым для ошибок.

Есть идеи, как мне действовать более эффективно?

Ответы [ 2 ]

0 голосов
/ 28 апреля 2018

орфография предложение пользователя 2023577 out:

    Instant[] instants = {
            Instant.parse("2018-04-28T06:17:00Z"),
            Instant.parse("2018-04-28T07:56:00Z"),
            Instant.parse("2018-04-28T07:33:00Z"),
            Instant.parse("2018-04-28T07:13:00Z"),
            Instant.parse("2018-04-28T06:25:00Z"),
            Instant.parse("2018-04-28T06:13:00Z")
    };

    final long blockSizeSeconds = TimeUnit.MINUTES.toSeconds(30);
    Map<Long, List<Instant>> grouped = Arrays.stream(instants)
            .collect(Collectors.groupingBy(i -> i.getEpochSecond() / blockSizeSeconds));
    grouped.values().forEach(System.out::println);

Это печатает три группы:

[2018-04-28T06:17:00Z, 2018-04-28T06:25:00Z, 2018-04-28T06:13:00Z]
[2018-04-28T07:13:00Z]
[2018-04-28T07:56:00Z, 2018-04-28T07:33:00Z]
0 голосов
/ 28 апреля 2018

Делает целочисленное деление времени эпохи на миллисекунды на 1800000 (30 минут в мс). Теперь это твой ключ; каждая единица - это отдельные 30 минут с 1970 г. 1 января 0:00 утра.

В частности, Mysql имеет UNIX_TIMESTAMP (временное поле), чтобы получить его в секундах, так что разделите на 1800 в вашем случае. Это означает, что вы можете выполнять групповые предложения и операторы where на стороне сервера, если это необходимо.

...