Группировка длинных UTC дат по дням - PullRequest
3 голосов
/ 24 марта 2009

Есть ли разумный способ группировки длинных UTC-дат по дням?

Я бы изменил их на 86400, но это не учитывает дополнительных секунд.

У кого-нибудь есть другие идеи, я использую java, чтобы я мог разобрать их в объекты Date, но меня немного беспокоит снижение производительности при использовании класса даты.

Кроме того, существует ли более эффективный способ, чем сравнение частей месяца и дня объекта Date?

Ответы [ 3 ]

3 голосов
/ 23 сентября 2011

Я бы модифицировал их на 86400, но это не учитывает дополнительных секунд ....

Я почти уверен, что это будет хорошо. Документация по API для Date на самом деле не должна включать ничего о високосных секундах, потому что дело в том, что она эмулирует стандартный тикер времени Unix, который НЕ включает в себя високосные секунды. Вместо этого он имеет 59-ю секунду, которая длится две секунды, возвращая значение тикера на 1 секунду в начале високосной секунды (как описано в ссылке в предыдущем посте).

Следовательно, вы можете предположить, что значение, полученное из Date.getTime() IS, составило только 86400 секунд. Если вам действительно нужно знать, была ли у определенного дня високосная секунда, в Интернете доступно несколько таблиц (с 1972 года их было только 23–24, а компьютерные даты до этого редко учитывали их) в любом случае).

Е.И.В.

Winston

3 голосов
/ 24 марта 2009

Ваши исходные данные определенно включают в себя дополнительные секунды для начала? Некоторые API это делают, а некоторые нет - Joda Time (который я рекомендовал бы вместо встроенных API даты / времени) не использует, например, високосные секунды . API даты и времени Java «иногда» делают - они поддерживают 60 и 61 как значения «секунда в минуту», но поддержка зависит от операционной системы (см. Ниже). Если у вас есть хорошие примерные значения, я бы сначала проверил это на вашем месте. Очевидно, что просто деление гораздо проще, чем что-либо еще.

Если вам нужно создать Date объектов (или DateTime в Joda), я бы проверил его, прежде чем делать что-либо еще. Вы можете обнаружить, что производительность на самом деле совершенно адекватна. Нет смысла тратить время на оптимизацию чего-то подходящего для ваших данных. Конечно, вам нужно решить, какой объем данных вы должны поддерживать, и как быстро он должен быть первым:)

Даже поддержка java.util.Date для високосных секунд несколько неопределенна. С Документы :

Хотя класс Date предназначен для отражать согласованное универсальное время (UTC), это может быть не совсем так, в зависимости от среды хоста виртуальная машина Java. Почти все современные операционные системы предполагают, что 1 день = 24 × 60 × 60 = 86400 секунд в все дела. В UTC, однако, примерно один раз каждый год или два во-вторых, называется «високосным». дополнительная секунда всегда добавляется как последняя секунда дня и всегда включена 31 декабря или 30 июня. Например, последняя минута 1995 года была 61 секунда, благодаря добавленному прыжок второй Большинство компьютерных часов недостаточно точен, чтобы иметь возможность отразить разницу между високосными секундами.

Есть довольно хороший пост в блоге о путанице с Java и дополнительными секундами, которые вы, возможно, захотите прочитать.

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

ТЛ; др

Instant.ofEpochSecond( 1_493_367_302L )            // Convert a count of whole seconds from epoch of 1970 into a date-time value in UTC.
       .atZone( ZoneId.of( "Pacific/Auckland" ) )  // Adjust into the time zone as a context for determining a date.
       .toLocalDate()                              // Extract a date-only value by which we can sort/collect/organize our date-time values.

Часовой пояс

Класс java.util.Date представляет момент на временной шкале в UTC. Таким образом, запрос даты назначает дату, которая имеет смысл только в UTC. В тот же момент может быть дата раньше в Квебеке или дата позже в Окленде, Новая Зеландия.

Часовой пояс имеет решающее значение при определении даты, и ваш Вопрос игнорирует эту проблему.

Использование java.time

Класс java.util.Date является частью проблемных старых классов даты и времени, которые теперь унаследованы, заменены классами java.time.

Что касается високосных секунд, как предлагали другие Ответы, большинство источников отсчета с эпохи не подсчитывают високосные секунды. Так что проверьте свой источник.

Если у вас есть количество полных секунд от эпохи 1970-01-01T00:00:00, используйте статический метод для создания объекта Instant.

Instant instant = Instant.ofEpochSecond( 1_493_367_302L ) ;

instant.toString (): 2017-04-28T08: 15: 02Z

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

Укажите собственное имя часового пояса в формате continent/region, например America/Montreal, Africa/Casablanca или Pacific/Auckland. Никогда не используйте 3-4-буквенное сокращение, такое как EST или IST, так как они не истинные часовые пояса, не стандартизированы и даже не уникальны (!).

ZoneId z = ZoneId.of( "America/Montreal" ); 
ZonedDateTime zdt = instant.atZone( z );

zdt.toString (): 2017-04-28T01: 15: 02-07: 00 [America / Los_Angeles]

С кучей этих ZonedDateDate объектов вы можете сравнить по дате. Вы можете извлечь LocalDate объект. Класс LocalDate представляет значение только для даты без времени суток и без часового пояса.

LocalDate ld = zdt.toLocalDate();

ld.toString (): 2017-04-28

Таким образом, вы можете создать Map с LocalDate в качестве ключа и List или Set из ZonedDateTime объектов в качестве значения. А с современным лямбда-синтаксисом вы можете использовать Streams для этого отображения.


О java.time

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

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

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

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

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

...