2014-08-21 3 views
-2

У меня были некоторые реальные проблемы с созданием метода для выполнения следующего: отметка времени unix и int, представляющая период времени для получения первой даты, и метод возвращает временную метку unix, представляющую первый день того времени. Метод я использую сейчас использует класс календарь выглядит следующим образом:Поиск первого дня кратного X лет

public static long firstTime(long in, int period){ 
    if(period == DAY_OF_FIVE_YEARS){ 
     period = Calendar.DAY_OF_YEAR; 
     in -= in%Vars.FIVE_YEARS; 
    } 
    cal.setTimeInMillis(in*1000L); 
    cal.set(period,cal.getActualMinimum(period)); 
    cal.set(Calendar.HOUR_OF_DAY, 0); 
    cal.set(Calendar.MINUTE, 0); 
    cal.set(Calendar.SECOND, 0); 
    return cal.getTimeInMillis()/1000L; 
} 

Однако иногда мне нужно, чтобы получить первый день пять лет. Например, я прохожу в дате в 1987 году, и я хочу, чтобы метод возвращался в первый день 1985 года. В первом случае это моя попытка, но это не работает, и мне интересно, есть ли проще. Обратите внимание, что DAY_OF_FIVE_YEARS - это некоторый int, который означает это, а Vars.FIVE_YEARS - это длинное число секунд в пять лет.

+0

Не пробовал этого, но как насчет того, если _после_ вы создали 'cal', то' года = cal.get (Calendar.YEAR); cal.roll (Calendar.YEAR, - (год% 5)); '? Я не самый большой эксперт «Календарь», поэтому я не знаю, правильно ли это, не пытаясь это сделать. Я предполагаю, что причина, по которой ваш метод не работает, объясняется високосными годами, так что количество секунд в пятилетний период не является постоянным. – ajb

+0

Сколько лет пять? –

+0

@ElliottFrisch Больше похоже на «даже пятилетний период» или что-то - «даже» не всегда означает делимый на 2. – ajb

ответ

1

Благодаря AJB, вот метод, который будет найти первую кратные несколько лет:

public static final int DAY_OF_FIVE_YEARS = 843521; //just any unused number 
    public static long firstTime(long in, int period){ 
     cal.setTimeInMillis(in*1000L); 
     if(period == DAY_OF_FIVE_YEARS){ 
      int year = cal.get(Calendar.YEAR); 
      cal.roll(Calendar.YEAR, -(year%5)); 
      period = Calendar.DAY_OF_YEAR; 
     } 
     cal.set(period,cal.getActualMinimum(period)); 
     cal.set(Calendar.HOUR_OF_DAY, 0); 
     cal.set(Calendar.MINUTE, 0); 
     cal.set(Calendar.SECOND, 0); 
     return cal.getTimeInMillis()/1000L; 
    } 
Смежные вопросы