2016-08-16 1 views
1

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

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

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?

UPDATE: Даже выше решение не будет работать в течение одной недели (всегда начиная с воскресенья) может охватывать через два года

+3

Я может быть что-то не хватает, но это не так просто 'ChronoUnit.WEEKS.between (LocalDate.ofEpochDay (0), LocalDate)'? – Tunaki

ответ

3

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

TL; др

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); 
2

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

long timeInMillis = date.getTime(); 

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

long weeksSinceEpoch = date.getTime()/604800000; 

Я думаю, что вы, вероятно, на самом деле нужно добавить 1 до конечного значения, хотя, так как Java обрезает long с.

Смежные вопросы