Создание пользовательского счетчика недель в Java? - PullRequest
0 голосов
/ 26 июля 2011

Я пытаюсь создать пользовательский счетчик недель, но у меня довольно много проблем, и я чувствую, что делаю все неправильно.Метод должен принимать строковую дату в формате гггг-мм-дд и возвращать номер недели.Счетчик недели начался 1 октября 2000 года. Неделя начинается в пятницу и заканчивается в четверг.Первые 2 цифры представляют годы, а вторые 2 представляют неделю.Таким образом, на этой неделе будет 1143 (11 - год и 43 - недели с 1 октября).

Вот что я получил до сих пор:

public static String get_week(String date){

    try{
        Calendar first_dt = Calendar.getInstance();
        first_dt.set(1999, 10, 01);
        long first_dt_milliseconds = first_dt.getTimeInMillis();

        DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
        Date format_date = (Date)formatter.parse(date);

        SimpleDateFormat month = new SimpleDateFormat("MM"); 
        SimpleDateFormat year = new SimpleDateFormat("yyyy");

        long drop_dt_milliseconds = format_date.getTime() - first_dt_milliseconds;
        long drop_dt_years = drop_dt_milliseconds / (24 * 60 * 60 * 1000) / 365;

        Calendar year_ago = Calendar.getInstance();
        year_ago.set(Integer.parseInt(year.format(format_date))-1, 10, 01);

        long year_ago_milliseconds = year_ago.getTimeInMillis();

        long year_ago_diff = format_date.getTime() - year_ago_milliseconds;
        year_ago_diff = year_ago_diff / (24 * 60 * 60 * 1000) / 7;

        if (month.format(format_date).equals("10") || month.format(format_date).equals("11") || month.format(format_date).equals("12")){
            date = drop_dt_years+1+""+year_ago_diff;
        }
        else{
            date = year_ago_diff;
        }
    }catch(Exception e){
        e.printStackTrace();
    }

    return date;
}

1 Ответ

1 голос
/ 26 июля 2011

Я использовал Joda-Time , потому что это менее запутанно, чем встроенный механизм даты и времени Java

РЕДАКТИРОВАТЬ - новый код, введенный по предложению ChssPly и исправивший проблему с неделями с 1 октября по 1 января. Также интересным может быть предложение X-Zero создать собственную хронологию в Joda-Time.

import org.joda.time.DateMidnight;
import org.joda.time.Weeks;
import org.joda.time.Years;

public class Main {

    private String getWeek (DateMidnight dt2) {
        DateMidnight dt = new DateMidnight(2000,10,1);

        // First get the number of elapsed years, ChssPly76's way
        int yearz = Years.yearsBetween(dt, dt2).getYears();
        /*
         * We now need the number of weeks in the current year, which can be
         * calculated using the Weeks class.
         */
        int yearOffset = 1;
        // But if the new date is Oct 1 thru Dec 12 year must remain the same
        if (!dt2.isBefore (new DateMidnight(dt2.getYear(),10,1))) {
            yearOffset = 0;
        }

        int weekz = Weeks.weeksBetween(dt.withYear(dt2.getYear()-yearOffset), dt2).getWeeks();
        return(yearz + " " + weekz);
    }

    private void test (DateMidnight testDate) {
        System.out.println("For date " + testDate + " years/weeks = " + getWeek(testDate));
    }

    private void run() {
        test (new DateMidnight());
        test (new DateMidnight(2010,10,8));
        test (new DateMidnight(2010,9,30));
        test (new DateMidnight(2000,10,1));
    }

    public static void main(String[] args) {
        new Main().run();
    }
}

Какие выходы

For date 2011-07-26T00:00:00.000+02:00 years/weeks = 10 42
For date 2010-10-08T00:00:00.000+02:00 years/weeks = 10 1
For date 2010-09-30T00:00:00.000+02:00 years/weeks = 9 52
For date 2000-10-01T00:00:00.000+02:00 years/weeks = 0 0

Возможно, более сложный возвращаемый объект был бы лучше ...

...