Java 8: получить номер недели с эпохи

Учитывая LocalDate, я хочу преобразовать в номер недели с эпохи

Один из способов сделать это:

LocalDate date = datePicker.getValue(); // input from your date picker
Locale locale = Locale.US;
int weekOfYear = date.get(WeekFields.of(locale).weekOfWeekBasedYear());

And X = find weeks since Epoch to prevYear

And then result = X + weekOfYear

Хотя каким-то образом мы можем узнать «номер недели с эпохи», есть ли чистое решение, чтобы найти его с помощью Java 8?

ОБНОВЛЕНИЕ: даже вышеприведенное решение не будет работать, так как одна неделя (всегда начиная с воскресенья) может длиться два года.


person Community    schedule 16.08.2016    source источник
comment
Я могу что-то упустить, но разве это не ChronoUnit.WEEKS.between(LocalDate.ofEpochDay(0), localDate)?   -  person Tunaki    schedule 17.08.2016


Ответы (2)


Я превращаю комментарий Тунаки в ответ.

tl;dr

ChronoUnit.WEEKS.between ( 
    LocalDate.ofEpochDay ( 0 ) , 
    LocalDate.now( ZoneOffset.UTC ) 
)

LocalDate

Класс LocalDate представляет значение без времени суток и без часового пояса.

Часовой пояс имеет решающее значение при определении даты. В любой момент дата варьируется по всему земному шару в зависимости от зоны. Например, через несколько минут после полуночи в Париже, Франция — это новый день, а в Монреале, Квебеке — все еще «вчера».

Здесь мы используем UTC в качестве часового пояса для сегодняшней даты в соответствии с эпохой, определенной в UTC.

LocalDate today = LocalDate.now( ZoneOffset.UTC );

ChronoUnit

Класс ChronoUnit имеет методы подсчета прошедшего количества лет, месяцев, недель и т.п. Для недель это просто берет количество дней и делится на 7. Таким образом, первый день недели не имеет значения. Не уверен, что это соответствует вашим потребностям или нет, поскольку вопрос расплывчатый.

LocalDate today = LocalDate.now ( ZoneOffset.UTC );  // Using UTC to match the definition of the Java epoch.
LocalDate epoch = LocalDate.ofEpochDay ( 0 );

long weeks = ChronoUnit.WEEKS.between ( epoch , today );

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

System.out.println ( "epoch: " + epoch + " | today in UTC: " + today + " | weeks: " + weeks );

эпоха: 1970-01-01 | сегодня в UTC: 2016-08-29 | недели: 2434

Вы можете настроить дату начала на определенный день недели, если это имеет смысл для ваших нужд. Я не уверен, подходит ли это, потому что вопрос не ясен.

LocalDate epoch = LocalDate.ofEpochDay ( 0 );
LocalDate start = epoch.with ( TemporalAdjusters.nextOrSame ( DayOfWeek.SUNDAY ) ); // Get the first Sunday that *is* the epoch or *follows* the epoch.
long weeks = ChronoUnit.WEEKS.between ( start , today );

О java.time

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

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

Чтобы узнать больше, см. Учебное пособие по Oracle. И поищите множество примеров и пояснений в Stack Overflow. Спецификация: JSR 310.

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

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

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

person Basil Bourque    schedule 29.08.2016

Там есть метод для миллисекунд с эпохи для Date:

long timeInMillis = date.getTime();

и, по-видимому, в неделе 604800000 миллисекунд. Так что я думаю, вы могли бы пойти

long weeksSinceEpoch = date.getTime() / 604800000;

Я думаю, что вам, вероятно, действительно нужно добавить 1 к вашему окончательному значению, поскольку Java усекает longs.

person Lord Farquaad    schedule 16.08.2016