2017-01-02 2 views
2

Это действительно сводит меня с ума. Код нижеJodaTime всегда будет сменяться до 2015 года, если с установленным временем года 2016

DateTime dt = new DateTime() 
    .withYear(2014) 
    .withWeekOfWeekyear(52) 
    .withDayOfWeek(1); 
DateTimeFormatter dateTimeFormatter = DateTimeFormat.forPattern("d MMM yyyy"); 
String firstDayOfWeek = dateTimeFormatter.print(dt); 
Log.v(FILE_NAME,"display date? " + firstDayOfWeek); 
dt = new DateTime() 
    .withYear(2015) 
    .withWeekOfWeekyear(52) 
    .withDayOfWeek(1); 
String lastDayOfWeek = dateTimeFormatter.print(dt); 
Log.v(FILE_NAME,"display date? " + lastDayOfWeek); 
dt = new DateTime() 
    .withYear(2016) 
    .withWeekOfWeekyear(52) 
    .withDayOfWeek(1); 
lastDayOfWeek = dateTimeFormatter.print(dt); 
Log.v(FILE_NAME,"display date? " + lastDayOfWeek); 

Как-то всегда выход:

display date? 22 Dec 2014 
display date? 21 Dec 2015 
display date? 21 Dec 2015 

Как вы можете видеть, дата последнего дисплей должен показывать 2016, а не 2015. Кажется, что каждый раз я поставил withYear в 2016 году, это будет Волшебное изменение до 2015 года. Является ли это ошибкой или я делаю что-то неправильно? Я много раз очищал и перестраивал проект, но результат тот же.

+0

Возможно, попробуйте назначить строку новой строке? Я вижу, что вы используете переменную lastDayOfWeek дважды ... может быть, проблема? – riggaroo

+0

@riggaroo спасибо. уже сделал это, но все равно то же самое – imin

ответ

4

Метод withYear(...) не делает то, что вы думаете, потому что он использует стандартный календарный год, а не год недели, как описано в документе ISO-8601. Пожалуйста, сравните следующие два фрагмента. Только второй один делает то, что вам нужно:

DateTime dt = new DateTime().withYear(2016).withWeekOfWeekyear(52).withDayOfWeek(1); 
System.out.println("joda=" + dt); // joda=2015-12-21T18:26:12.776+01:00 

DateTime dt2 = 
    new DateTime().withWeekyear(2016).withWeekOfWeekyear(52).withDayOfWeek(1); 
System.out.println("joda=" + dt2); // joda=2016-12-26T18:27:59.606+01:00 

Смотрите также documentation. Прекрасная разница между календарным и недельным годом заметна только в конце или начале года (например, сегодня).

Разъяснения подробно поведение:

При выборе new DateTime() на сегодняшний день, второго января 2017 года, а затем установить календарный год к 2016 году результаты в: 2016-01-02. Но эта дата находится в неделях 53 года, относящихся к недельному году 2015 года. Эта 53-я неделя начинается с 2015-12-28 годов, поэтому выражение withWeekOfWeekyear(52) вернется на одну неделю до 2015-12-21 (что вы наблюдаете в первом случае).

+0

Честно говоря, я не очень понимаю ваше объяснение, но ваш ответ работает, поэтому большое спасибо. В любом случае, какова причина, по которой кто-то будет использовать с этим? – imin

+0

@imin Извините, что не совсем понял. Я пробую еще раз: календарный год всегда с первого января по 31 декабря. Но недельный год (год-неделя) описывается в документе ISO как календарный диапазон, связанный с недельным циклом. Его начало всегда в понедельник и поэтому может отклоняться с первого января, в зависимости от того, будет ли в первую календарную неделю не менее 4 дней, что влияет на точное положение первой календарной недели (и недели по году) относительно календарного года. –

+1

@imin Метод 'withYear (...)' обычно является предпочтительным - до тех пор, пока вы работаете с месяцами и днями. Но если вы работаете с недельным и недельным (недельным), тогда и только тогда вы должны работать с 'withWeekyear()'. –

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